mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 18:13:41 +02:00
thp_settings provides write_file() helper for safely writing to a file and exit when write failure happens. It's a very low level helper and many sub tests need such a helper, not only thp tests. split_huge_page_test also defines a write_file locally. The two have minior differences in return type and used exit api. And there would be conflicts if split_huge_page_test wanted to include thp_settings.h because of different prototype, making it less convenient. It's possisble to merge the two, although some tests don't use the kselftest infrastrucutre for testing. It would also work when using the ksft_exit_msg() to exit in my test, as the counters are all zero. Output will be like: TAP version 13 1..62 Bail out! /proc/sys/vm/drop_caches1 open failed: No such file or directory # Totals: pass:0 fail:0 xfail:0 xpass:0 skip:0 error:0 So here we just keep the version in split_huge_page_test, and move it into the vm_util. This makes it easy to maitain and user could just include one vm_util.h when they don't need thp setting helpers. Keep the prototype of void return as the function will exit on any error, return value is not necessary, and will simply the callers like write_num() and write_string(). Link: https://lore.kernel.org/20260402014543.1671131-4-chuhu@redhat.com Signed-off-by: Chunyu Hu <chuhu@redhat.com> Reviewed-by: Lorenzo Stoakes (Oracle) <ljs@kernel.org> Acked-by: David Hildenbrand (Arm) <david@kernel.org> Reviewed-by: Zi Yan <ziy@nvidia.com> Acked-by: Mike Rapoport (Microsoft) <rppt@kernel.org> Suggested-by: Mike Rapoport <rppt@kernel.org> Cc: Nico Pache <npache@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
90 lines
2.1 KiB
C
90 lines
2.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __THP_SETTINGS_H__
|
|
#define __THP_SETTINGS_H__
|
|
|
|
#include <stdbool.h>
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
enum thp_enabled {
|
|
THP_NEVER,
|
|
THP_ALWAYS,
|
|
THP_INHERIT,
|
|
THP_MADVISE,
|
|
};
|
|
|
|
enum thp_defrag {
|
|
THP_DEFRAG_ALWAYS,
|
|
THP_DEFRAG_DEFER,
|
|
THP_DEFRAG_DEFER_MADVISE,
|
|
THP_DEFRAG_MADVISE,
|
|
THP_DEFRAG_NEVER,
|
|
};
|
|
|
|
enum shmem_enabled {
|
|
SHMEM_NEVER,
|
|
SHMEM_ALWAYS,
|
|
SHMEM_WITHIN_SIZE,
|
|
SHMEM_ADVISE,
|
|
SHMEM_INHERIT,
|
|
SHMEM_DENY,
|
|
SHMEM_FORCE,
|
|
};
|
|
|
|
#define NR_ORDERS 20
|
|
|
|
struct hugepages_settings {
|
|
enum thp_enabled enabled;
|
|
};
|
|
|
|
struct khugepaged_settings {
|
|
bool defrag;
|
|
unsigned int alloc_sleep_millisecs;
|
|
unsigned int scan_sleep_millisecs;
|
|
unsigned int max_ptes_none;
|
|
unsigned int max_ptes_swap;
|
|
unsigned int max_ptes_shared;
|
|
unsigned long pages_to_scan;
|
|
};
|
|
|
|
struct shmem_hugepages_settings {
|
|
enum shmem_enabled enabled;
|
|
};
|
|
|
|
struct thp_settings {
|
|
enum thp_enabled thp_enabled;
|
|
enum thp_defrag thp_defrag;
|
|
enum shmem_enabled shmem_enabled;
|
|
bool use_zero_page;
|
|
struct khugepaged_settings khugepaged;
|
|
unsigned long read_ahead_kb;
|
|
struct hugepages_settings hugepages[NR_ORDERS];
|
|
struct shmem_hugepages_settings shmem_hugepages[NR_ORDERS];
|
|
};
|
|
|
|
int read_file(const char *path, char *buf, size_t buflen);
|
|
unsigned long read_num(const char *path);
|
|
void write_num(const char *path, unsigned long num);
|
|
|
|
int thp_read_string(const char *name, const char * const strings[]);
|
|
void thp_write_string(const char *name, const char *val);
|
|
unsigned long thp_read_num(const char *name);
|
|
void thp_write_num(const char *name, unsigned long num);
|
|
|
|
void thp_write_settings(struct thp_settings *settings);
|
|
void thp_read_settings(struct thp_settings *settings);
|
|
struct thp_settings *thp_current_settings(void);
|
|
void thp_push_settings(struct thp_settings *settings);
|
|
void thp_pop_settings(void);
|
|
void thp_restore_settings(void);
|
|
void thp_save_settings(void);
|
|
|
|
void thp_set_read_ahead_path(char *path);
|
|
unsigned long thp_supported_orders(void);
|
|
unsigned long thp_shmem_supported_orders(void);
|
|
|
|
bool thp_available(void);
|
|
bool thp_is_enabled(void);
|
|
|
|
#endif /* __THP_SETTINGS_H__ */
|