Commit 5e545df3 authored by Mike Rapoport's avatar Mike Rapoport Committed by Linus Torvalds

arm: remove CONFIG_ARCH_HAS_HOLES_MEMORYMODEL

ARM is the only architecture that defines CONFIG_ARCH_HAS_HOLES_MEMORYMODEL
which in turn enables memmap_valid_within() function that is intended to
verify existence  of struct page associated with a pfn when there are holes
in the memory map.

However, the ARCH_HAS_HOLES_MEMORYMODEL also enables HAVE_ARCH_PFN_VALID
and arch-specific pfn_valid() implementation that also deals with the holes
in the memory map.

The only two users of memmap_valid_within() call this function after
a call to pfn_valid() so the memmap_valid_within() check becomes redundant.

Remove CONFIG_ARCH_HAS_HOLES_MEMORYMODEL and memmap_valid_within() and rely
entirely on ARM's implementation of pfn_valid() that is now enabled
unconditionally.

Link: https://lkml.kernel.org/r/20201101170454.9567-9-rppt@kernel.orgSigned-off-by: default avatarMike Rapoport <rppt@linux.ibm.com>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Greg Ungerer <gerg@linux-m68k.org>
Cc: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Matt Turner <mattst88@gmail.com>
Cc: Meelis Roos <mroos@linux.ee>
Cc: Michael Schmitz <schmitzmic@gmail.com>
Cc: Russell King <linux@armlinux.org.uk>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Vineet Gupta <vgupta@synopsys.com>
Cc: Will Deacon <will@kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 214496cb
...@@ -51,8 +51,7 @@ call :c:func:`free_area_init` function. Yet, the mappings array is not ...@@ -51,8 +51,7 @@ call :c:func:`free_area_init` function. Yet, the mappings array is not
usable until the call to :c:func:`memblock_free_all` that hands all the usable until the call to :c:func:`memblock_free_all` that hands all the
memory to the page allocator. memory to the page allocator.
If an architecture enables `CONFIG_ARCH_HAS_HOLES_MEMORYMODEL` option, An architecture may free parts of the `mem_map` array that do not cover the
it may free parts of the `mem_map` array that do not cover the
actual physical pages. In such case, the architecture specific actual physical pages. In such case, the architecture specific
:c:func:`pfn_valid` implementation should take the holes in the :c:func:`pfn_valid` implementation should take the holes in the
`mem_map` into account. `mem_map` into account.
......
...@@ -25,7 +25,7 @@ config ARM ...@@ -25,7 +25,7 @@ config ARM
select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
select ARCH_HAVE_CUSTOM_GPIO_H select ARCH_HAVE_CUSTOM_GPIO_H
select ARCH_HAS_GCOV_PROFILE_ALL select ARCH_HAS_GCOV_PROFILE_ALL
select ARCH_KEEP_MEMBLOCK if HAVE_ARCH_PFN_VALID || KEXEC select ARCH_KEEP_MEMBLOCK
select ARCH_MIGHT_HAVE_PC_PARPORT select ARCH_MIGHT_HAVE_PC_PARPORT
select ARCH_NO_SG_CHAIN if !ARM_HAS_SG_CHAIN select ARCH_NO_SG_CHAIN if !ARM_HAS_SG_CHAIN
select ARCH_OPTIONAL_KERNEL_RWX if ARCH_HAS_STRICT_KERNEL_RWX select ARCH_OPTIONAL_KERNEL_RWX if ARCH_HAS_STRICT_KERNEL_RWX
...@@ -520,7 +520,6 @@ config ARCH_S3C24XX ...@@ -520,7 +520,6 @@ config ARCH_S3C24XX
config ARCH_OMAP1 config ARCH_OMAP1
bool "TI OMAP1" bool "TI OMAP1"
depends on MMU depends on MMU
select ARCH_HAS_HOLES_MEMORYMODEL
select ARCH_OMAP select ARCH_OMAP
select CLKDEV_LOOKUP select CLKDEV_LOOKUP
select CLKSRC_MMIO select CLKSRC_MMIO
...@@ -1480,9 +1479,6 @@ config OABI_COMPAT ...@@ -1480,9 +1479,6 @@ config OABI_COMPAT
UNPREDICTABLE (in fact it can be predicted that it won't work UNPREDICTABLE (in fact it can be predicted that it won't work
at all). If in doubt say N. at all). If in doubt say N.
config ARCH_HAS_HOLES_MEMORYMODEL
bool
config ARCH_SELECT_MEMORY_MODEL config ARCH_SELECT_MEMORY_MODEL
bool bool
...@@ -1494,7 +1490,7 @@ config ARCH_SPARSEMEM_ENABLE ...@@ -1494,7 +1490,7 @@ config ARCH_SPARSEMEM_ENABLE
select SPARSEMEM_STATIC if SPARSEMEM select SPARSEMEM_STATIC if SPARSEMEM
config HAVE_ARCH_PFN_VALID config HAVE_ARCH_PFN_VALID
def_bool ARCH_HAS_HOLES_MEMORYMODEL || !SPARSEMEM def_bool y
config HIGHMEM config HIGHMEM
bool "High Memory Support" bool "High Memory Support"
......
...@@ -211,7 +211,6 @@ config ARCH_BRCMSTB ...@@ -211,7 +211,6 @@ config ARCH_BRCMSTB
select BCM7038_L1_IRQ select BCM7038_L1_IRQ
select BRCMSTB_L2_IRQ select BRCMSTB_L2_IRQ
select BCM7120_L2_IRQ select BCM7120_L2_IRQ
select ARCH_HAS_HOLES_MEMORYMODEL
select ZONE_DMA if ARM_LPAE select ZONE_DMA if ARM_LPAE
select SOC_BRCMSTB select SOC_BRCMSTB
select SOC_BUS select SOC_BUS
......
...@@ -5,7 +5,6 @@ menuconfig ARCH_DAVINCI ...@@ -5,7 +5,6 @@ menuconfig ARCH_DAVINCI
depends on ARCH_MULTI_V5 depends on ARCH_MULTI_V5
select DAVINCI_TIMER select DAVINCI_TIMER
select ZONE_DMA select ZONE_DMA
select ARCH_HAS_HOLES_MEMORYMODEL
select PM_GENERIC_DOMAINS if PM select PM_GENERIC_DOMAINS if PM
select PM_GENERIC_DOMAINS_OF if PM && OF select PM_GENERIC_DOMAINS_OF if PM && OF
select REGMAP_MMIO select REGMAP_MMIO
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
menuconfig ARCH_EXYNOS menuconfig ARCH_EXYNOS
bool "Samsung Exynos" bool "Samsung Exynos"
depends on ARCH_MULTI_V7 depends on ARCH_MULTI_V7
select ARCH_HAS_HOLES_MEMORYMODEL
select ARCH_SUPPORTS_BIG_ENDIAN select ARCH_SUPPORTS_BIG_ENDIAN
select ARM_AMBA select ARM_AMBA
select ARM_GIC select ARM_GIC
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
config ARCH_HIGHBANK config ARCH_HIGHBANK
bool "Calxeda ECX-1000/2000 (Highbank/Midway)" bool "Calxeda ECX-1000/2000 (Highbank/Midway)"
depends on ARCH_MULTI_V7 depends on ARCH_MULTI_V7
select ARCH_HAS_HOLES_MEMORYMODEL
select ARCH_SUPPORTS_BIG_ENDIAN select ARCH_SUPPORTS_BIG_ENDIAN
select ARM_AMBA select ARM_AMBA
select ARM_ERRATA_764369 if SMP select ARM_ERRATA_764369 if SMP
......
...@@ -93,7 +93,6 @@ config SOC_DRA7XX ...@@ -93,7 +93,6 @@ config SOC_DRA7XX
config ARCH_OMAP2PLUS config ARCH_OMAP2PLUS
bool bool
select ARCH_HAS_BANDGAP select ARCH_HAS_BANDGAP
select ARCH_HAS_HOLES_MEMORYMODEL
select ARCH_HAS_RESET_CONTROLLER select ARCH_HAS_RESET_CONTROLLER
select ARCH_OMAP select ARCH_OMAP
select CLKSRC_MMIO select CLKSRC_MMIO
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
config ARCH_S5PV210 config ARCH_S5PV210
bool "Samsung S5PV210/S5PC110" bool "Samsung S5PV210/S5PC110"
depends on ARCH_MULTI_V7 depends on ARCH_MULTI_V7
select ARCH_HAS_HOLES_MEMORYMODEL
select ARM_VIC select ARM_VIC
select CLKSRC_SAMSUNG_PWM select CLKSRC_SAMSUNG_PWM
select COMMON_CLK_SAMSUNG select COMMON_CLK_SAMSUNG
......
...@@ -3,7 +3,6 @@ config ARCH_TANGO ...@@ -3,7 +3,6 @@ config ARCH_TANGO
bool "Sigma Designs Tango4 (SMP87xx)" bool "Sigma Designs Tango4 (SMP87xx)"
depends on ARCH_MULTI_V7 depends on ARCH_MULTI_V7
# Cortex-A9 MPCore r3p0, PL310 r3p2 # Cortex-A9 MPCore r3p0, PL310 r3p2
select ARCH_HAS_HOLES_MEMORYMODEL
select ARM_ERRATA_754322 select ARM_ERRATA_754322
select ARM_ERRATA_764369 if SMP select ARM_ERRATA_764369 if SMP
select ARM_ERRATA_775420 select ARM_ERRATA_775420
......
...@@ -193,8 +193,6 @@ kclist_add_private(unsigned long pfn, unsigned long nr_pages, void *arg) ...@@ -193,8 +193,6 @@ kclist_add_private(unsigned long pfn, unsigned long nr_pages, void *arg)
return 1; return 1;
p = pfn_to_page(pfn); p = pfn_to_page(pfn);
if (!memmap_valid_within(pfn, p, page_zone(p)))
return 1;
ent = kmalloc(sizeof(*ent), GFP_KERNEL); ent = kmalloc(sizeof(*ent), GFP_KERNEL);
if (!ent) if (!ent)
......
...@@ -1440,37 +1440,6 @@ void sparse_init(void); ...@@ -1440,37 +1440,6 @@ void sparse_init(void);
#define pfn_valid_within(pfn) (1) #define pfn_valid_within(pfn) (1)
#endif #endif
#ifdef CONFIG_ARCH_HAS_HOLES_MEMORYMODEL
/*
* pfn_valid() is meant to be able to tell if a given PFN has valid memmap
* associated with it or not. This means that a struct page exists for this
* pfn. The caller cannot assume the page is fully initialized in general.
* Hotplugable pages might not have been onlined yet. pfn_to_online_page()
* will ensure the struct page is fully online and initialized. Special pages
* (e.g. ZONE_DEVICE) are never onlined and should be treated accordingly.
*
* In FLATMEM, it is expected that holes always have valid memmap as long as
* there is valid PFNs either side of the hole. In SPARSEMEM, it is assumed
* that a valid section has a memmap for the entire section.
*
* However, an ARM, and maybe other embedded architectures in the future
* free memmap backing holes to save memory on the assumption the memmap is
* never used. The page_zone linkages are then broken even though pfn_valid()
* returns true. A walker of the full memmap must then do this additional
* check to ensure the memmap they are looking at is sane by making sure
* the zone and PFN linkages are still valid. This is expensive, but walkers
* of the full memmap are extremely rare.
*/
bool memmap_valid_within(unsigned long pfn,
struct page *page, struct zone *zone);
#else
static inline bool memmap_valid_within(unsigned long pfn,
struct page *page, struct zone *zone)
{
return true;
}
#endif /* CONFIG_ARCH_HAS_HOLES_MEMORYMODEL */
#endif /* !__GENERATING_BOUNDS.H */ #endif /* !__GENERATING_BOUNDS.H */
#endif /* !__ASSEMBLY__ */ #endif /* !__ASSEMBLY__ */
#endif /* _LINUX_MMZONE_H */ #endif /* _LINUX_MMZONE_H */
...@@ -72,20 +72,6 @@ struct zoneref *__next_zones_zonelist(struct zoneref *z, ...@@ -72,20 +72,6 @@ struct zoneref *__next_zones_zonelist(struct zoneref *z,
return z; return z;
} }
#ifdef CONFIG_ARCH_HAS_HOLES_MEMORYMODEL
bool memmap_valid_within(unsigned long pfn,
struct page *page, struct zone *zone)
{
if (page_to_pfn(page) != pfn)
return false;
if (page_zone(page) != zone)
return false;
return true;
}
#endif /* CONFIG_ARCH_HAS_HOLES_MEMORYMODEL */
void lruvec_init(struct lruvec *lruvec) void lruvec_init(struct lruvec *lruvec)
{ {
enum lru_list lru; enum lru_list lru;
......
...@@ -1503,10 +1503,6 @@ static void pagetypeinfo_showblockcount_print(struct seq_file *m, ...@@ -1503,10 +1503,6 @@ static void pagetypeinfo_showblockcount_print(struct seq_file *m,
if (!page) if (!page)
continue; continue;
/* Watch for unexpected holes punched in the memmap */
if (!memmap_valid_within(pfn, page, zone))
continue;
if (page_zone(page) != zone) if (page_zone(page) != zone)
continue; continue;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment