[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 6/8] mm: Keep heap accessible to others while scrubbing
>>> On 19.05.17 at 17:50, <boris.ostrovsky@xxxxxxxxxx> wrote: > @@ -1090,24 +1131,51 @@ bool scrub_free_pages(void) > do { > while ( !page_list_empty(&heap(node, zone, order)) ) > { > - unsigned int i; > + unsigned int i, dirty_cnt; > + struct scrub_wait_state st; > > /* Unscrubbed pages are always at the end of the list. */ > pg = page_list_last(&heap(node, zone, order)); > if ( pg->u.free.first_dirty == INVALID_DIRTY_IDX ) > break; > > + ASSERT(!pg->u.free.scrub_state); > + pg->u.free.scrub_state = PAGE_SCRUBBING; > + > + spin_unlock(&heap_lock); > + > + dirty_cnt = 0; > for ( i = pg->u.free.first_dirty; i < (1U << order); i++) > { > cnt++; > if ( test_bit(_PGC_need_scrub, &pg[i].count_info) ) > { > scrub_one_page(&pg[i]); > + /* > + * We can modify count_info without holding heap > + * lock since we effectively locked this buddy by > + * setting its scrub_state. > + */ > pg[i].count_info &= ~PGC_need_scrub; > - node_need_scrub[node]--; > + dirty_cnt++; > cnt += 100; /* scrubbed pages add heavier weight. */ > } > > + if ( pg->u.free.scrub_state & PAGE_SCRUB_ABORT ) > + { > + /* Someone wants this chunk. Drop everything. */ > + > + pg->u.free.first_dirty = (i == (1U << order)) ? Similar like for the earlier patch, this condition is always false (do to the condition in the loop header) afaict, and ... > + INVALID_DIRTY_IDX : i + 1; ... you'd again risk storing 1U << order into first_dirty here. > @@ -1121,6 +1189,17 @@ bool scrub_free_pages(void) > } > } > > + st.pg = pg; > + st.first_dirty = (i == (1UL << order)) ? > + INVALID_DIRTY_IDX : i + 1; Same here then. > + st.drop = false; > + spin_lock_cb(&heap_lock, scrub_continue, &st); > + > + node_need_scrub[node] -= dirty_cnt; > + > + if ( st.drop ) > + goto out; > + > if ( i == (1U << order) ) > { > page_list_del(pg, &heap(node, zone, order)); > @@ -1128,7 +1207,9 @@ bool scrub_free_pages(void) > } > else > pg->u.free.first_dirty = i + 1; > - > + Please avoid adding the trailing blank in the first place (in the earlier patch). > @@ -1175,6 +1258,8 @@ static void free_heap_pages( > if ( page_state_is(&pg[i], offlined) ) > tainted = 1; > > + pg[i].u.free.scrub_state = 0; Is this really needed for every page in the buddy? Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |