NetBSD-Bugs archive

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

kern/52639: vmstat -u is broken on some architectures



>Number:         52639
>Category:       kern
>Synopsis:       vmstat -u is broken on some architectures
>Confidential:   no
>Severity:       critical
>Priority:       high
>Responsible:    kern-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Mon Oct 23 01:25:00 +0000 2017
>Originator:     Paul Goyette
>Release:        NetBSD 8.99.3
>Organization:
+------------------+--------------------------+----------------------------+
| Paul Goyette     | PGP Key fingerprint:     | E-mail addresses:          |
| (Retired)        | FA29 0E3B 35AF E8AE 6651 | paul at whooppee dot com   |
| Kernel Developer | 0786 F758 55DE 53BA 7731 | pgoyette at netbsd dot org |
+------------------+--------------------------+----------------------------+
>Environment:
	
	
System: NetBSD speedy.whooppee.com 8.99.3 NetBSD 8.99.3 (SPEEDY 2017-10-02 09:48:54 UTC) #0: Mon Oct 2 14:15:08 UTC 2017 paul%speedy.whooppee.com@localhost:/build/netbsd-local/obj/amd64/sys/arch/amd64/compile/SPEEDY amd64
Architecture: x86_64
Machine: amd64
>Description:
	
Internal kernel "argument" data for xxxHIST entries are stored as unsigned
long.  However, when the data is exported to userland via sysctl, the data
are converted to uint64_t.  This causes problems on some architectures
(notable, arm) when the 64-bit value is passed to printf, with formats that
reference shorter data types.  Thus on these architectures, the "vmstat
-u <history>" command is useless, and one needs to use ddb(4) to dump the
history data.

>How-To-Repeat:
	
The following sample program shows what happens in vmstat:

#include <stdio.h>
#include <inttypes.h>

int main(int argc, int *argv)
{
	uint64_t	v1 = 0xdeadbeef12345678;
	uint64_t	v2 = 0xfeed98765432dada;

	printf("with %%"PRIx64": %"PRIx64", %"PRIx64"\n", v1, v2);
	printf("with %%lx: %lx, %lx\n", v1, v2);
}

>Fix:
	
1. Modify the kernel structure to contain "uint64_t" values, rather than
   the current "unsigned long" values.

	- pretty much doubles the size of xxxHIST tables, some of
	  which are already fairly large (hundreds or thousands of
	  entries
	- adds an additional restriction on format strings, mandating
	  use of only 64-bit formats (we already prohibit using %s)
	- rototill all existing xxxHIST format strings accordingly

2. Modify the sysctl-export structure to contain "unsigned long" values

	- is an "unsigned long" always big enough to hold a pointer?
	- for MIPS, is a "long" the same size in both kernel and
	  userland?

>Unformatted:
 	
 	


Home | Main Index | Thread Index | Old Index