On 1/5/21 2:59 AM, Mike Kravetz wrote:
On 1/3/21 11:10 PM, Li Xinhai wrote:
On 1/4/21 11:55 AM, Mike Kravetz wrote:
I believe the only case where your patch produced incorrect results is
when the range was within a vma that was smaller than PUD_SIZE. Do you
agree?
Not exactly. We need to consider for vma which span at least one
PUD_SIZE after align its vm_start and vm_end.
I know that I provided an incorrect example again. Sorry (again)!
Can you provide an example where adding the simple check for vma size less
than PUD_SIZE to your original patch will not work. The logic in your V2
patch is correct. However, I am having a hard time finding a problem with
this simpler approach.
Thanks for checking. An example like this:
(vm_start, vm_end) = (2G - 6M, 2G+8M), so this vma is bigger than
PUD_SIZE, and the check for vma size bigger than PUD_SIZE will pass.
With (start, end) = (2G-4M, 2G-2M), the previous patch will not adjust
start(because adjust it from (2G-4M) to 1G will exceeding vm_start), but
it will adjust end from (2G-2M) to 2G (because 2G still below vm_end).
The adjustment of end is incorrect, because (2G-6M, 2G) range of vma
is not allowed for PMD sharing(i.e., that range do not fully occupy
PUD_SIZE). If we make the wrong adjustment, then we will unnecessarily
impact to range (2G-2M, 2G).