You've already forked linux-rockchip
mirror of
https://github.com/armbian/linux-rockchip.git
synced 2026-01-06 11:08:10 -08:00
Merge branch 'akpm' (patches from Andrew)
Merge misc updates from Andrew Morton: "191 patches. Subsystems affected by this patch series: kthread, ia64, scripts, ntfs, squashfs, ocfs2, kernel/watchdog, and mm (gup, pagealloc, slab, slub, kmemleak, dax, debug, pagecache, gup, swap, memcg, pagemap, mprotect, bootmem, dma, tracing, vmalloc, kasan, initialization, pagealloc, and memory-failure)" * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (191 commits) mm,hwpoison: make get_hwpoison_page() call get_any_page() mm,hwpoison: send SIGBUS with error virutal address mm/page_alloc: split pcp->high across all online CPUs for cpuless nodes mm/page_alloc: allow high-order pages to be stored on the per-cpu lists mm: replace CONFIG_FLAT_NODE_MEM_MAP with CONFIG_FLATMEM mm: replace CONFIG_NEED_MULTIPLE_NODES with CONFIG_NUMA docs: remove description of DISCONTIGMEM arch, mm: remove stale mentions of DISCONIGMEM mm: remove CONFIG_DISCONTIGMEM m68k: remove support for DISCONTIGMEM arc: remove support for DISCONTIGMEM arc: update comment about HIGHMEM implementation alpha: remove DISCONTIGMEM and NUMA mm/page_alloc: move free_the_page mm/page_alloc: fix counting of managed_pages mm/page_alloc: improve memmap_pages dbg msg mm: drop SECTION_SHIFT in code comments mm/page_alloc: introduce vm.percpu_pagelist_high_fraction mm/page_alloc: limit the number of pages on PCP lists when reclaim is active mm/page_alloc: scale the number of pages that are batch freed ...
This commit is contained in:
@@ -3591,6 +3591,12 @@
|
||||
off: turn off poisoning (default)
|
||||
on: turn on poisoning
|
||||
|
||||
page_reporting.page_reporting_order=
|
||||
[KNL] Minimal page reporting order
|
||||
Format: <integer>
|
||||
Adjust the minimal page reporting order. The page
|
||||
reporting is disabled when it exceeds (MAX_ORDER-1).
|
||||
|
||||
panic= [KNL] Kernel behaviour on panic: delay <timeout>
|
||||
timeout > 0: seconds before rebooting
|
||||
timeout = 0: wait forever
|
||||
|
||||
@@ -39,7 +39,7 @@ in principle, they should work in any architecture where these
|
||||
subsystems are present.
|
||||
|
||||
A periodic hrtimer runs to generate interrupts and kick the watchdog
|
||||
task. An NMI perf event is generated every "watchdog_thresh"
|
||||
job. An NMI perf event is generated every "watchdog_thresh"
|
||||
(compile-time initialized to 10 and configurable through sysctl of the
|
||||
same name) seconds to check for hardlockups. If any CPU in the system
|
||||
does not receive any hrtimer interrupt during that time the
|
||||
@@ -47,7 +47,7 @@ does not receive any hrtimer interrupt during that time the
|
||||
generate a kernel warning or call panic, depending on the
|
||||
configuration.
|
||||
|
||||
The watchdog task is a high priority kernel thread that updates a
|
||||
The watchdog job runs in a stop scheduling thread that updates a
|
||||
timestamp every time it is scheduled. If that timestamp is not updated
|
||||
for 2*watchdog_thresh seconds (the softlockup threshold) the
|
||||
'softlockup detector' (coded inside the hrtimer callback function)
|
||||
|
||||
@@ -1297,11 +1297,11 @@ This parameter can be used to control the soft lockup detector.
|
||||
= =================================
|
||||
|
||||
The soft lockup detector monitors CPUs for threads that are hogging the CPUs
|
||||
without rescheduling voluntarily, and thus prevent the 'watchdog/N' threads
|
||||
from running. The mechanism depends on the CPUs ability to respond to timer
|
||||
interrupts which are needed for the 'watchdog/N' threads to be woken up by
|
||||
the watchdog timer function, otherwise the NMI watchdog — if enabled — can
|
||||
detect a hard lockup condition.
|
||||
without rescheduling voluntarily, and thus prevent the 'migration/N' threads
|
||||
from running, causing the watchdog work fail to execute. The mechanism depends
|
||||
on the CPUs ability to respond to timer interrupts which are needed for the
|
||||
watchdog work to be queued by the watchdog timer function, otherwise the NMI
|
||||
watchdog — if enabled — can detect a hard lockup condition.
|
||||
|
||||
|
||||
stack_erasing
|
||||
|
||||
@@ -64,7 +64,7 @@ Currently, these files are in /proc/sys/vm:
|
||||
- overcommit_ratio
|
||||
- page-cluster
|
||||
- panic_on_oom
|
||||
- percpu_pagelist_fraction
|
||||
- percpu_pagelist_high_fraction
|
||||
- stat_interval
|
||||
- stat_refresh
|
||||
- numa_stat
|
||||
@@ -790,22 +790,24 @@ panic_on_oom=2+kdump gives you very strong tool to investigate
|
||||
why oom happens. You can get snapshot.
|
||||
|
||||
|
||||
percpu_pagelist_fraction
|
||||
========================
|
||||
percpu_pagelist_high_fraction
|
||||
=============================
|
||||
|
||||
This is the fraction of pages at most (high mark pcp->high) in each zone that
|
||||
are allocated for each per cpu page list. The min value for this is 8. It
|
||||
means that we don't allow more than 1/8th of pages in each zone to be
|
||||
allocated in any single per_cpu_pagelist. This entry only changes the value
|
||||
of hot per cpu pagelists. User can specify a number like 100 to allocate
|
||||
1/100th of each zone to each per cpu page list.
|
||||
This is the fraction of pages in each zone that are can be stored to
|
||||
per-cpu page lists. It is an upper boundary that is divided depending
|
||||
on the number of online CPUs. The min value for this is 8 which means
|
||||
that we do not allow more than 1/8th of pages in each zone to be stored
|
||||
on per-cpu page lists. This entry only changes the value of hot per-cpu
|
||||
page lists. A user can specify a number like 100 to allocate 1/100th of
|
||||
each zone between per-cpu lists.
|
||||
|
||||
The batch value of each per cpu pagelist is also updated as a result. It is
|
||||
set to pcp->high/4. The upper limit of batch is (PAGE_SHIFT * 8)
|
||||
The batch value of each per-cpu page list remains the same regardless of
|
||||
the value of the high fraction so allocation latencies are unaffected.
|
||||
|
||||
The initial value is zero. Kernel does not use this value at boot time to set
|
||||
the high water marks for each per cpu page list. If the user writes '0' to this
|
||||
sysctl, it will revert to this default behavior.
|
||||
The initial value is zero. Kernel uses this value to set the high pcp->high
|
||||
mark based on the low watermark for the zone and the number of local
|
||||
online CPUs. If the user writes '0' to this sysctl, it will revert to
|
||||
this default behavior.
|
||||
|
||||
|
||||
stat_interval
|
||||
@@ -936,12 +938,12 @@ allocations, THP and hugetlbfs pages.
|
||||
|
||||
To make it sensible with respect to the watermark_scale_factor
|
||||
parameter, the unit is in fractions of 10,000. The default value of
|
||||
15,000 on !DISCONTIGMEM configurations means that up to 150% of the high
|
||||
watermark will be reclaimed in the event of a pageblock being mixed due
|
||||
to fragmentation. The level of reclaim is determined by the number of
|
||||
fragmentation events that occurred in the recent past. If this value is
|
||||
smaller than a pageblock then a pageblocks worth of pages will be reclaimed
|
||||
(e.g. 2MB on 64-bit x86). A boost factor of 0 will disable the feature.
|
||||
15,000 means that up to 150% of the high watermark will be reclaimed in the
|
||||
event of a pageblock being mixed due to fragmentation. The level of reclaim
|
||||
is determined by the number of fragmentation events that occurred in the
|
||||
recent past. If this value is smaller than a pageblock then a pageblocks
|
||||
worth of pages will be reclaimed (e.g. 2MB on 64-bit x86). A boost factor
|
||||
of 0 will disable the feature.
|
||||
|
||||
|
||||
watermark_scale_factor
|
||||
|
||||
@@ -447,11 +447,10 @@ When a test fails due to a failed ``kmalloc``::
|
||||
|
||||
When a test fails due to a missing KASAN report::
|
||||
|
||||
# kmalloc_double_kzfree: EXPECTATION FAILED at lib/test_kasan.c:629
|
||||
Expected kasan_data->report_expected == kasan_data->report_found, but
|
||||
kasan_data->report_expected == 1
|
||||
kasan_data->report_found == 0
|
||||
not ok 28 - kmalloc_double_kzfree
|
||||
# kmalloc_double_kzfree: EXPECTATION FAILED at lib/test_kasan.c:974
|
||||
KASAN failure expected in "kfree_sensitive(ptr)", but none occurred
|
||||
not ok 44 - kmalloc_double_kzfree
|
||||
|
||||
|
||||
At the end the cumulative status of all KASAN tests is printed. On success::
|
||||
|
||||
|
||||
@@ -14,15 +14,11 @@ for the CPU. Then there could be several contiguous ranges at
|
||||
completely distinct addresses. And, don't forget about NUMA, where
|
||||
different memory banks are attached to different CPUs.
|
||||
|
||||
Linux abstracts this diversity using one of the three memory models:
|
||||
FLATMEM, DISCONTIGMEM and SPARSEMEM. Each architecture defines what
|
||||
Linux abstracts this diversity using one of the two memory models:
|
||||
FLATMEM and SPARSEMEM. Each architecture defines what
|
||||
memory models it supports, what the default memory model is and
|
||||
whether it is possible to manually override that default.
|
||||
|
||||
.. note::
|
||||
At time of this writing, DISCONTIGMEM is considered deprecated,
|
||||
although it is still in use by several architectures.
|
||||
|
||||
All the memory models track the status of physical page frames using
|
||||
struct page arranged in one or more arrays.
|
||||
|
||||
@@ -63,43 +59,6 @@ straightforward: `PFN - ARCH_PFN_OFFSET` is an index to the
|
||||
The `ARCH_PFN_OFFSET` defines the first page frame number for
|
||||
systems with physical memory starting at address different from 0.
|
||||
|
||||
DISCONTIGMEM
|
||||
============
|
||||
|
||||
The DISCONTIGMEM model treats the physical memory as a collection of
|
||||
`nodes` similarly to how Linux NUMA support does. For each node Linux
|
||||
constructs an independent memory management subsystem represented by
|
||||
`struct pglist_data` (or `pg_data_t` for short). Among other
|
||||
things, `pg_data_t` holds the `node_mem_map` array that maps
|
||||
physical pages belonging to that node. The `node_start_pfn` field of
|
||||
`pg_data_t` is the number of the first page frame belonging to that
|
||||
node.
|
||||
|
||||
The architecture setup code should call :c:func:`free_area_init_node` for
|
||||
each node in the system to initialize the `pg_data_t` object and its
|
||||
`node_mem_map`.
|
||||
|
||||
Every `node_mem_map` behaves exactly as FLATMEM's `mem_map` -
|
||||
every physical page frame in a node has a `struct page` entry in the
|
||||
`node_mem_map` array. When DISCONTIGMEM is enabled, a portion of the
|
||||
`flags` field of the `struct page` encodes the node number of the
|
||||
node hosting that page.
|
||||
|
||||
The conversion between a PFN and the `struct page` in the
|
||||
DISCONTIGMEM model became slightly more complex as it has to determine
|
||||
which node hosts the physical page and which `pg_data_t` object
|
||||
holds the `struct page`.
|
||||
|
||||
Architectures that support DISCONTIGMEM provide :c:func:`pfn_to_nid`
|
||||
to convert PFN to the node number. The opposite conversion helper
|
||||
:c:func:`page_to_nid` is generic as it uses the node number encoded in
|
||||
page->flags.
|
||||
|
||||
Once the node number is known, the PFN can be used to index
|
||||
appropriate `node_mem_map` array to access the `struct page` and
|
||||
the offset of the `struct page` from the `node_mem_map` plus
|
||||
`node_start_pfn` is the PFN of that page.
|
||||
|
||||
SPARSEMEM
|
||||
=========
|
||||
|
||||
|
||||
@@ -549,29 +549,12 @@ config NR_CPUS
|
||||
MARVEL support can handle a maximum of 32 CPUs, all the others
|
||||
with working support have a maximum of 4 CPUs.
|
||||
|
||||
config ARCH_DISCONTIGMEM_ENABLE
|
||||
bool "Discontiguous Memory Support"
|
||||
depends on BROKEN
|
||||
help
|
||||
Say Y to support efficient handling of discontiguous physical memory,
|
||||
for architectures which are either NUMA (Non-Uniform Memory Access)
|
||||
or have huge holes in the physical address space for other reasons.
|
||||
See <file:Documentation/vm/numa.rst> for more.
|
||||
|
||||
config ARCH_SPARSEMEM_ENABLE
|
||||
bool "Sparse Memory Support"
|
||||
help
|
||||
Say Y to support efficient handling of discontiguous physical memory,
|
||||
for systems that have huge holes in the physical address space.
|
||||
|
||||
config NUMA
|
||||
bool "NUMA Support (EXPERIMENTAL)"
|
||||
depends on DISCONTIGMEM && BROKEN
|
||||
help
|
||||
Say Y to compile the kernel to support NUMA (Non-Uniform Memory
|
||||
Access). This option is for configuring high-end multiprocessor
|
||||
server machines. If in doubt, say N.
|
||||
|
||||
config ALPHA_WTINT
|
||||
bool "Use WTINT" if ALPHA_SRM || ALPHA_GENERIC
|
||||
default y if ALPHA_QEMU
|
||||
@@ -596,11 +579,6 @@ config ALPHA_WTINT
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config NODES_SHIFT
|
||||
int
|
||||
default "7"
|
||||
depends on NEED_MULTIPLE_NODES
|
||||
|
||||
# LARGE_VMALLOC is racy, if you *really* need it then fix it first
|
||||
config ALPHA_LARGE_VMALLOC
|
||||
bool
|
||||
|
||||
@@ -99,12 +99,6 @@ struct alpha_machine_vector
|
||||
|
||||
const char *vector_name;
|
||||
|
||||
/* NUMA information */
|
||||
int (*pa_to_nid)(unsigned long);
|
||||
int (*cpuid_to_nid)(int);
|
||||
unsigned long (*node_mem_start)(int);
|
||||
unsigned long (*node_mem_size)(int);
|
||||
|
||||
/* System specific parameters. */
|
||||
union {
|
||||
struct {
|
||||
|
||||
@@ -1,100 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Written by Kanoj Sarcar (kanoj@sgi.com) Aug 99
|
||||
* Adapted for the alpha wildfire architecture Jan 2001.
|
||||
*/
|
||||
#ifndef _ASM_MMZONE_H_
|
||||
#define _ASM_MMZONE_H_
|
||||
|
||||
#ifdef CONFIG_DISCONTIGMEM
|
||||
|
||||
#include <asm/smp.h>
|
||||
|
||||
/*
|
||||
* Following are macros that are specific to this numa platform.
|
||||
*/
|
||||
|
||||
extern pg_data_t node_data[];
|
||||
|
||||
#define alpha_pa_to_nid(pa) \
|
||||
(alpha_mv.pa_to_nid \
|
||||
? alpha_mv.pa_to_nid(pa) \
|
||||
: (0))
|
||||
#define node_mem_start(nid) \
|
||||
(alpha_mv.node_mem_start \
|
||||
? alpha_mv.node_mem_start(nid) \
|
||||
: (0UL))
|
||||
#define node_mem_size(nid) \
|
||||
(alpha_mv.node_mem_size \
|
||||
? alpha_mv.node_mem_size(nid) \
|
||||
: ((nid) ? (0UL) : (~0UL)))
|
||||
|
||||
#define pa_to_nid(pa) alpha_pa_to_nid(pa)
|
||||
#define NODE_DATA(nid) (&node_data[(nid)])
|
||||
|
||||
#define node_localnr(pfn, nid) ((pfn) - NODE_DATA(nid)->node_start_pfn)
|
||||
|
||||
#if 1
|
||||
#define PLAT_NODE_DATA_LOCALNR(p, n) \
|
||||
(((p) >> PAGE_SHIFT) - PLAT_NODE_DATA(n)->gendata.node_start_pfn)
|
||||
#else
|
||||
static inline unsigned long
|
||||
PLAT_NODE_DATA_LOCALNR(unsigned long p, int n)
|
||||
{
|
||||
unsigned long temp;
|
||||
temp = p >> PAGE_SHIFT;
|
||||
return temp - PLAT_NODE_DATA(n)->gendata.node_start_pfn;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Following are macros that each numa implementation must define.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Given a kernel address, find the home node of the underlying memory.
|
||||
*/
|
||||
#define kvaddr_to_nid(kaddr) pa_to_nid(__pa(kaddr))
|
||||
|
||||
/*
|
||||
* Given a kaddr, LOCAL_BASE_ADDR finds the owning node of the memory
|
||||
* and returns the kaddr corresponding to first physical page in the
|
||||
* node's mem_map.
|
||||
*/
|
||||
#define LOCAL_BASE_ADDR(kaddr) \
|
||||
((unsigned long)__va(NODE_DATA(kvaddr_to_nid(kaddr))->node_start_pfn \
|
||||
<< PAGE_SHIFT))
|
||||
|
||||
/* XXX: FIXME -- nyc */
|
||||
#define kern_addr_valid(kaddr) (0)
|
||||
|
||||
#define mk_pte(page, pgprot) \
|
||||
({ \
|
||||
pte_t pte; \
|
||||
unsigned long pfn; \
|
||||
\
|
||||
pfn = page_to_pfn(page) << 32; \
|
||||
pte_val(pte) = pfn | pgprot_val(pgprot); \
|
||||
\
|
||||
pte; \
|
||||
})
|
||||
|
||||
#define pte_page(x) \
|
||||
({ \
|
||||
unsigned long kvirt; \
|
||||
struct page * __xx; \
|
||||
\
|
||||
kvirt = (unsigned long)__va(pte_val(x) >> (32-PAGE_SHIFT)); \
|
||||
__xx = virt_to_page(kvirt); \
|
||||
\
|
||||
__xx; \
|
||||
})
|
||||
|
||||
#define pfn_to_nid(pfn) pa_to_nid(((u64)(pfn) << PAGE_SHIFT))
|
||||
#define pfn_valid(pfn) \
|
||||
(((pfn) - node_start_pfn(pfn_to_nid(pfn))) < \
|
||||
node_spanned_pages(pfn_to_nid(pfn))) \
|
||||
|
||||
#endif /* CONFIG_DISCONTIGMEM */
|
||||
|
||||
#endif /* _ASM_MMZONE_H_ */
|
||||
@@ -206,7 +206,6 @@ extern unsigned long __zero_page(void);
|
||||
#define page_to_pa(page) (page_to_pfn(page) << PAGE_SHIFT)
|
||||
#define pte_pfn(pte) (pte_val(pte) >> 32)
|
||||
|
||||
#ifndef CONFIG_DISCONTIGMEM
|
||||
#define pte_page(pte) pfn_to_page(pte_pfn(pte))
|
||||
#define mk_pte(page, pgprot) \
|
||||
({ \
|
||||
@@ -215,7 +214,6 @@ extern unsigned long __zero_page(void);
|
||||
pte_val(pte) = (page_to_pfn(page) << 32) | pgprot_val(pgprot); \
|
||||
pte; \
|
||||
})
|
||||
#endif
|
||||
|
||||
extern inline pte_t pfn_pte(unsigned long physpfn, pgprot_t pgprot)
|
||||
{ pte_t pte; pte_val(pte) = (PHYS_TWIDDLE(physpfn) << 32) | pgprot_val(pgprot); return pte; }
|
||||
@@ -330,9 +328,7 @@ extern inline pte_t mk_swap_pte(unsigned long type, unsigned long offset)
|
||||
#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) })
|
||||
#define __swp_entry_to_pte(x) ((pte_t) { (x).val })
|
||||
|
||||
#ifndef CONFIG_DISCONTIGMEM
|
||||
#define kern_addr_valid(addr) (1)
|
||||
#endif
|
||||
|
||||
#define pte_ERROR(e) \
|
||||
printk("%s:%d: bad pte %016lx.\n", __FILE__, __LINE__, pte_val(e))
|
||||
|
||||
@@ -7,45 +7,6 @@
|
||||
#include <linux/numa.h>
|
||||
#include <asm/machvec.h>
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
static inline int cpu_to_node(int cpu)
|
||||
{
|
||||
int node;
|
||||
|
||||
if (!alpha_mv.cpuid_to_nid)
|
||||
return 0;
|
||||
|
||||
node = alpha_mv.cpuid_to_nid(cpu);
|
||||
|
||||
#ifdef DEBUG_NUMA
|
||||
BUG_ON(node < 0);
|
||||
#endif
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
extern struct cpumask node_to_cpumask_map[];
|
||||
/* FIXME: This is dumb, recalculating every time. But simple. */
|
||||
static const struct cpumask *cpumask_of_node(int node)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
if (node == NUMA_NO_NODE)
|
||||
return cpu_all_mask;
|
||||
|
||||
cpumask_clear(&node_to_cpumask_map[node]);
|
||||
|
||||
for_each_online_cpu(cpu) {
|
||||
if (cpu_to_node(cpu) == node)
|
||||
cpumask_set_cpu(cpu, node_to_cpumask_map[node]);
|
||||
}
|
||||
|
||||
return &node_to_cpumask_map[node];
|
||||
}
|
||||
|
||||
#define cpumask_of_pcibus(bus) (cpu_online_mask)
|
||||
|
||||
#endif /* !CONFIG_NUMA */
|
||||
# include <asm-generic/topology.h>
|
||||
|
||||
#endif /* _ASM_ALPHA_TOPOLOGY_H */
|
||||
|
||||
@@ -287,8 +287,7 @@ io7_init_hose(struct io7 *io7, int port)
|
||||
/*
|
||||
* Set up window 0 for scatter-gather 8MB at 8MB.
|
||||
*/
|
||||
hose->sg_isa = iommu_arena_new_node(marvel_cpuid_to_nid(io7->pe),
|
||||
hose, 0x00800000, 0x00800000, 0);
|
||||
hose->sg_isa = iommu_arena_new_node(0, hose, 0x00800000, 0x00800000, 0);
|
||||
hose->sg_isa->align_entry = 8; /* cache line boundary */
|
||||
csrs->POx_WBASE[0].csr =
|
||||
hose->sg_isa->dma_base | wbase_m_ena | wbase_m_sg;
|
||||
@@ -305,8 +304,7 @@ io7_init_hose(struct io7 *io7, int port)
|
||||
/*
|
||||
* Set up window 2 for scatter-gather (up-to) 1GB at 3GB.
|
||||
*/
|
||||
hose->sg_pci = iommu_arena_new_node(marvel_cpuid_to_nid(io7->pe),
|
||||
hose, 0xc0000000, 0x40000000, 0);
|
||||
hose->sg_pci = iommu_arena_new_node(0, hose, 0xc0000000, 0x40000000, 0);
|
||||
hose->sg_pci->align_entry = 8; /* cache line boundary */
|
||||
csrs->POx_WBASE[2].csr =
|
||||
hose->sg_pci->dma_base | wbase_m_ena | wbase_m_sg;
|
||||
@@ -843,53 +841,8 @@ EXPORT_SYMBOL(marvel_ioportmap);
|
||||
EXPORT_SYMBOL(marvel_ioread8);
|
||||
EXPORT_SYMBOL(marvel_iowrite8);
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* NUMA Support
|
||||
*/
|
||||
/**********
|
||||
* FIXME - for now each cpu is a node by itself
|
||||
* -- no real support for striped mode
|
||||
**********
|
||||
*/
|
||||
int
|
||||
marvel_pa_to_nid(unsigned long pa)
|
||||
{
|
||||
int cpuid;
|
||||
|
||||
if ((pa >> 43) & 1) /* I/O */
|
||||
cpuid = (~(pa >> 35) & 0xff);
|
||||
else /* mem */
|
||||
cpuid = ((pa >> 34) & 0x3) | ((pa >> (37 - 2)) & (0x1f << 2));
|
||||
|
||||
return marvel_cpuid_to_nid(cpuid);
|
||||
}
|
||||
|
||||
int
|
||||
marvel_cpuid_to_nid(int cpuid)
|
||||
{
|
||||
return cpuid;
|
||||
}
|
||||
|
||||
unsigned long
|
||||
marvel_node_mem_start(int nid)
|
||||
{
|
||||
unsigned long pa;
|
||||
|
||||
pa = (nid & 0x3) | ((nid & (0x1f << 2)) << 1);
|
||||
pa <<= 34;
|
||||
|
||||
return pa;
|
||||
}
|
||||
|
||||
unsigned long
|
||||
marvel_node_mem_size(int nid)
|
||||
{
|
||||
return 16UL * 1024 * 1024 * 1024; /* 16GB */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* AGP GART Support.
|
||||
*/
|
||||
#include <linux/agp_backend.h>
|
||||
|
||||
@@ -434,39 +434,12 @@ wildfire_write_config(struct pci_bus *bus, unsigned int devfn, int where,
|
||||
return PCIBIOS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
struct pci_ops wildfire_pci_ops =
|
||||
struct pci_ops wildfire_pci_ops =
|
||||
{
|
||||
.read = wildfire_read_config,
|
||||
.write = wildfire_write_config,
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* NUMA Support
|
||||
*/
|
||||
int wildfire_pa_to_nid(unsigned long pa)
|
||||
{
|
||||
return pa >> 36;
|
||||
}
|
||||
|
||||
int wildfire_cpuid_to_nid(int cpuid)
|
||||
{
|
||||
/* assume 4 CPUs per node */
|
||||
return cpuid >> 2;
|
||||
}
|
||||
|
||||
unsigned long wildfire_node_mem_start(int nid)
|
||||
{
|
||||
/* 64GB per node */
|
||||
return (unsigned long)nid * (64UL * 1024 * 1024 * 1024);
|
||||
}
|
||||
|
||||
unsigned long wildfire_node_mem_size(int nid)
|
||||
{
|
||||
/* 64GB per node */
|
||||
return 64UL * 1024 * 1024 * 1024;
|
||||
}
|
||||
|
||||
#if DEBUG_DUMP_REGS
|
||||
|
||||
static void __init
|
||||
|
||||
@@ -71,33 +71,6 @@ iommu_arena_new_node(int nid, struct pci_controller *hose, dma_addr_t base,
|
||||
if (align < mem_size)
|
||||
align = mem_size;
|
||||
|
||||
|
||||
#ifdef CONFIG_DISCONTIGMEM
|
||||
|
||||
arena = memblock_alloc_node(sizeof(*arena), align, nid);
|
||||
if (!NODE_DATA(nid) || !arena) {
|
||||
printk("%s: couldn't allocate arena from node %d\n"
|
||||
" falling back to system-wide allocation\n",
|
||||
__func__, nid);
|
||||
arena = memblock_alloc(sizeof(*arena), SMP_CACHE_BYTES);
|
||||
if (!arena)
|
||||
panic("%s: Failed to allocate %zu bytes\n", __func__,
|
||||
sizeof(*arena));
|
||||
}
|
||||
|
||||
arena->ptes = memblock_alloc_node(sizeof(*arena), align, nid);
|
||||
if (!NODE_DATA(nid) || !arena->ptes) {
|
||||
printk("%s: couldn't allocate arena ptes from node %d\n"
|
||||
" falling back to system-wide allocation\n",
|
||||
__func__, nid);
|
||||
arena->ptes = memblock_alloc(mem_size, align);
|
||||
if (!arena->ptes)
|
||||
panic("%s: Failed to allocate %lu bytes align=0x%lx\n",
|
||||
__func__, mem_size, align);
|
||||
}
|
||||
|
||||
#else /* CONFIG_DISCONTIGMEM */
|
||||
|
||||
arena = memblock_alloc(sizeof(*arena), SMP_CACHE_BYTES);
|
||||
if (!arena)
|
||||
panic("%s: Failed to allocate %zu bytes\n", __func__,
|
||||
@@ -107,8 +80,6 @@ iommu_arena_new_node(int nid, struct pci_controller *hose, dma_addr_t base,
|
||||
panic("%s: Failed to allocate %lu bytes align=0x%lx\n",
|
||||
__func__, mem_size, align);
|
||||
|
||||
#endif /* CONFIG_DISCONTIGMEM */
|
||||
|
||||
spin_lock_init(&arena->lock);
|
||||
arena->hose = hose;
|
||||
arena->dma_base = base;
|
||||
|
||||
@@ -49,10 +49,6 @@ extern void marvel_init_arch(void);
|
||||
extern void marvel_kill_arch(int);
|
||||
extern void marvel_machine_check(unsigned long, unsigned long);
|
||||
extern void marvel_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t);
|
||||
extern int marvel_pa_to_nid(unsigned long);
|
||||
extern int marvel_cpuid_to_nid(int);
|
||||
extern unsigned long marvel_node_mem_start(int);
|
||||
extern unsigned long marvel_node_mem_size(int);
|
||||
extern struct _alpha_agp_info *marvel_agp_info(void);
|
||||
struct io7 *marvel_find_io7(int pe);
|
||||
struct io7 *marvel_next_io7(struct io7 *prev);
|
||||
@@ -101,10 +97,6 @@ extern void wildfire_init_arch(void);
|
||||
extern void wildfire_kill_arch(int);
|
||||
extern void wildfire_machine_check(unsigned long vector, unsigned long la_ptr);
|
||||
extern void wildfire_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t);
|
||||
extern int wildfire_pa_to_nid(unsigned long);
|
||||
extern int wildfire_cpuid_to_nid(int);
|
||||
extern unsigned long wildfire_node_mem_start(int);
|
||||
extern unsigned long wildfire_node_mem_size(int);
|
||||
|
||||
/* console.c */
|
||||
#ifdef CONFIG_VGA_HOSE
|
||||
|
||||
@@ -79,11 +79,6 @@ int alpha_l3_cacheshape;
|
||||
unsigned long alpha_verbose_mcheck = CONFIG_VERBOSE_MCHECK_ON;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
struct cpumask node_to_cpumask_map[MAX_NUMNODES] __read_mostly;
|
||||
EXPORT_SYMBOL(node_to_cpumask_map);
|
||||
#endif
|
||||
|
||||
/* Which processor we booted from. */
|
||||
int boot_cpuid;
|
||||
|
||||
@@ -305,7 +300,6 @@ move_initrd(unsigned long mem_limit)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_DISCONTIGMEM
|
||||
static void __init
|
||||
setup_memory(void *kernel_end)
|
||||
{
|
||||
@@ -389,9 +383,6 @@ setup_memory(void *kernel_end)
|
||||
}
|
||||
#endif /* CONFIG_BLK_DEV_INITRD */
|
||||
}
|
||||
#else
|
||||
extern void setup_memory(void *);
|
||||
#endif /* !CONFIG_DISCONTIGMEM */
|
||||
|
||||
int __init
|
||||
page_is_ram(unsigned long pfn)
|
||||
@@ -618,13 +609,6 @@ setup_arch(char **cmdline_p)
|
||||
"VERBOSE_MCHECK "
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_DISCONTIGMEM
|
||||
"DISCONTIGMEM "
|
||||
#ifdef CONFIG_NUMA
|
||||
"NUMA "
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_DEBUG_SPINLOCK
|
||||
"DEBUG_SPINLOCK "
|
||||
#endif
|
||||
|
||||
@@ -461,10 +461,5 @@ struct alpha_machine_vector marvel_ev7_mv __initmv = {
|
||||
.kill_arch = marvel_kill_arch,
|
||||
.pci_map_irq = marvel_map_irq,
|
||||
.pci_swizzle = common_swizzle,
|
||||
|
||||
.pa_to_nid = marvel_pa_to_nid,
|
||||
.cpuid_to_nid = marvel_cpuid_to_nid,
|
||||
.node_mem_start = marvel_node_mem_start,
|
||||
.node_mem_size = marvel_node_mem_size,
|
||||
};
|
||||
ALIAS_MV(marvel_ev7)
|
||||
|
||||
@@ -337,10 +337,5 @@ struct alpha_machine_vector wildfire_mv __initmv = {
|
||||
.kill_arch = wildfire_kill_arch,
|
||||
.pci_map_irq = wildfire_map_irq,
|
||||
.pci_swizzle = common_swizzle,
|
||||
|
||||
.pa_to_nid = wildfire_pa_to_nid,
|
||||
.cpuid_to_nid = wildfire_cpuid_to_nid,
|
||||
.node_mem_start = wildfire_node_mem_start,
|
||||
.node_mem_size = wildfire_node_mem_size,
|
||||
};
|
||||
ALIAS_MV(wildfire)
|
||||
|
||||
@@ -6,5 +6,3 @@
|
||||
ccflags-y := -Werror
|
||||
|
||||
obj-y := init.o fault.o
|
||||
|
||||
obj-$(CONFIG_DISCONTIGMEM) += numa.o
|
||||
|
||||
@@ -235,8 +235,6 @@ callback_init(void * kernel_end)
|
||||
return kernel_end;
|
||||
}
|
||||
|
||||
|
||||
#ifndef CONFIG_DISCONTIGMEM
|
||||
/*
|
||||
* paging_init() sets up the memory map.
|
||||
*/
|
||||
@@ -257,7 +255,6 @@ void __init paging_init(void)
|
||||
/* Initialize the kernel's ZERO_PGE. */
|
||||
memset((void *)ZERO_PGE, 0, PAGE_SIZE);
|
||||
}
|
||||
#endif /* CONFIG_DISCONTIGMEM */
|
||||
|
||||
#if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_SRM)
|
||||
void
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user