From: Mike Rapoport rppt@linux.ibm.com
Since commit 974b9b2c68f3 ("mm: consolidate pte_index() and pte_offset_*() definitions") pte_index is a static inline and there is no define for it that can be recognized by the preprocessor. As the result, vm_insert_pages() uses slower loop over vm_insert_page() instead of insert_pages() that amortizes the cost of spinlock operations when inserting multiple pages.
Fixes: 974b9b2c68f3 ("mm: consolidate pte_index() and pte_offset_*() definitions") Reported-by: Christian Dietrich stettberger@dokucode.de Signed-off-by: Mike Rapoport rppt@linux.ibm.com Cc: stable@vger.kernel.org --- include/linux/pgtable.h | 1 + 1 file changed, 1 insertion(+)
diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h index e24d2c992b11..d468efcf48f4 100644 --- a/include/linux/pgtable.h +++ b/include/linux/pgtable.h @@ -62,6 +62,7 @@ static inline unsigned long pte_index(unsigned long address) { return (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1); } +#define pte_index pte_index
#ifndef pmd_index static inline unsigned long pmd_index(unsigned long address)
base-commit: 2585cf9dfaaddf00b069673f27bb3f8530e2039c
Hello Mike!
Mike Rapoport rppt@kernel.org [11. Januar 2022]:
diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h index e24d2c992b11..d468efcf48f4 100644 --- a/include/linux/pgtable.h +++ b/include/linux/pgtable.h @@ -62,6 +62,7 @@ static inline unsigned long pte_index(unsigned long address) { return (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1); } +#define pte_index pte_index
Wouldn't it make sense to remove the dead CPP blocks (#ifdef pte_index) from mm/memory.c? Or is there a case were pte_index is not defined for an architecture?
chris
Hi Christian,
On Tue, Jan 11, 2022 at 04:20:34PM +0100, Christian Dietrich wrote:
Hello Mike!
Mike Rapoport rppt@kernel.org [11. Januar 2022]:
diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h index e24d2c992b11..d468efcf48f4 100644 --- a/include/linux/pgtable.h +++ b/include/linux/pgtable.h @@ -62,6 +62,7 @@ static inline unsigned long pte_index(unsigned long address) { return (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1); } +#define pte_index pte_index
Wouldn't it make sense to remove the dead CPP blocks (#ifdef pte_index) from mm/memory.c?
It does make sense to remove the dead code, but this cleanup does not need stable backporting so it'll be a separate patch.
Care to send a patch? ;-)
Or is there a case were pte_index is not defined for an architecture?
Nope, the fix in include/linux/pgtable.h covers MMU architectures and NOMMU do not compile mm/memory.c anyway.
chris
On Tue, 2022-01-11 at 16:54 +0200, Mike Rapoport wrote:
From: Mike Rapoport rppt@linux.ibm.com
Since commit 974b9b2c68f3 ("mm: consolidate pte_index() and pte_offset_*() definitions") pte_index is a static inline and there is no define for it that can be recognized by the preprocessor. As the result, vm_insert_pages() uses slower loop over vm_insert_page() instead of insert_pages() that amortizes the cost of spinlock operations when inserting multiple pages.
Fixes: 974b9b2c68f3 ("mm: consolidate pte_index() and pte_offset_*() definitions") Reported-by: Christian Dietrich stettberger@dokucode.de Signed-off-by: Mike Rapoport rppt@linux.ibm.com Cc: stable@vger.kernel.org
include/linux/pgtable.h | 1 + 1 file changed, 1 insertion(+)
diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h index e24d2c992b11..d468efcf48f4 100644 --- a/include/linux/pgtable.h +++ b/include/linux/pgtable.h @@ -62,6 +62,7 @@ static inline unsigned long pte_index(unsigned long address) { return (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1); } +#define pte_index pte_index #ifndef pmd_index static inline unsigned long pmd_index(unsigned long address)
base-commit: 2585cf9dfaaddf00b069673f27bb3f8530e2039c
This is a good fix with positive performance impact.
Reviewed-by: Khalid Aziz khalid.aziz@oracle.com
linux-stable-mirror@lists.linaro.org