On Thu, 7 Mar 2019, Dominique Martinet wrote:
quoted
quoted
addr = 4095
vma->vm_end = 4096
pages = 1000
then `end' is 4096 and `(end - addr) << PAGE_SHIFT' is zero, but it
should have been 1.
Good catch! It should rather be something like
unsigned long pages = (end >> PAGE_SHIFT) - (addr >> PAGE_SHIFT);
That would be 0 for addr = 0 and vma->vm_end = 1; I assume we would
still want to count that as one page.
Yeah, that was bogus as well, ETOOTIRED yesterday, sorry for the noise.
Both the variants are off.
I'm not too familiar with this area of the code, but I think there's a
handy macro we can use for this, perhaps
DIV_ROUND_UP(end - addr, PAGE_SIZE) ?
kernel/kexec_core.c has defined PAGE_COUNT() which seems more
appropriate but I do not see a global equivalent
#define PAGE_COUNT(x) (((x) + PAGE_SIZE - 1) >> PAGE_SHIFT)
I'll fix that up when doing the other changes requested by Andrew.
Thanks,
--
Jiri Kosina
SUSE Labs