|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 7/9] mm: Keep pages available for allocation while scrubbing
>>> On 03.04.17 at 18:50, <boris.ostrovsky@xxxxxxxxxx> wrote:
> Instead of scrubbing pages while holding heap lock we can mark
> buddy's head as being scrubbed and drop the lock temporarily.
> If someone (most likely alloc_heap_pages()) tries to access
> this chunk it will signal the scrubber to abort scrub by setting
> head's PAGE_SCRUB_ABORT bit. The scrubber checks this bit after
> processing each page and stops its work as soon as it sees it.
So if the scrubber managed to handle all but one page of, say, a
1Gb buddy, you'd re-do all of it synchronously? One more argument
to track dirty/scrubbed state per page instead of per buddy, I think.
> --- a/xen/common/page_alloc.c
> +++ b/xen/common/page_alloc.c
> @@ -699,6 +699,18 @@ static void page_list_add_scrub(struct page_info *pg,
> unsigned int node,
> page_list_add(pg, &heap(node, zone, order));
> }
>
> +static void check_and_stop_scrub(struct page_info *head)
> +{
> + if ( head->u.free.scrub_state & PAGE_SCRUBBING )
> + {
> + head->u.free.scrub_state |= PAGE_SCRUB_ABORT;
> + smp_mb();
> + spin_lock_kick();
I think the barrier would better be in the kicking construct than
explicit here.
> @@ -785,10 +797,15 @@ static struct page_info *alloc_heap_pages(
> {
> if ( (pg = page_list_remove_head(&heap(node, zone, j))) )
> {
> - if ( (order == 0) || use_unscrubbed ||
> - !test_bit(_PGC_need_scrub, &pg->count_info) )
> + if ( !test_bit(_PGC_need_scrub, &pg[0].count_info) )
Any reason to change from -> to [0]. here?
> @@ -1074,12 +1096,34 @@ static unsigned int node_to_scrub(bool_t get_node)
> }
>
> #define SCRUB_CHUNK_ORDER 8
> +
> +struct scrub_wait_state {
> + struct page_info *pg;
> + bool_t drop;
> +};
> +
> +static void scrub_continue(void *data)
> +{
> + struct scrub_wait_state *st = (struct scrub_wait_state *)data;
Pointless cast.
> @@ -1203,6 +1271,8 @@ static void free_heap_pages(
> if ( page_state_is(&pg[i], offlined) )
> tainted = 1;
>
> + pg[i].u.free.scrub_state=0;
Style.
> --- a/xen/include/asm-arm/mm.h
> +++ b/xen/include/asm-arm/mm.h
> @@ -35,6 +35,10 @@ struct page_info
> } inuse;
> /* Page is on a free list: ((count_info & PGC_count_mask) == 0). */
> struct {
> +#define PAGE_SCRUBBING (1<<1)
> +#define PAGE_SCRUB_ABORT (1<<2)
Any reason not to start from bit 0? I'm also not sure boolean flags
are the ideal solution here: You really only have three states afaict
(none, scrubbing, abort).
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |