On 2023/12/11 23:56, David Hildenbrand wrote:
Let's get rid of the compound parameter and instead define implicitlyReviewed-by: Yin Fengwei <fengwei.yin@xxxxxxxxx>
which mappings we're adding. That is more future proof, easier to read
and harder to mess up.
Use an enum to express the granularity internally. Make the compiler
always special-case on the granularity by using __always_inline. Replace
the "compound" check by a switch-case that will be removed by the
compiler completely.
Add plenty of sanity checks with CONFIG_DEBUG_VM. Replace the
folio_test_pmd_mappable() check by a config check in the caller and
sanity checks. Convert the single user of folio_add_file_rmap_range().
This function design can later easily be extended to PUDs and to batch
PMDs. Note that for now we don't support anything bigger than
PMD-sized folios (as we cleanly separated hugetlb handling). Sanity checks
will catch if that ever changes.
Next up is removing page_remove_rmap() along with its "compound"
parameter and smilarly converting all other rmap functions.
Signed-off-by: David Hildenbrand <david@xxxxxxxxxx>
With one small comment.
---Maybe rmap_level for enum name? To me, PTE and PMD are level instead of
include/linux/rmap.h | 47 +++++++++++++++++++++++++--
mm/memory.c | 2 +-
mm/rmap.c | 75 +++++++++++++++++++++++++++++---------------
3 files changed, 95 insertions(+), 29 deletions(-)
diff --git a/include/linux/rmap.h b/include/linux/rmap.h
index e3857d26b944..1753900f4aed 100644
--- a/include/linux/rmap.h
+++ b/include/linux/rmap.h
@@ -191,6 +191,45 @@ typedef int __bitwise rmap_t;
*/
#define RMAP_COMPOUND ((__force rmap_t)BIT(1))
+/*
+ * Internally, we're using an enum to specify the granularity. Usually,
+ * we make the compiler create specialized variants for the different
+ * granularity.
+ */
+enum rmap_mode {
+ RMAP_MODE_PTE = 0,
+ RMAP_MODE_PMD,
+};
mode.