memblock: updates for 6.12-rc1
* new memblock_estimated_nr_free_pages() helper to replace totalram_pages() which is less accurate when CONFIG_DEFERRED_STRUCT_PAGE_INIT is set * fixes for memblock tests -----BEGIN PGP SIGNATURE----- iQFEBAABCgAuFiEEeOVYVaWZL5900a/pOQOGJssO/ZEFAmbejv0QHHJwcHRAa2Vy bmVsLm9yZwAKCRA5A4Ymyw79kVVlB/4yOoCDvJyUocEY0/Zv5bdRGXlAI0Igp3VV E0rEpvIjTBWwp/KZziQ8zMFk5zL/Aqb081vRsCko0lh2wjD5tFgNWWJG/sryQ/tX vc88p83KEXxNy4QC1qCh8dvHGIZVuLQ8oWQ7QFuH2ResdOaLdcfnobcu6/W/pBE0 60/0bNdNgFPgnCpFIcWvGFOqZ10akhw4xYrwRsCKAQEeqeKyQE/DBFUvNrqkOuNG +4k71X/9mcuEDBKGRCf5XzCf7nwk4k8pzOc4xMeEhAaaV2uZdENfQuu1Av7nqRah zhYveo0Wd0cnGWORBT/ddzPDeBjdP2ZM9qR70yoSj2mQ7a3ixLfd =wtsK -----END PGP SIGNATURE----- Merge tag 'memblock-v6.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rppt/memblock Pull memblock updates from Mike Rapoport: - new memblock_estimated_nr_free_pages() helper to replace totalram_pages() which is less accurate when CONFIG_DEFERRED_STRUCT_PAGE_INIT is set - fixes for memblock tests * tag 'memblock-v6.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rppt/memblock: s390/mm: get estimated free pages by memblock api kernel/fork.c: get estimated free pages by memblock api mm/memblock: introduce a new helper memblock_estimated_nr_free_pages() memblock test: fix implicit declaration of function 'strscpy' memblock test: fix implicit declaration of function 'isspace' memblock test: fix implicit declaration of function 'memparse' memblock test: add the definition of __setup() memblock test: fix implicit declaration of function 'virt_to_phys' tools/testing: abstract two init.h into common include directory memblock tests: include export.h in linkage.h as kernel dose memblock tests: include memory_hotplug.h in mmzone.h as kernel dose
This commit is contained in:
commit
aa486552a1
@ -62,7 +62,7 @@ EXPORT_SYMBOL(zero_page_mask);
|
||||
|
||||
static void __init setup_zero_pages(void)
|
||||
{
|
||||
unsigned long total_pages = PHYS_PFN(memblock_phys_mem_size() - memblock_reserved_size());
|
||||
unsigned long total_pages = memblock_estimated_nr_free_pages();
|
||||
unsigned int order;
|
||||
struct page *page;
|
||||
int i;
|
||||
|
@ -467,6 +467,7 @@ static inline __init_memblock bool memblock_bottom_up(void)
|
||||
|
||||
phys_addr_t memblock_phys_mem_size(void);
|
||||
phys_addr_t memblock_reserved_size(void);
|
||||
unsigned long memblock_estimated_nr_free_pages(void);
|
||||
phys_addr_t memblock_start_of_DRAM(void);
|
||||
phys_addr_t memblock_end_of_DRAM(void);
|
||||
void memblock_enforce_memory_limit(phys_addr_t memory_limit);
|
||||
|
@ -999,7 +999,7 @@ void __init __weak arch_task_cache_init(void) { }
|
||||
static void __init set_max_threads(unsigned int max_threads_suggested)
|
||||
{
|
||||
u64 threads;
|
||||
unsigned long nr_pages = PHYS_PFN(memblock_phys_mem_size() - memblock_reserved_size());
|
||||
unsigned long nr_pages = memblock_estimated_nr_free_pages();
|
||||
|
||||
/*
|
||||
* The number of threads shall be limited such that the thread
|
||||
|
@ -1731,6 +1731,23 @@ phys_addr_t __init_memblock memblock_reserved_size(void)
|
||||
return memblock.reserved.total_size;
|
||||
}
|
||||
|
||||
/**
|
||||
* memblock_estimated_nr_free_pages - return estimated number of free pages
|
||||
* from memblock point of view
|
||||
*
|
||||
* During bootup, subsystems might need a rough estimate of the number of free
|
||||
* pages in the whole system, before precise numbers are available from the
|
||||
* buddy. Especially with CONFIG_DEFERRED_STRUCT_PAGE_INIT, the numbers
|
||||
* obtained from the buddy might be very imprecise during bootup.
|
||||
*
|
||||
* Return:
|
||||
* An estimated number of free pages from memblock point of view.
|
||||
*/
|
||||
unsigned long __init memblock_estimated_nr_free_pages(void)
|
||||
{
|
||||
return PHYS_PFN(memblock_phys_mem_size() - memblock_reserved_size());
|
||||
}
|
||||
|
||||
/* lowest address */
|
||||
phys_addr_t __init_memblock memblock_start_of_DRAM(void)
|
||||
{
|
||||
|
@ -128,10 +128,6 @@
|
||||
# define unlikely(x) __builtin_expect(!!(x), 0)
|
||||
#endif
|
||||
|
||||
#ifndef __init
|
||||
# define __init
|
||||
#endif
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
/*
|
||||
|
@ -1,10 +1,16 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _LINUX_INIT_H
|
||||
#define _LINUX_INIT_H
|
||||
#ifndef _TOOLS_LINUX_INIT_H_
|
||||
#define _TOOLS_LINUX_INIT_H_
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <asm/export.h>
|
||||
#include <linux/memory_hotplug.h>
|
||||
|
||||
#ifndef __init
|
||||
# define __init
|
||||
#endif
|
||||
|
||||
#ifndef __exit
|
||||
# define __exit
|
||||
#endif
|
||||
|
||||
#define __section(section) __attribute__((__section__(section)))
|
||||
|
||||
@ -28,7 +34,10 @@ struct obs_kernel_param {
|
||||
__aligned(__alignof__(struct obs_kernel_param)) = \
|
||||
{ __setup_str_##unique_id, fn, early }
|
||||
|
||||
#define __setup(str, fn) \
|
||||
__setup_param(str, fn, fn, 0)
|
||||
|
||||
#define early_param(str, fn) \
|
||||
__setup_param(str, fn, fn, 1)
|
||||
|
||||
#endif
|
||||
#endif /* _TOOLS_LINUX_INIT_H_ */
|
@ -1,6 +1,8 @@
|
||||
#ifndef _TOOLS_INCLUDE_LINUX_LINKAGE_H
|
||||
#define _TOOLS_INCLUDE_LINUX_LINKAGE_H
|
||||
|
||||
#include <linux/export.h>
|
||||
|
||||
#define SYM_FUNC_START(x) .globl x; x:
|
||||
|
||||
#define SYM_FUNC_END(x)
|
||||
|
@ -25,6 +25,12 @@ static inline void *phys_to_virt(unsigned long address)
|
||||
return __va(address);
|
||||
}
|
||||
|
||||
#define virt_to_phys virt_to_phys
|
||||
static inline phys_addr_t virt_to_phys(volatile void *address)
|
||||
{
|
||||
return (phys_addr_t)address;
|
||||
}
|
||||
|
||||
void reserve_bootmem_region(phys_addr_t start, phys_addr_t end, int nid);
|
||||
|
||||
static inline void totalram_pages_inc(void)
|
||||
|
@ -7,4 +7,5 @@
|
||||
#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)
|
||||
#define PHYS_PFN(x) ((unsigned long)((x) >> PAGE_SHIFT))
|
||||
#endif
|
||||
|
@ -12,6 +12,8 @@ void argv_free(char **argv);
|
||||
|
||||
int strtobool(const char *s, bool *res);
|
||||
|
||||
#define strscpy strcpy
|
||||
|
||||
/*
|
||||
* glibc based builds needs the extern while uClibc doesn't.
|
||||
* However uClibc headers also define __GLIBC__ hence the hack below
|
||||
@ -49,4 +51,5 @@ extern char *strim(char *);
|
||||
extern void remove_spaces(char *s);
|
||||
|
||||
extern void *memchr_inv(const void *start, int c, size_t bytes);
|
||||
extern unsigned long long memparse(const char *ptr, char **retptr);
|
||||
#endif /* _TOOLS_LINUX_STRING_H_ */
|
||||
|
53
tools/lib/cmdline.c
Normal file
53
tools/lib/cmdline.c
Normal file
@ -0,0 +1,53 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* From lib/cmdline.c
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
|
||||
#if __has_attribute(__fallthrough__)
|
||||
# define fallthrough __attribute__((__fallthrough__))
|
||||
#else
|
||||
# define fallthrough do {} while (0) /* fallthrough */
|
||||
#endif
|
||||
|
||||
unsigned long long memparse(const char *ptr, char **retptr)
|
||||
{
|
||||
char *endptr; /* local pointer to end of parsed string */
|
||||
|
||||
unsigned long long ret = strtoll(ptr, &endptr, 0);
|
||||
|
||||
switch (*endptr) {
|
||||
case 'E':
|
||||
case 'e':
|
||||
ret <<= 10;
|
||||
fallthrough;
|
||||
case 'P':
|
||||
case 'p':
|
||||
ret <<= 10;
|
||||
fallthrough;
|
||||
case 'T':
|
||||
case 't':
|
||||
ret <<= 10;
|
||||
fallthrough;
|
||||
case 'G':
|
||||
case 'g':
|
||||
ret <<= 10;
|
||||
fallthrough;
|
||||
case 'M':
|
||||
case 'm':
|
||||
ret <<= 10;
|
||||
fallthrough;
|
||||
case 'K':
|
||||
case 'k':
|
||||
ret <<= 10;
|
||||
endptr++;
|
||||
fallthrough;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (retptr)
|
||||
*retptr = endptr;
|
||||
|
||||
return ret;
|
||||
}
|
@ -8,7 +8,7 @@ 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 tests/alloc_exact_nid_api.o
|
||||
DEP_OFILES = memblock.o lib/slab.o mmzone.o slab.o
|
||||
DEP_OFILES = memblock.o lib/slab.o mmzone.o slab.o cmdline.o
|
||||
OFILES = main.o $(DEP_OFILES) $(TEST_OFILES)
|
||||
EXTR_SRC = ../../../mm/memblock.c
|
||||
|
||||
|
@ -8,5 +8,7 @@
|
||||
#include <linux/printk.h>
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/kconfig.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/ctype.h>
|
||||
|
||||
#endif
|
||||
|
@ -3,6 +3,7 @@
|
||||
#define _TOOLS_MMZONE_H
|
||||
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/memory_hotplug.h>
|
||||
|
||||
struct pglist_data *first_online_pgdat(void);
|
||||
struct pglist_data *next_online_pgdat(struct pglist_data *pgdat);
|
||||
|
@ -14,7 +14,7 @@
|
||||
#include "test.h"
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include "linux/init.h"
|
||||
#include <linux/init.h>
|
||||
|
||||
#define module_init(x)
|
||||
#define module_exit(x)
|
||||
|
@ -1,2 +0,0 @@
|
||||
#define __init
|
||||
#define __exit
|
Loading…
Reference in New Issue
Block a user