mirror of
https://github.com/ukui/kernel.git
synced 2026-03-09 10:07:04 -07:00
Merge tag 'memblock-v5.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rppt/memblock
Pull memblock updates from Mike Rapoport: "Test suite and a small cleanup: - A small cleanup of unused variable in __next_mem_pfn_range_in_zone - Initial test suite to simulate memblock behaviour in userspace" * tag 'memblock-v5.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rppt/memblock: (27 commits) memblock tests: Add TODO and README files memblock tests: Add memblock_alloc_try_nid tests for bottom up memblock tests: Add memblock_alloc_try_nid tests for top down memblock tests: Add memblock_alloc_from tests for bottom up memblock tests: Add memblock_alloc_from tests for top down memblock tests: Add memblock_alloc tests for bottom up memblock tests: Add memblock_alloc tests for top down memblock tests: Add simulation of physical memory memblock tests: Split up reset_memblock function memblock tests: Fix testing with 32-bit physical addresses memblock: __next_mem_pfn_range_in_zone: remove unneeded local variable nid memblock tests: Add memblock_free tests memblock tests: Add memblock_add_node test memblock tests: Add memblock_remove tests memblock tests: Add memblock_reserve tests memblock tests: Add memblock_add tests memblock tests: Add memblock reset function memblock tests: Add skeleton of the memblock simulator tools/include: Add debugfs.h stub tools/include: Add pfn.h stub ...
This commit is contained in:
@@ -12550,6 +12550,7 @@ S: Maintained
|
||||
F: Documentation/core-api/boot-time-mm.rst
|
||||
F: include/linux/memblock.h
|
||||
F: mm/memblock.c
|
||||
F: tools/testing/memblock/
|
||||
|
||||
MEMORY CONTROLLER DRIVERS
|
||||
M: Krzysztof Kozlowski <krzk@kernel.org>
|
||||
|
||||
@@ -1284,11 +1284,10 @@ __next_mem_pfn_range_in_zone(u64 *idx, struct zone *zone,
|
||||
{
|
||||
int zone_nid = zone_to_nid(zone);
|
||||
phys_addr_t spa, epa;
|
||||
int nid;
|
||||
|
||||
__next_mem_range(idx, zone_nid, MEMBLOCK_NONE,
|
||||
&memblock.memory, &memblock.reserved,
|
||||
&spa, &epa, &nid);
|
||||
&spa, &epa, NULL);
|
||||
|
||||
while (*idx != U64_MAX) {
|
||||
unsigned long epfn = PFN_DOWN(epa);
|
||||
@@ -1315,7 +1314,7 @@ __next_mem_pfn_range_in_zone(u64 *idx, struct zone *zone,
|
||||
|
||||
__next_mem_range(idx, zone_nid, MEMBLOCK_NONE,
|
||||
&memblock.memory, &memblock.reserved,
|
||||
&spa, &epa, &nid);
|
||||
&spa, &epa, NULL);
|
||||
}
|
||||
|
||||
/* signal end of iteration */
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
|
||||
#include <asm/atomic.h>
|
||||
|
||||
void atomic_long_set(atomic_long_t *v, long i);
|
||||
|
||||
/* atomic_cmpxchg_relaxed */
|
||||
#ifndef atomic_cmpxchg_relaxed
|
||||
#define atomic_cmpxchg_relaxed atomic_cmpxchg
|
||||
|
||||
10
tools/include/linux/cache.h
Normal file
10
tools/include/linux/cache.h
Normal file
@@ -0,0 +1,10 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _TOOLS_LINUX_CACHE_H
|
||||
#define _TOOLS_LINUX_CACHE_H
|
||||
|
||||
#define L1_CACHE_SHIFT 5
|
||||
#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)
|
||||
|
||||
#define SMP_CACHE_BYTES L1_CACHE_BYTES
|
||||
|
||||
#endif
|
||||
5
tools/include/linux/debugfs.h
Normal file
5
tools/include/linux/debugfs.h
Normal file
@@ -0,0 +1,5 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _TOOLS_DEBUGFS_H
|
||||
#define _TOOLS_DEBUGFS_H
|
||||
|
||||
#endif
|
||||
@@ -1,4 +1,32 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _TOOLS_INCLUDE_LINUX_GFP_H
|
||||
#define _TOOLS_INCLUDE_LINUX_GFP_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#define __GFP_BITS_SHIFT 26
|
||||
#define __GFP_BITS_MASK ((gfp_t)((1 << __GFP_BITS_SHIFT) - 1))
|
||||
|
||||
#define __GFP_HIGH 0x20u
|
||||
#define __GFP_IO 0x40u
|
||||
#define __GFP_FS 0x80u
|
||||
#define __GFP_NOWARN 0x200u
|
||||
#define __GFP_ZERO 0x8000u
|
||||
#define __GFP_ATOMIC 0x80000u
|
||||
#define __GFP_ACCOUNT 0x100000u
|
||||
#define __GFP_DIRECT_RECLAIM 0x400000u
|
||||
#define __GFP_KSWAPD_RECLAIM 0x2000000u
|
||||
|
||||
#define __GFP_RECLAIM (__GFP_DIRECT_RECLAIM | __GFP_KSWAPD_RECLAIM)
|
||||
|
||||
#define GFP_ZONEMASK 0x0fu
|
||||
#define GFP_ATOMIC (__GFP_HIGH | __GFP_ATOMIC | __GFP_KSWAPD_RECLAIM)
|
||||
#define GFP_KERNEL (__GFP_RECLAIM | __GFP_IO | __GFP_FS)
|
||||
#define GFP_NOWAIT (__GFP_KSWAPD_RECLAIM)
|
||||
|
||||
static inline bool gfpflags_allow_blocking(const gfp_t gfp_flags)
|
||||
{
|
||||
return !!(gfp_flags & __GFP_DIRECT_RECLAIM);
|
||||
}
|
||||
|
||||
#endif /* _TOOLS_INCLUDE_LINUX_GFP_H */
|
||||
|
||||
5
tools/include/linux/io.h
Normal file
5
tools/include/linux/io.h
Normal file
@@ -0,0 +1,5 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _TOOLS_IO_H
|
||||
#define _TOOLS_IO_H
|
||||
|
||||
#endif
|
||||
@@ -15,6 +15,8 @@
|
||||
#define UINT_MAX (~0U)
|
||||
#endif
|
||||
|
||||
#define _RET_IP_ ((unsigned long)__builtin_return_address(0))
|
||||
|
||||
#define PERF_ALIGN(x, a) __PERF_ALIGN_MASK(x, (typeof(x))(a)-1)
|
||||
#define __PERF_ALIGN_MASK(x, mask) (((x)+(mask))&~(mask))
|
||||
|
||||
@@ -51,6 +53,10 @@
|
||||
_min1 < _min2 ? _min1 : _min2; })
|
||||
#endif
|
||||
|
||||
#define max_t(type, x, y) max((type)x, (type)y)
|
||||
#define min_t(type, x, y) min((type)x, (type)y)
|
||||
#define clamp(val, lo, hi) min((typeof(val))max(val, lo), hi)
|
||||
|
||||
#ifndef BUG_ON
|
||||
#ifdef NDEBUG
|
||||
#define BUG_ON(cond) do { if (cond) {} } while (0)
|
||||
|
||||
42
tools/include/linux/mm.h
Normal file
42
tools/include/linux/mm.h
Normal file
@@ -0,0 +1,42 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _TOOLS_LINUX_MM_H
|
||||
#define _TOOLS_LINUX_MM_H
|
||||
|
||||
#include <linux/mmzone.h>
|
||||
#include <uapi/linux/const.h>
|
||||
|
||||
#define PAGE_SHIFT 12
|
||||
#define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT)
|
||||
#define PAGE_MASK (~(PAGE_SIZE - 1))
|
||||
|
||||
#define PHYS_ADDR_MAX (~(phys_addr_t)0)
|
||||
|
||||
#define __ALIGN_KERNEL(x, a) __ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1)
|
||||
#define __ALIGN_KERNEL_MASK(x, mask) (((x) + (mask)) & ~(mask))
|
||||
#define ALIGN(x, a) __ALIGN_KERNEL((x), (a))
|
||||
#define ALIGN_DOWN(x, a) __ALIGN_KERNEL((x) - ((a) - 1), (a))
|
||||
|
||||
#define PAGE_ALIGN(addr) ALIGN(addr, PAGE_SIZE)
|
||||
|
||||
#define __va(x) ((void *)((unsigned long)(x)))
|
||||
#define __pa(x) ((unsigned long)(x))
|
||||
|
||||
#define pfn_to_page(pfn) ((void *)((pfn) * PAGE_SIZE))
|
||||
|
||||
#define phys_to_virt phys_to_virt
|
||||
static inline void *phys_to_virt(unsigned long address)
|
||||
{
|
||||
return __va(address);
|
||||
}
|
||||
|
||||
void reserve_bootmem_region(phys_addr_t start, phys_addr_t end);
|
||||
|
||||
static inline void totalram_pages_inc(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void totalram_pages_add(long count)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
10
tools/include/linux/pfn.h
Normal file
10
tools/include/linux/pfn.h
Normal file
@@ -0,0 +1,10 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _TOOLS_LINUX_PFN_H_
|
||||
#define _TOOLS_LINUX_PFN_H_
|
||||
|
||||
#include <linux/mm.h>
|
||||
|
||||
#define PFN_UP(x) (((x) + PAGE_SIZE - 1) >> PAGE_SHIFT)
|
||||
#define PFN_DOWN(x) ((x) >> PAGE_SHIFT)
|
||||
#define PFN_PHYS(x) ((phys_addr_t)(x) << PAGE_SHIFT)
|
||||
#endif
|
||||
@@ -1,20 +1,31 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef SLAB_H
|
||||
#define SLAB_H
|
||||
#ifndef _TOOLS_SLAB_H
|
||||
#define _TOOLS_SLAB_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/gfp.h>
|
||||
|
||||
#define SLAB_HWCACHE_ALIGN 1
|
||||
#define SLAB_PANIC 2
|
||||
#define SLAB_RECLAIM_ACCOUNT 0x00020000UL /* Objects are reclaimable */
|
||||
|
||||
void *kmalloc(size_t size, gfp_t);
|
||||
void kfree(void *);
|
||||
#define kzalloc_node(size, flags, node) kmalloc(size, flags)
|
||||
|
||||
void *kmalloc(size_t size, gfp_t gfp);
|
||||
void kfree(void *p);
|
||||
|
||||
bool slab_is_available(void);
|
||||
|
||||
enum slab_state {
|
||||
DOWN,
|
||||
PARTIAL,
|
||||
PARTIAL_NODE,
|
||||
UP,
|
||||
FULL
|
||||
};
|
||||
|
||||
static inline void *kzalloc(size_t size, gfp_t gfp)
|
||||
{
|
||||
return kmalloc(size, gfp | __GFP_ZERO);
|
||||
return kmalloc(size, gfp | __GFP_ZERO);
|
||||
}
|
||||
|
||||
void *kmem_cache_alloc(struct kmem_cache *cachep, int flags);
|
||||
@@ -24,4 +35,4 @@ struct kmem_cache *kmem_cache_create(const char *name, unsigned int size,
|
||||
unsigned int align, unsigned int flags,
|
||||
void (*ctor)(void *));
|
||||
|
||||
#endif /* SLAB_H */
|
||||
#endif /* _TOOLS_SLAB_H */
|
||||
@@ -63,10 +63,20 @@ typedef __u64 __bitwise __be64;
|
||||
typedef __u16 __bitwise __sum16;
|
||||
typedef __u32 __bitwise __wsum;
|
||||
|
||||
#ifdef CONFIG_PHYS_ADDR_T_64BIT
|
||||
typedef u64 phys_addr_t;
|
||||
#else
|
||||
typedef u32 phys_addr_t;
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
int counter;
|
||||
} atomic_t;
|
||||
|
||||
typedef struct {
|
||||
long counter;
|
||||
} atomic_long_t;
|
||||
|
||||
#ifndef __aligned_u64
|
||||
# define __aligned_u64 __u64 __attribute__((aligned(8)))
|
||||
#endif
|
||||
|
||||
38
tools/lib/slab.c
Normal file
38
tools/lib/slab.c
Normal file
@@ -0,0 +1,38 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <urcu/uatomic.h>
|
||||
#include <linux/slab.h>
|
||||
#include <malloc.h>
|
||||
#include <linux/gfp.h>
|
||||
|
||||
int kmalloc_nr_allocated;
|
||||
int kmalloc_verbose;
|
||||
|
||||
void *kmalloc(size_t size, gfp_t gfp)
|
||||
{
|
||||
void *ret;
|
||||
|
||||
if (!(gfp & __GFP_DIRECT_RECLAIM))
|
||||
return NULL;
|
||||
|
||||
ret = malloc(size);
|
||||
uatomic_inc(&kmalloc_nr_allocated);
|
||||
if (kmalloc_verbose)
|
||||
printf("Allocating %p from malloc\n", ret);
|
||||
if (gfp & __GFP_ZERO)
|
||||
memset(ret, 0, size);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void kfree(void *p)
|
||||
{
|
||||
if (!p)
|
||||
return;
|
||||
uatomic_dec(&kmalloc_nr_allocated);
|
||||
if (kmalloc_verbose)
|
||||
printf("Freeing %p to malloc\n", p);
|
||||
free(p);
|
||||
}
|
||||
4
tools/testing/memblock/.gitignore
vendored
Normal file
4
tools/testing/memblock/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
main
|
||||
memblock.c
|
||||
linux/memblock.h
|
||||
asm/cmpxchg.h
|
||||
55
tools/testing/memblock/Makefile
Normal file
55
tools/testing/memblock/Makefile
Normal file
@@ -0,0 +1,55 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
# Memblock simulator requires AddressSanitizer (libasan) and liburcu development
|
||||
# packages installed
|
||||
CFLAGS += -I. -I../../include -Wall -O2 -fsanitize=address \
|
||||
-fsanitize=undefined -D CONFIG_PHYS_ADDR_T_64BIT
|
||||
LDFLAGS += -fsanitize=address -fsanitize=undefined
|
||||
TARGETS = main
|
||||
TEST_OFILES = tests/alloc_nid_api.o tests/alloc_helpers_api.o tests/alloc_api.o \
|
||||
tests/basic_api.o tests/common.o
|
||||
DEP_OFILES = memblock.o lib/slab.o mmzone.o slab.o
|
||||
OFILES = main.o $(DEP_OFILES) $(TEST_OFILES)
|
||||
EXTR_SRC = ../../../mm/memblock.c
|
||||
|
||||
ifeq ($(BUILD), 32)
|
||||
CFLAGS += -m32
|
||||
LDFLAGS += -m32
|
||||
endif
|
||||
|
||||
# Process user parameters
|
||||
include scripts/Makefile.include
|
||||
|
||||
main: $(OFILES)
|
||||
|
||||
$(OFILES): include
|
||||
|
||||
include: ../../../include/linux/memblock.h ../../include/linux/*.h \
|
||||
../../include/asm/*.h
|
||||
|
||||
@mkdir -p linux
|
||||
test -L linux/memblock.h || ln -s ../../../../include/linux/memblock.h linux/memblock.h
|
||||
test -L asm/cmpxchg.h || ln -s ../../../arch/x86/include/asm/cmpxchg.h asm/cmpxchg.h
|
||||
|
||||
memblock.c: $(EXTR_SRC)
|
||||
test -L memblock.c || ln -s $(EXTR_SRC) memblock.c
|
||||
|
||||
clean:
|
||||
$(RM) $(TARGETS) $(OFILES) linux/memblock.h memblock.c asm/cmpxchg.h
|
||||
|
||||
help:
|
||||
@echo 'Memblock simulator'
|
||||
@echo ''
|
||||
@echo 'Available targets:'
|
||||
@echo ' main - Build the memblock simulator'
|
||||
@echo ' clean - Remove generated files and symlinks in the directory'
|
||||
@echo ''
|
||||
@echo 'Configuration:'
|
||||
@echo ' make NUMA=1 - simulate enabled NUMA'
|
||||
@echo ' make MOVABLE_NODE=1 - override `movable_node_is_enabled`'
|
||||
@echo ' definition to simulate movable NUMA nodes'
|
||||
@echo ' make 32BIT_PHYS_ADDR_T=1 - Use 32 bit physical addresses'
|
||||
|
||||
vpath %.c ../../lib
|
||||
|
||||
.PHONY: clean include help
|
||||
107
tools/testing/memblock/README
Normal file
107
tools/testing/memblock/README
Normal file
@@ -0,0 +1,107 @@
|
||||
==================
|
||||
Memblock simulator
|
||||
==================
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
Memblock is a boot time memory allocator[1] that manages memory regions before
|
||||
the actual memory management is initialized. Its APIs allow to register physical
|
||||
memory regions, mark them as available or reserved, allocate a block of memory
|
||||
within the requested range and/or in specific NUMA node, and many more.
|
||||
|
||||
Because it is used so early in the booting process, testing and debugging it is
|
||||
difficult. This test suite, usually referred as memblock simulator, is
|
||||
an attempt at testing the memblock mechanism. It runs one monolithic test that
|
||||
consist of a series of checks that exercise both the basic operations and
|
||||
allocation functionalities of memblock. The main data structure of the boot time
|
||||
memory allocator is initialized at the build time, so the checks here reuse its
|
||||
instance throughout the duration of the test. To ensure that tests don't affect
|
||||
each other, region arrays are reset in between.
|
||||
|
||||
As this project uses the actual memblock code and has to run in user space,
|
||||
some of the kernel definitions were stubbed by the initial commit that
|
||||
introduced memblock simulator (commit 16802e55dea9 ("memblock tests: Add
|
||||
skeleton of the memblock simulator")) and a few preparation commits just
|
||||
before it. Most of them don't match the kernel implementation, so one should
|
||||
consult them first before making any significant changes to the project.
|
||||
|
||||
Usage
|
||||
=====
|
||||
|
||||
To run the tests, build the main target and run it:
|
||||
|
||||
$ make && ./main
|
||||
|
||||
A successful run produces no output. It is also possible to override different
|
||||
configuration parameters. For example, to simulate enabled NUMA, use:
|
||||
|
||||
$ make NUMA=1
|
||||
|
||||
For the full list of options, see `make help`.
|
||||
|
||||
Project structure
|
||||
=================
|
||||
|
||||
The project has one target, main, which calls a group of checks for basic and
|
||||
allocation functions. Tests for each group are defined in dedicated files, as it
|
||||
can be seen here:
|
||||
|
||||
memblock
|
||||
|-- asm ------------------,
|
||||
|-- lib |-- implement function and struct stubs
|
||||
|-- linux ------------------'
|
||||
|-- scripts
|
||||
| |-- Makefile.include -- handles `make` parameters
|
||||
|-- tests
|
||||
| |-- alloc_api.(c|h) -- memblock_alloc tests
|
||||
| |-- alloc_helpers_api.(c|h) -- memblock_alloc_from tests
|
||||
| |-- alloc_nid_api.(c|h) -- memblock_alloc_try_nid tests
|
||||
| |-- basic_api.(c|h) -- memblock_add/memblock_reserve/... tests
|
||||
| |-- common.(c|h) -- helper functions for resetting memblock;
|
||||
|-- main.c --------------. dummy physical memory definition
|
||||
|-- Makefile `- test runner
|
||||
|-- README
|
||||
|-- TODO
|
||||
|-- .gitignore
|
||||
|
||||
Simulating physical memory
|
||||
==========================
|
||||
|
||||
Some allocation functions clear the memory in the process, so it is required for
|
||||
memblock to track valid memory ranges. To achieve this, the test suite registers
|
||||
with memblock memory stored by test_memory struct. It is a small wrapper that
|
||||
points to a block of memory allocated via malloc. For each group of allocation
|
||||
tests, dummy physical memory is allocated, added to memblock, and then released
|
||||
at the end of the test run. The structure of a test runner checking allocation
|
||||
functions is as follows:
|
||||
|
||||
int memblock_alloc_foo_checks(void)
|
||||
{
|
||||
reset_memblock_attributes(); /* data structure reset */
|
||||
dummy_physical_memory_init(); /* allocate and register memory */
|
||||
|
||||
(...allocation checks...)
|
||||
|
||||
dummy_physical_memory_cleanup(); /* free the memory */
|
||||
}
|
||||
|
||||
There's no need to explicitly free the dummy memory from memblock via
|
||||
memblock_free() call. The entry will be erased by reset_memblock_regions(),
|
||||
called at the beginning of each test.
|
||||
|
||||
Known issues
|
||||
============
|
||||
|
||||
1. Requesting a specific NUMA node via memblock_alloc_node() does not work as
|
||||
intended. Once the fix is in place, tests for this function can be added.
|
||||
|
||||
2. Tests for memblock_alloc_low() can't be easily implemented. The function uses
|
||||
ARCH_LOW_ADDRESS_LIMIT marco, which can't be changed to point at the low
|
||||
memory of the memory_block.
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
1. Boot time memory management documentation page:
|
||||
https://www.kernel.org/doc/html/latest/core-api/boot-time-mm.html
|
||||
28
tools/testing/memblock/TODO
Normal file
28
tools/testing/memblock/TODO
Normal file
@@ -0,0 +1,28 @@
|
||||
TODO
|
||||
=====
|
||||
|
||||
1. Add verbose output (e.g., what is being tested and how many tests cases are
|
||||
passing)
|
||||
|
||||
2. Add flags to Makefile:
|
||||
+ verbosity level
|
||||
+ enable memblock_dbg() messages (i.e. pass "-D CONFIG_DEBUG_MEMORY_INIT"
|
||||
flag)
|
||||
|
||||
3. Add tests trying to memblock_add() or memblock_reserve() 129th region.
|
||||
This will trigger memblock_double_array(), make sure it succeeds.
|
||||
*Important:* These tests require valid memory ranges, use dummy physical
|
||||
memory block from common.c to implement them. It is also very
|
||||
likely that the current MEM_SIZE won't be enough for these
|
||||
test cases. Use realloc to adjust the size accordingly.
|
||||
|
||||
4. Add test cases using this functions (implement them for both directions):
|
||||
+ memblock_alloc_raw()
|
||||
+ memblock_alloc_exact_nid_raw()
|
||||
+ memblock_alloc_try_nid_raw()
|
||||
|
||||
5. Add tests for memblock_alloc_node() to check if the correct NUMA node is set
|
||||
for the new region
|
||||
|
||||
6. Update comments in tests/basic_api.c to match the style used in
|
||||
tests/alloc_*.c
|
||||
5
tools/testing/memblock/asm/dma.h
Normal file
5
tools/testing/memblock/asm/dma.h
Normal file
@@ -0,0 +1,5 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _TOOLS_DMA_H
|
||||
#define _TOOLS_DMA_H
|
||||
|
||||
#endif
|
||||
12
tools/testing/memblock/internal.h
Normal file
12
tools/testing/memblock/internal.h
Normal file
@@ -0,0 +1,12 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
#ifndef _MM_INTERNAL_H
|
||||
#define _MM_INTERNAL_H
|
||||
|
||||
struct page {};
|
||||
|
||||
void memblock_free_pages(struct page *page, unsigned long pfn,
|
||||
unsigned int order)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
9
tools/testing/memblock/lib/slab.c
Normal file
9
tools/testing/memblock/lib/slab.c
Normal file
@@ -0,0 +1,9 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <linux/slab.h>
|
||||
|
||||
enum slab_state slab_state;
|
||||
|
||||
bool slab_is_available(void)
|
||||
{
|
||||
return slab_state >= UP;
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user