NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: kern/56764



The following reply was made to PR kern/56764; it has been noted by GNATS.

From: Thomas Klausner <wiz%netbsd.org@localhost>
To: gnats-bugs%netbsd.org@localhost
Cc: 
Subject: Re: kern/56764
Date: Sat, 21 Feb 2026 17:23:25 +0100

 --blvg5djcc6d5falj
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
 
 The first diff causes a 'locking against myself' error in
 uvm_aio_aiodone_pages, so I removed the lock access in uvm_pager.c and
 am trying this version now.
  Thomas
 
 --blvg5djcc6d5falj
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: attachment; filename="uvm.2.diff"
 
 Index: uvm_km.c
 ===================================================================
 RCS file: /cvsroot/src/sys/uvm/uvm_km.c,v
 retrieving revision 1.166
 diff -u -r1.166 uvm_km.c
 --- uvm_km.c	7 Dec 2024 23:19:07 -0000	1.166
 +++ uvm_km.c	21 Feb 2026 16:21:45 -0000
 @@ -491,8 +491,10 @@
  	rw_exit(uobj->vmobjlock);
  
  	if (swpgonlydelta > 0) {
 +		mutex_enter(&uvm_swap_data_lock);
  		KASSERT(uvmexp.swpgonly >= swpgonlydelta);
  		atomic_add_int(&uvmexp.swpgonly, -swpgonlydelta);
 +		mutex_exit(&uvm_swap_data_lock);
  	}
  }
  
 Index: uvm_pager.c
 ===================================================================
 RCS file: /cvsroot/src/sys/uvm/uvm_pager.c,v
 retrieving revision 1.131
 diff -u -r1.131 uvm_pager.c
 --- uvm_pager.c	15 Mar 2024 07:09:37 -0000	1.131
 +++ uvm_pager.c	21 Feb 2026 16:21:45 -0000
 @@ -483,6 +483,9 @@
  
  		/* these pages are now only in swap. */
  		if (error != ENOMEM) {
 +			KASSERTMSG(uvmexp.swpginuse >= uvmexp.swpgonly + npages,
 +				   "swpginuse %d swpgonly %d npages %d",
 +				   uvmexp.swpginuse, uvmexp.swpgonly, npages);
  			atomic_add_int(&uvmexp.swpgonly, npages);
  		}
  		if (error) {
 Index: uvm_pdaemon.c
 ===================================================================
 RCS file: /cvsroot/src/sys/uvm/uvm_pdaemon.c,v
 retrieving revision 1.135
 diff -u -r1.135 uvm_pdaemon.c
 --- uvm_pdaemon.c	4 Jan 2026 00:41:14 -0000	1.135
 +++ uvm_pdaemon.c	21 Feb 2026 16:21:45 -0000
 @@ -792,10 +792,12 @@
  			}
  			if (slot > 0) {
  				/* this page is now only in swap. */
 +				mutex_enter(&uvm_swap_data_lock);
  				KASSERTMSG(uvmexp.swpgonly < uvmexp.swpginuse,
  					   "swpgonly %d swpginuse %d",
  					   uvmexp.swpgonly, uvmexp.swpginuse);
  				atomic_inc_uint(&uvmexp.swpgonly);
 +				mutex_exit(&uvm_swap_data_lock);
  			}
  			rw_exit(slock);
  			continue;
 Index: uvm_swap.c
 ===================================================================
 RCS file: /cvsroot/src/sys/uvm/uvm_swap.c,v
 retrieving revision 1.215
 diff -u -r1.215 uvm_swap.c
 --- uvm_swap.c	13 Feb 2026 19:16:41 -0000	1.215
 +++ uvm_swap.c	21 Feb 2026 16:21:45 -0000
 @@ -201,7 +201,7 @@
  static struct swap_priority swap_priority;
  
  /* locks */
 -static kmutex_t uvm_swap_data_lock __cacheline_aligned;
 +kmutex_t uvm_swap_data_lock __cacheline_aligned;
  static krwlock_t swap_syscall_lock;
  bool uvm_swap_init_done = false;
  
 @@ -1246,6 +1246,9 @@
  	KASSERTMSG(uvmexp.swpginuse >= sdp->swd_npgbad,
  		   "swpginuse %d sdp->swd_npgbad %d",
  		   uvmexp.swpginuse, sdp->swd_npgbad);
 +	KASSERTMSG(uvmexp.swpginuse >= uvmexp.swpgonly + sdp->swd_npgbad,
 +		   "swpginuse %d swpgonly %d sdp->swd_npgbad %d",
 +		   uvmexp.swpginuse, uvmexp.swpgonly, sdp->swd_npgbad);
  	uvmexp.swpginuse -= sdp->swd_npgbad;
  
  	if (swaplist_find(sdp->swd_vp, true) == NULL)
 @@ -1932,6 +1935,9 @@
  	sdp->swd_npginuse -= nslots;
  	KASSERTMSG(uvmexp.swpginuse >= nslots, "swpginuse %d nslots %d",
  		   uvmexp.swpginuse, nslots);
 +	KASSERTMSG(uvmexp.swpginuse >= uvmexp.swpgonly + nslots,
 +		   "swpginuse %d swpgonly %d nslots %d",
 +		   uvmexp.swpginuse, uvmexp.swpgonly, nslots);
  	uvmexp.swpginuse -= nslots;
  	mutex_exit(&uvm_swap_data_lock);
  }
 @@ -1977,8 +1983,10 @@
  		 * this page is no longer only in swap.
  		 */
  
 +		mutex_enter(&uvm_swap_data_lock);
  		KASSERT(uvmexp.swpgonly > 0);
  		atomic_dec_uint(&uvmexp.swpgonly);
 +		mutex_exit(&uvm_swap_data_lock);
  	}
  	return error;
  }
 Index: uvm_swap.h
 ===================================================================
 RCS file: /cvsroot/src/sys/uvm/uvm_swap.h,v
 retrieving revision 1.29
 diff -u -r1.29 uvm_swap.h
 --- uvm_swap.h	15 Mar 2024 22:15:21 -0000	1.29
 +++ uvm_swap.h	21 Feb 2026 16:21:45 -0000
 @@ -56,6 +56,7 @@
  int	uvm_swap_stats(char *, int,
      void (*)(void *, const struct swapent *), size_t, register_t *);
  
 +extern kmutex_t uvm_swap_data_lock;
  #else /* defined(VMSWAP) */
  
  #define	uvm_swapisfull()	true
 
 --blvg5djcc6d5falj--
 


Home | Main Index | Thread Index | Old Index