svn commit: r266850 - in head/sys/arm/xscale: i80321 i8134x ixp425 pxa
Alan Cox
alc at rice.edu
Tue Jun 10 16:22:22 UTC 2014
On 06/09/2014 17:17, John-Mark Gurney wrote:
> Warner Losh wrote this message on Mon, Jun 09, 2014 at 14:08 -0600:
>> On Jun 9, 2014, at 1:23 PM, Alan Cox <alc at rice.edu> wrote:
>>
>>> On Jun 9, 2014, at 12:44 PM, John-Mark Gurney wrote:
>>>
>>>> Alan Cox wrote this message on Mon, Jun 09, 2014 at 11:56 -0500:
>>>>> I made a mistake with the new KASSERT()s in vm_reserv_break(). Try this.
>>>> No worried, the new patch panics:
>>>> panic: vm_reserv_break: 2 saved_object=0xc06e6378 x=253 m_tmp->object=0xc06e6378 (1)
>>>>
>>>
>>> Is your arm processor running in big-endian or little-endian mode?
>> Big Endian.
> Specificly, TARGET_ARCH=armeb... So, ARMv4 in big-endian mode...
>
Please try the attached patch.
-------------- next part --------------
Index: vm/vm_phys.c
===================================================================
--- vm/vm_phys.c (revision 267282)
+++ vm/vm_phys.c (working copy)
@@ -693,9 +693,16 @@ vm_phys_free_pages(vm_page_t m, int order)
void
vm_phys_free_contig(vm_page_t m, u_long npages)
{
+ vm_page_t m_tmp;
u_int n;
int order;
+ for (m_tmp = m; m_tmp < &m[npages]; m_tmp++)
+ KASSERT(m_tmp->object == NULL ||
+ (m_tmp->flags & PG_CACHED) != 0,
+ ("vm_phys_free_contig: start %p %td %lu",
+ m, m_tmp - m, npages));
+
/*
* Avoid unnecessary coalescing by freeing the pages in the largest
* possible power-of-two-sized subsets.
@@ -714,6 +721,11 @@ vm_phys_free_contig(vm_page_t m, u_long npages)
n = 1 << order;
if (npages < n)
break;
+ for (m_tmp = m; m_tmp < &m[n]; m_tmp++)
+ KASSERT(m_tmp->object == NULL ||
+ (m_tmp->flags & PG_CACHED) != 0,
+ ("vm_phys_free_contig: xxx %p %td %u",
+ m, m_tmp - m, n));
vm_phys_free_pages(m, order);
m += n;
}
@@ -721,6 +733,11 @@ vm_phys_free_contig(vm_page_t m, u_long npages)
for (; npages > 0; npages -= n) {
order = flsl(npages) - 1;
n = 1 << order;
+ for (m_tmp = m; m_tmp < &m[n]; m_tmp++)
+ KASSERT(m_tmp->object == NULL ||
+ (m_tmp->flags & PG_CACHED) != 0,
+ ("vm_phys_free_contig: yyy %p %td %u",
+ m, m_tmp - m, n));
vm_phys_free_pages(m, order);
m += n;
}
Index: vm/vm_reserv.c
===================================================================
--- vm/vm_reserv.c (revision 267282)
+++ vm/vm_reserv.c (working copy)
@@ -108,6 +108,18 @@ typedef u_long popmap_t;
#define NPOPMAP howmany(VM_LEVEL_0_NPAGES, NBPOPMAP)
/*
+ * XXX
+ */
+#undef setbit
+#define setbit(a,i) ((a)[(i) / NBPOPMAP] |= 1UL << ((i) % NBPOPMAP))
+#undef clrbit
+#define clrbit(a,i) ((a)[(i) / NBPOPMAP] &= ~(1UL << ((i) % NBPOPMAP)))
+#undef isset
+#define isset(a,i) ((a)[(i) / NBPOPMAP] & (1UL << ((i) % NBPOPMAP)))
+#undef isclr
+#define isclr(a,i) (((a)[(i) / NBPOPMAP] & (1UL << ((i) % NBPOPMAP))) == 0)
+
+/*
* The reservation structure
*
* A reservation structure is constructed whenever a large physical page is
@@ -646,7 +658,8 @@ found:
static void
vm_reserv_break(vm_reserv_t rv, vm_page_t m)
{
- int begin_zeroes, hi, i, lo;
+ int begin_zeroes, hi, i, lo, x;
+ vm_object_t saved_object;
mtx_assert(&vm_page_queue_free_mtx, MA_OWNED);
KASSERT(rv->object != NULL,
@@ -653,6 +666,7 @@ vm_reserv_break(vm_reserv_t rv, vm_page_t m)
("vm_reserv_break: reserv %p is free", rv));
KASSERT(!rv->inpartpopq,
("vm_reserv_break: reserv %p's inpartpopq is TRUE", rv));
+ saved_object = rv->object;
LIST_REMOVE(rv, objq);
rv->object = NULL;
if (m != NULL) {
@@ -703,6 +717,19 @@ vm_reserv_break(vm_reserv_t rv, vm_page_t m)
if (i != NPOPMAP)
/* Convert from ffsl() to ordinary bit numbering. */
hi--;
+ for (x = begin_zeroes; x < NBPOPMAP * i + hi; x++) {
+ vm_page_t m_tmp = &rv->pages[x];
+ KASSERT(isclr(rv->popmap, x),
+ ("vm_reserv_break: 1 saved_object=%p x=%d m_tmp->object=%p (%d)",
+ saved_object, x, m_tmp->object, m_tmp->object == kmem_object));
+ }
+ for (x = begin_zeroes; x < NBPOPMAP * i + hi; x++) {
+ vm_page_t m_tmp = &rv->pages[x];
+ KASSERT(m_tmp->object == NULL ||
+ (m_tmp->flags & PG_CACHED) != 0,
+ ("vm_reserv_break: 2 saved_object=%p x=%d m_tmp->object=%p (%d)",
+ saved_object, x, m_tmp->object, m_tmp->object == kmem_object));
+ }
vm_phys_free_contig(&rv->pages[begin_zeroes], NBPOPMAP * i +
hi - begin_zeroes);
} while (i < NPOPMAP);
More information about the freebsd-arm
mailing list