Message ID | 20190603220245.22750-2-sstabellini@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v3,1/3] xen/arm: fix nr_pdxs calculation | expand |
Hi Stefano, On 6/3/19 11:02 PM, Stefano Stabellini wrote: > pfn_pdx_hole_setup is meant to skip the first MAX_ORDER bits, but > actually it only skips the first MAX_ORDER-1 bits. The issue was > probably introduced by bdb5439c3f ("x86_64: Ensure frame-table > compression leaves MAX_ORDER aligned"), when changing to loop to start > from MAX_ORDER-1 an adjustment by 1 was needed in the call to > find_next_bit() but not done. > > Fix the issue by passing j+1 and i+1 to find_next_zero_bit and > find_next_bit. Also add a check for i >= BITS_PER_LONG because > find_{,next_}zero_bit() are free to assume that their last argument is > less than their middle one. > > Signed-off-by: Stefano Stabellini <stefanos@xilinx.com> > Signed-off-by: Jan Beulich <JBeulich@suse.com> Acked-by: Julien Grall <julien.grall@arm.com> Cheers,
diff --git a/xen/common/pdx.c b/xen/common/pdx.c index 50c21b6bf8..bb7e437049 100644 --- a/xen/common/pdx.c +++ b/xen/common/pdx.c @@ -83,8 +83,10 @@ void __init pfn_pdx_hole_setup(unsigned long mask) */ for ( j = MAX_ORDER-1; ; ) { - i = find_next_zero_bit(&mask, BITS_PER_LONG, j); - j = find_next_bit(&mask, BITS_PER_LONG, i); + i = find_next_zero_bit(&mask, BITS_PER_LONG, j + 1); + if ( i >= BITS_PER_LONG ) + break; + j = find_next_bit(&mask, BITS_PER_LONG, i + 1); if ( j >= BITS_PER_LONG ) break; if ( j - i > hole_shift )