> Date: Mon, 17 May 2021 12:32:02 +0200
> From: Martin Pieuchot <[email protected]>
>
> Diff below makes use of uao_dropswap_range() in uao_free() instead of
> duplicating it. This function has been imported from NetBSD along with
> TMPFS. I'd like to use it to reduce the difference with their tree and
> reduce the size of my upcoming `vmobjlock' diff.
>
> ok?
ok kettenis@
> Index: uvm/uvm_aobj.c
> ===================================================================
> RCS file: /cvs/src/sys/uvm/uvm_aobj.c,v
> retrieving revision 1.95
> diff -u -p -r1.95 uvm_aobj.c
> --- uvm/uvm_aobj.c 22 Apr 2021 11:54:32 -0000 1.95
> +++ uvm/uvm_aobj.c 11 May 2021 11:26:15 -0000
> @@ -351,58 +351,16 @@ uao_set_swslot(struct uvm_object *uobj,
> static void
> uao_free(struct uvm_aobj *aobj)
> {
> + struct uvm_object *uobj = &aobj->u_obj;
>
> - if (UAO_USES_SWHASH(aobj)) {
> - int i, hashbuckets = aobj->u_swhashmask + 1;
> + uao_dropswap_range(uobj, 0, 0);
>
> + if (UAO_USES_SWHASH(aobj)) {
> /*
> - * free the swslots from each hash bucket,
> - * then the hash bucket, and finally the hash table itself.
> + * free the hash table itself.
> */
> - for (i = 0; i < hashbuckets; i++) {
> - struct uao_swhash_elt *elt, *next;
> -
> - for (elt = LIST_FIRST(&aobj->u_swhash[i]);
> - elt != NULL;
> - elt = next) {
> - int j;
> -
> - for (j = 0; j < UAO_SWHASH_CLUSTER_SIZE; j++) {
> - int slot = elt->slots[j];
> -
> - if (slot == 0) {
> - continue;
> - }
> - uvm_swap_free(slot, 1);
> - /*
> - * this page is no longer
> - * only in swap.
> - */
> - atomic_dec_int(&uvmexp.swpgonly);
> - }
> -
> - next = LIST_NEXT(elt, list);
> - pool_put(&uao_swhash_elt_pool, elt);
> - }
> - }
> -
> hashfree(aobj->u_swhash, UAO_SWHASH_BUCKETS(aobj->u_pages),
> M_UVMAOBJ);
> } else {
> - int i;
> -
> - /*
> - * free the array
> - */
> - for (i = 0; i < aobj->u_pages; i++) {
> - int slot = aobj->u_swslots[i];
> -
> - if (slot) {
> - uvm_swap_free(slot, 1);
> -
> - /* this page is no longer only in swap. */
> - atomic_dec_int(&uvmexp.swpgonly);
> - }
> - }
> free(aobj->u_swslots, M_UVMAOBJ, aobj->u_pages * sizeof(int));
> }
>
> @@ -1487,9 +1445,6 @@ uao_pagein_page(struct uvm_aobj *aobj, i
> }
>
> /*
> - * XXX pedro: Once we are comfortable enough with this function, we can adapt
> - * uao_free() to use it.
> - *
> * uao_dropswap_range: drop swapslots in the range.
> *
> * => aobj must be locked and is returned locked.
>
>