On 21 Mar 2022, at 18:32, Roman Gushchin wrote:
On Mon, Mar 21, 2022 at 10:21:27AM -0400, Zi Yan wrote:
From: Zi Yan ziy@nvidia.com
To minimize the number of pages after a huge page truncation, we do not need to split it all the way down to order-0. The huge page has at most three parts, the part before offset, the part to be truncated, the part remaining at the end. Find the greatest common power of two multiplier of the non-zero values of them as the new order, so we can split the huge page to this order and keep the remaining pages as large and as few as possible.
Would you mind please to describe the algorithm in more details?
Sure.
During truncation, there can be three parts in a huge page: 1. the _offset_ from the beginning of the huge page, 2. the _length_ of the to-be-truncated part, 3. the _remaining_ part after the to-be-truncated part.
the size of the split huge page need to be the greatest common divisor of the non-zero ones of three after being rounded down to power of two.
OK, I actually find there is a gcd function. I think the algorithm can simplified to
new_order = ilog2(gcd(gcd(offset, length), remaining)) - PAGE_SHIFT;
I will update the code, the commit message, and the comment in the next version.
Thank you for the comment.
-- Best Regards, Yan, Zi