On 05/05/22(Thu) 14:54, Martin Pieuchot wrote:
> Diff below introduces a new wrapper to manipulate active/inactive page
> queues.
>
> ok?
Anyone?
> Index: uvm/uvm_page.c
> ===================================================================
> RCS file: /cvs/src/sys/uvm/uvm_page.c,v
> retrieving revision 1.165
> diff -u -p -r1.165 uvm_page.c
> --- uvm/uvm_page.c 4 May 2022 14:58:26 -0000 1.165
> +++ uvm/uvm_page.c 5 May 2022 12:49:13 -0000
> @@ -987,16 +987,7 @@ uvm_pageclean(struct vm_page *pg)
> /*
> * now remove the page from the queues
> */
> - if (pg->pg_flags & PQ_ACTIVE) {
> - TAILQ_REMOVE(&uvm.page_active, pg, pageq);
> - flags_to_clear |= PQ_ACTIVE;
> - uvmexp.active--;
> - }
> - if (pg->pg_flags & PQ_INACTIVE) {
> - TAILQ_REMOVE(&uvm.page_inactive, pg, pageq);
> - flags_to_clear |= PQ_INACTIVE;
> - uvmexp.inactive--;
> - }
> + uvm_pagedequeue(pg);
>
> /*
> * if the page was wired, unwire it now.
> @@ -1243,16 +1234,7 @@ uvm_pagewire(struct vm_page *pg)
> MUTEX_ASSERT_LOCKED(&uvm.pageqlock);
>
> if (pg->wire_count == 0) {
> - if (pg->pg_flags & PQ_ACTIVE) {
> - TAILQ_REMOVE(&uvm.page_active, pg, pageq);
> - atomic_clearbits_int(&pg->pg_flags, PQ_ACTIVE);
> - uvmexp.active--;
> - }
> - if (pg->pg_flags & PQ_INACTIVE) {
> - TAILQ_REMOVE(&uvm.page_inactive, pg, pageq);
> - atomic_clearbits_int(&pg->pg_flags, PQ_INACTIVE);
> - uvmexp.inactive--;
> - }
> + uvm_pagedequeue(pg);
> uvmexp.wired++;
> }
> pg->wire_count++;
> @@ -1324,28 +1306,32 @@ uvm_pageactivate(struct vm_page *pg)
> KASSERT(uvm_page_owner_locked_p(pg));
> MUTEX_ASSERT_LOCKED(&uvm.pageqlock);
>
> + uvm_pagedequeue(pg);
> + if (pg->wire_count == 0) {
> + TAILQ_INSERT_TAIL(&uvm.page_active, pg, pageq);
> + atomic_setbits_int(&pg->pg_flags, PQ_ACTIVE);
> + uvmexp.active++;
> +
> + }
> +}
> +
> +/*
> + * uvm_pagedequeue: remove a page from any paging queue
> + */
> +void
> +uvm_pagedequeue(struct vm_page *pg)
> +{
> + if (pg->pg_flags & PQ_ACTIVE) {
> + TAILQ_REMOVE(&uvm.page_active, pg, pageq);
> + atomic_clearbits_int(&pg->pg_flags, PQ_ACTIVE);
> + uvmexp.active--;
> + }
> if (pg->pg_flags & PQ_INACTIVE) {
> TAILQ_REMOVE(&uvm.page_inactive, pg, pageq);
> atomic_clearbits_int(&pg->pg_flags, PQ_INACTIVE);
> uvmexp.inactive--;
> }
> - if (pg->wire_count == 0) {
> - /*
> - * if page is already active, remove it from list so we
> - * can put it at tail. if it wasn't active, then mark
> - * it active and bump active count
> - */
> - if (pg->pg_flags & PQ_ACTIVE)
> - TAILQ_REMOVE(&uvm.page_active, pg, pageq);
> - else {
> - atomic_setbits_int(&pg->pg_flags, PQ_ACTIVE);
> - uvmexp.active++;
> - }
> -
> - TAILQ_INSERT_TAIL(&uvm.page_active, pg, pageq);
> - }
> }
> -
> /*
> * uvm_pagezero: zero fill a page
> */
> Index: uvm/uvm_page.h
> ===================================================================
> RCS file: /cvs/src/sys/uvm/uvm_page.h,v
> retrieving revision 1.67
> diff -u -p -r1.67 uvm_page.h
> --- uvm/uvm_page.h 29 Jan 2022 06:25:33 -0000 1.67
> +++ uvm/uvm_page.h 5 May 2022 12:49:13 -0000
> @@ -224,6 +224,7 @@ boolean_t uvm_page_physget(paddr_t *);
> #endif
>
> void uvm_pageactivate(struct vm_page *);
> +void uvm_pagedequeue(struct vm_page *);
> vaddr_t uvm_pageboot_alloc(vsize_t);
> void uvm_pagecopy(struct vm_page *, struct vm_page *);
> void uvm_pagedeactivate(struct vm_page *);
>