NetBSD-Bugs archive

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

PR/59996 CVS commit: src/sbin/swapctl



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

From: "Robert Elz" <kre%netbsd.org@localhost>
To: gnats-bugs%gnats.NetBSD.org@localhost
Cc: 
Subject: PR/59996 CVS commit: src/sbin/swapctl
Date: Mon, 16 Feb 2026 20:35:30 +0000

 Module Name:	src
 Committed By:	kre
 Date:		Mon Feb 16 20:35:30 UTC 2026
 
 Modified Files:
 	src/sbin/swapctl: swaplist.c
 
 Log Message:
 PR bin/59996  No more "SWAP_STATS different to SWAP_NSWAP"
 
 That the kernel data structs might have changed between one
 system call and another, later one, does not warrant a warning.
 
 In this case this can happen if a swap device is removed from the
 system while swapctl(8) (swapctl -l or -s) (or pstat(8) (pstat -s),
 which is similarly affected) is running, at just the "wrong" time.
 This isn't an error.   This was always handled correctly, but with
 the meaningless warning added.
 
 There's also the other case, where a swap device has been added, instead
 of removed, at just the same "wrong" time.   Since the kernel won't return
 stats for more devices than requested, which was the number returned from
 the earlier call, the code never noticed this case, and simply printed
 less data than the kernel could have supplied.  That sounds like it is
 just another example of the race above, and could simply be ignored - but
 it isn't quite that simple.  If the kernel was returning the older devices,
 and omitting the newer one(s), then it would be OK, but there is no
 guarantee that is what happens - it might easily return the new device(s)
 (or some of them) along with some of the older ones, omitting others.
 That's not ideal.
 
 To cope, just request a few more swap device stats from the kernel than
 it reported were available.   If it happens that some were added, there
 will be space in the buffer provided for the kernel to add the new
 one(s) - unless many new ones happened to get added in the relatively
 short interval involved.   This way, we should usually get all of them.
 In the normal case where no devices have been added or deleted, a few
 extra bytes (maybe a KB, not a huge amount) will have been malloc()'d.
 That's harmless.
 
 Note that this kind of thing was not the reason for the messages reported
 in the PR - that was a kernel bug, caused by the kernel reordering its
 list of swap devices at an inopportune time (and then potentially returning
 less devices than requested, even though all were still there).
 
 That's fixed, but the kernel list reordering remains - along with its
 effect of returning the swap devices in an almost arbitrary order - it
 returns them in priority order, always, but within one priority, the
 devices will be returned in any random order.
 
 So, while here, deal with that.  Sort the list returned, and thus always
 print the devices in a stable order - sorted by priority, and then by the
 device name (which is more or less arbitrary, the actual order might not
 make much sense, but at least it will be a consistent order).
 
 
 To generate a diff of this commit:
 cvs rdiff -u -r1.21 -r1.22 src/sbin/swapctl/swaplist.c
 
 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.
 


Home | Main Index | Thread Index | Old Index