Skip site navigation (1)Skip section navigation (2)
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>