forked from luck/tmp_suning_uos_patched
arm: remove CONFIG_ARCH_HAS_HOLES_MEMORYMODEL
commit 5e545df3292fbd3d5963c68980f1527ead2a2b3f upstream.
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.org
Signed-off-by: Mike 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: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Reported-by: kernel test robot <lkp@intel.com>
Fixes: 8dd559d53b
("arm: ioremap: don't abuse pfn_valid() to check if pfn is in RAM")
Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
dfb55dcf9d
commit
9ff4a6b806
|
@ -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
|
||||||
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
|
||||||
|
@ -521,7 +521,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
|
||||||
|
@ -1481,9 +1480,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
|
||||||
|
|
||||||
|
@ -1495,7 +1491,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
|
||||||
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
|
||||||
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 @@
|
||||||
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 @@
|
||||||
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
|
||||||
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 @@
|
||||||
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
|
||||||
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)
|
||||||
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)
|
||||||
|
|
|
@ -1443,37 +1443,6 @@ struct mminit_pfnnid_cache {
|
||||||
#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 */
|
||||||
|
|
14
mm/mmzone.c
14
mm/mmzone.c
|
@ -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,
|
||||||
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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user