Date: Sat, 4 Jan 2003 05:46:04 +1100 (EST) From: Bruce Evans <bde@zeta.org.au> To: current@freebsd.org Cc: phk@freebsd.org Subject: aligned_nblks calculations broken in vm_swap.c Message-ID: <20030104053046.A5138-100000@gamplex.bde.org>
next in thread | raw e-mail | index | archive | help
% Index: vm_swap.c % =================================================================== % RCS file: /home/ncvs/src/sys/vm/vm_swap.c,v % retrieving revision 1.127 % retrieving revision 1.128 % diff -u -1 -r1.127 -r1.128 % --- vm_swap.c 3 Jan 2003 09:55:05 -0000 1.127 % +++ vm_swap.c 3 Jan 2003 14:30:46 -0000 1.128 % ... % @@ -353,3 +352,3 @@ % */ % - aligned_nblks = (nblks + (dmmax - 1)) & ~(u_long)(dmmax - 1); % + aligned_nblks = (nblks + dmmax_mask) & ~(u_long)dmmax_mask; % % @@ -472,3 +471,3 @@ % % - aligned_nblks = (nblks + (dmmax - 1)) & ~(u_long)(dmmax - 1); % + aligned_nblks = (nblks + dmmax_mask) & ~(u_long)dmmax_mask; % nswap = aligned_nblks * nswdev; dmmax_mask is ~(dmmax - 1) not (dmmax - 1), so all of these changes are wrong. (New) nearby style bugs: removing the use of dmmax bogotifies a comment which refers to dmmax. (Old) related type bugs: dmmax_mask has the bogus type `int', so it is not clear how it works as a mask on machines with 32-bit ints and 64-bit block numbers. I think it works because all supported machines are 2's complement; this makes the negative value obtained by complementing the bits of (dmmax - 1) right for masking with ints, and C's integral promotion rules then make it right for masking with larger integral types too. ~(u_long)(dmmax - 1) in the old code was more careful about this, except it only works for u_long and smaller block numbers (which is enough for aligned_nblks). Bruce To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030104053046.A5138-100000>