[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v5 6/8] mm: Keep heap accessible to others while scrubbing
>>> Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> 06/22/17 8:56 PM >>> > Changes in v5: > * Fixed off-by-one error in setting first_dirty > * Changed struct page_info.u.free to a union to permit use of ACCESS_ONCE in > check_and_stop_scrub() I don't see the need for this: > +static void check_and_stop_scrub(struct page_info *head) > +{ > + if ( head->u.free.scrub_state == BUDDY_SCRUBBING ) > + { > + struct page_info pg; > + > + head->u.free.scrub_state = BUDDY_SCRUB_ABORT; > + spin_lock_kick(); > + for ( ; ; ) > + { > + /* Can't ACCESS_ONCE() a bitfield. */ > + pg.u.free.val = ACCESS_ONCE(head->u.free.val); Something like ACCESS_ONCE(head->u.free).val ought to work (or read_atomic(), due to the questionable scalar type check in ACCESS_ONCE()). > @@ -1106,25 +1155,53 @@ 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); Please use BUDDY_NOT_SCRUBBING here. > @@ -1138,6 +1215,17 @@ bool scrub_free_pages(void) > } > } > > + st.pg = pg; > + st.first_dirty = (i >= (1UL << order) - 1) ? > + INVALID_DIRTY_IDX : i + 1; Would you mind explaining to me (again?) why you can't set pg's first_dirty directly here? In case I'm not mistaken and this has been asked before, maybe this is a hint that a comment might be warranted. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |