* [LTP] [PATCH 1/3] libltpswap: Add get_maxswapfiles api
@ 2023-12-05 6:16 Yang Xu
2023-12-05 6:16 ` [LTP] [PATCH 2/3] syscalls/swapon03: Use get_maxswapfiles() api instead of hard code Yang Xu
` (3 more replies)
0 siblings, 4 replies; 22+ messages in thread
From: Yang Xu @ 2023-12-05 6:16 UTC (permalink / raw)
To: ltp
Current, the kernel constant MAX_SWAPFILES value is calculated as below
------------------------------------
//#ifdef CONFIG_DEVICE_PRIVATE
//#define SWP_DEVICE_NUM 4
//#else
//#define SWP_DEVICE_NUM 0
//#endif
//#ifdef CONFIG_MIGRATION
//#define SWP_MIGRATION_NUM 3
//#else
//#define SWP_MIGRATION_NUM 0
//#ifdef CONFIG_MEMORY_FAILURE
//#define SWP_HWPOISON_NUM 1
//#else
//#define SWP_HWPOISON_NUM 0
//#endif
//#define SWP_PTE_MARKER_NUM 1
//#define MAX_SWAPFILES_SHIFT 5
//#define MAX_SWAPFILES \
// ((1 << MAX_SWAPFILES_SHIFT) - SWP_DEVICE_NUM - \
// SWP_MIGRATION_NUM - SWP_HWPOISON_NUM - \
// SWP_PTE_MARKER_NUM)
------------------------------------
Also, man-pages missed something after 5.14 kernel. I have sent two patches to
add it.
Signed-off-by: Yang Xu <xuyang2018.jy@fujitsu.com>
---
include/libswap.h | 6 ++++++
libs/libltpswap/libswap.c | 41 +++++++++++++++++++++++++++++++++++++++
2 files changed, 47 insertions(+)
diff --git a/include/libswap.h b/include/libswap.h
index d4b5301a5..2cab1047d 100644
--- a/include/libswap.h
+++ b/include/libswap.h
@@ -21,4 +21,10 @@ int make_swapfile(const char *swapfile, int safe);
* we are testing on.
*/
void is_swap_supported(const char *filename);
+
+/*
+ * Get kernel constant MAX_SWAPFILES value
+ */
+unsigned int get_maxswapfiles(void);
+
#endif /* __LIBSWAP_H__ */
diff --git a/libs/libltpswap/libswap.c b/libs/libltpswap/libswap.c
index a4427736f..54317c627 100644
--- a/libs/libltpswap/libswap.c
+++ b/libs/libltpswap/libswap.c
@@ -11,6 +11,7 @@
#include "tst_test.h"
#include "libswap.h"
#include "lapi/syscalls.h"
+#include "tst_kconfig.h"
/*
* Make a swap file
@@ -63,3 +64,43 @@ void is_swap_supported(const char *filename)
if (TST_RET == -1)
tst_brk(TFAIL | TTERRNO, "swapoff on %s failed", fstype);
}
+
+/*
+ * Get kernel constant MAX_SWAPFILES value
+ */
+unsigned int get_maxswapfiles(void)
+{
+ unsigned int max_swapfile = 32;
+ unsigned int swp_migration_num = 0, swp_hwpoison_num = 0, swp_device_num = 0, swp_pte_marker_num = 0;
+ struct tst_kconfig_var migration_kconfig = TST_KCONFIG_INIT("CONFIG_MIGRATION");
+ struct tst_kconfig_var memory_kconfig = TST_KCONFIG_INIT("CONFIG_MEMORY_FAILURE");
+ struct tst_kconfig_var device_kconfig = TST_KCONFIG_INIT("CONFIG_DEVICE_PRIVATE");
+ struct tst_kconfig_var marker_kconfig = TST_KCONFIG_INIT("CONFIG_PTE_MARKER");
+
+ tst_kconfig_read(&migration_kconfig, 1);
+ tst_kconfig_read(&memory_kconfig, 1);
+ tst_kconfig_read(&device_kconfig, 1);
+ tst_kconfig_read(&marker_kconfig, 1);
+
+ if (migration_kconfig.choice == 'y') {
+ if (tst_kvercmp(5, 19, 0) < 0)
+ swp_migration_num = 2;
+ else
+ swp_migration_num = 3;
+ }
+
+ if (memory_kconfig.choice == 'y')
+ swp_hwpoison_num = 1;
+
+ if (device_kconfig.choice == 'y') {
+ if (tst_kvercmp(5, 14, 0) >= 0)
+ swp_device_num = 4;
+ }
+
+ if (marker_kconfig.choice == 'y') {
+ if (tst_kvercmp(5, 19, 0) < 0)
+ swp_pte_marker_num = 1;
+ }
+
+ return max_swapfile - swp_migration_num - swp_hwpoison_num - swp_device_num - swp_pte_marker_num;
+}
--
2.27.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 22+ messages in thread* [LTP] [PATCH 2/3] syscalls/swapon03: Use get_maxswapfiles() api instead of hard code 2023-12-05 6:16 [LTP] [PATCH 1/3] libltpswap: Add get_maxswapfiles api Yang Xu @ 2023-12-05 6:16 ` Yang Xu 2023-12-22 1:39 ` Yang Xu (Fujitsu) 2023-12-05 6:16 ` [LTP] [PATCH 3/3] swaponoff.h: Remove useless header Yang Xu ` (2 subsequent siblings) 3 siblings, 1 reply; 22+ messages in thread From: Yang Xu @ 2023-12-05 6:16 UTC (permalink / raw) To: ltp Signed-off-by: Yang Xu <xuyang2018.jy@fujitsu.com> --- testcases/kernel/syscalls/swapon/swapon03.c | 47 +++------------------ 1 file changed, 6 insertions(+), 41 deletions(-) diff --git a/testcases/kernel/syscalls/swapon/swapon03.c b/testcases/kernel/syscalls/swapon/swapon03.c index dc633ebc6..744fca3d1 100644 --- a/testcases/kernel/syscalls/swapon/swapon03.c +++ b/testcases/kernel/syscalls/swapon/swapon03.c @@ -19,14 +19,12 @@ #include "tst_test.h" #include "lapi/syscalls.h" -#include "swaponoff.h" #include "libswap.h" static int setup_swap(void); static int clean_swap(void); static int check_and_swapoff(const char *filename); - -static int swapfiles; +static int swapfiles, max_swapfiles; int testfiles = 3; static struct swap_testfile_t { @@ -57,47 +55,13 @@ static void verify_swapon(void) "(%d). System reboot recommended.", expected_errno); } else { - /* Probably the system supports MAX_SWAPFILES > 30, - * let's try with MAX_SWAPFILES == 32 */ - - /* Call swapon sys call once again for 32 - * now we can't receive an error */ - TEST(tst_syscall(__NR_swapon, swap_testfiles[1].filename, 0)); - - /* Check return code (now we're expecting success) */ - if (TST_RET < 0) { - tst_res(TFAIL | TTERRNO, - "swapon(2) got an unexpected failure"); - } else { - /* Call swapon sys call once again for 33 - * now we have to receive an error */ - TEST(tst_syscall(__NR_swapon, swap_testfiles[2].filename, 0)); - - /* Check return code (should be an error) */ - if ((TST_RET == -1) && (TST_ERR == expected_errno)) { - tst_res(TPASS, - "swapon(2) got expected failure;" - " Got errno = %d, probably your" - " MAX_SWAPFILES is 32", - expected_errno); - } else { - tst_res(TFAIL, - "swapon(2) failed to produce" - " expected error: %d, got %s." - " System reboot after execution of LTP" - " test suite is recommended.", - expected_errno, strerror(TST_ERR)); - } - } + tst_res(TFAIL, "swapon(2) succeeded unexpectedly"); } if (clean_swap() < 0) tst_brk(TBROK, "Cleanup failed, quitting the test"); } -/* - * Create 33 and activate 30 swapfiles. - */ static int setup_swap(void) { pid_t pid; @@ -139,9 +103,10 @@ static int setup_swap(void) tst_brk(TFAIL, "Failed to find existing number of swapfiles"); /* Determine how many more files are to be created */ - swapfiles = MAX_SWAPFILES - swapfiles; - if (swapfiles > MAX_SWAPFILES) - swapfiles = MAX_SWAPFILES; + max_swapfiles = (int)get_maxswapfiles(); + swapfiles = max_swapfiles - swapfiles; + if (swapfiles > max_swapfiles) + swapfiles = max_swapfiles; pid = SAFE_FORK(); if (pid == 0) { /*create and turn on remaining swapfiles */ -- 2.27.0 -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [LTP] [PATCH 2/3] syscalls/swapon03: Use get_maxswapfiles() api instead of hard code 2023-12-05 6:16 ` [LTP] [PATCH 2/3] syscalls/swapon03: Use get_maxswapfiles() api instead of hard code Yang Xu @ 2023-12-22 1:39 ` Yang Xu (Fujitsu) 2023-12-22 11:42 ` Petr Vorel 0 siblings, 1 reply; 22+ messages in thread From: Yang Xu (Fujitsu) @ 2023-12-22 1:39 UTC (permalink / raw) To: pvorel@suse.cz, liwang@redhat.com; +Cc: ltp@lists.linux.it Hi Li, Petr I am writting v2 patch that introduce another libltpswap api named as get_used_swapfiles like we did in ipc library. But I found libltpswap and swapon/swapoff cases all use swapon/swapff syscall directly instead of glibc wrapper. IMO, on old glibc/other libc doesn't support this wrapper so it use syscall directly. Can I replace them by glibc wrapper directly? Best Regards Yang Xu > Signed-off-by: Yang Xu <xuyang2018.jy@fujitsu.com> > --- > testcases/kernel/syscalls/swapon/swapon03.c | 47 +++------------------ > 1 file changed, 6 insertions(+), 41 deletions(-) > > diff --git a/testcases/kernel/syscalls/swapon/swapon03.c b/testcases/kernel/syscalls/swapon/swapon03.c > index dc633ebc6..744fca3d1 100644 > --- a/testcases/kernel/syscalls/swapon/swapon03.c > +++ b/testcases/kernel/syscalls/swapon/swapon03.c > @@ -19,14 +19,12 @@ > > #include "tst_test.h" > #include "lapi/syscalls.h" > -#include "swaponoff.h" > #include "libswap.h" > > static int setup_swap(void); > static int clean_swap(void); > static int check_and_swapoff(const char *filename); > - > -static int swapfiles; > +static int swapfiles, max_swapfiles; > > int testfiles = 3; > static struct swap_testfile_t { > @@ -57,47 +55,13 @@ static void verify_swapon(void) > "(%d). System reboot recommended.", > expected_errno); > } else { > - /* Probably the system supports MAX_SWAPFILES > 30, > - * let's try with MAX_SWAPFILES == 32 */ > - > - /* Call swapon sys call once again for 32 > - * now we can't receive an error */ > - TEST(tst_syscall(__NR_swapon, swap_testfiles[1].filename, 0)); > - > - /* Check return code (now we're expecting success) */ > - if (TST_RET < 0) { > - tst_res(TFAIL | TTERRNO, > - "swapon(2) got an unexpected failure"); > - } else { > - /* Call swapon sys call once again for 33 > - * now we have to receive an error */ > - TEST(tst_syscall(__NR_swapon, swap_testfiles[2].filename, 0)); > - > - /* Check return code (should be an error) */ > - if ((TST_RET == -1) && (TST_ERR == expected_errno)) { > - tst_res(TPASS, > - "swapon(2) got expected failure;" > - " Got errno = %d, probably your" > - " MAX_SWAPFILES is 32", > - expected_errno); > - } else { > - tst_res(TFAIL, > - "swapon(2) failed to produce" > - " expected error: %d, got %s." > - " System reboot after execution of LTP" > - " test suite is recommended.", > - expected_errno, strerror(TST_ERR)); > - } > - } > + tst_res(TFAIL, "swapon(2) succeeded unexpectedly"); > } > > if (clean_swap() < 0) > tst_brk(TBROK, "Cleanup failed, quitting the test"); > } > > -/* > - * Create 33 and activate 30 swapfiles. > - */ > static int setup_swap(void) > { > pid_t pid; > @@ -139,9 +103,10 @@ static int setup_swap(void) > tst_brk(TFAIL, "Failed to find existing number of swapfiles"); > > /* Determine how many more files are to be created */ > - swapfiles = MAX_SWAPFILES - swapfiles; > - if (swapfiles > MAX_SWAPFILES) > - swapfiles = MAX_SWAPFILES; > + max_swapfiles = (int)get_maxswapfiles(); > + swapfiles = max_swapfiles - swapfiles; > + if (swapfiles > max_swapfiles) > + swapfiles = max_swapfiles; > pid = SAFE_FORK(); > if (pid == 0) { > /*create and turn on remaining swapfiles */ -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [LTP] [PATCH 2/3] syscalls/swapon03: Use get_maxswapfiles() api instead of hard code 2023-12-22 1:39 ` Yang Xu (Fujitsu) @ 2023-12-22 11:42 ` Petr Vorel 0 siblings, 0 replies; 22+ messages in thread From: Petr Vorel @ 2023-12-22 11:42 UTC (permalink / raw) To: Yang Xu (Fujitsu); +Cc: ltp@lists.linux.it Hi Xu, > Hi Li, Petr > I am writting v2 patch that introduce another libltpswap api named > as get_used_swapfiles like we did in ipc library. > But I found libltpswap and swapon/swapoff cases all use swapon/swapff > syscall directly instead of glibc wrapper. IMO, on old glibc/other libc > doesn't support this wrapper so it use syscall directly. Can I replace > them by glibc wrapper directly? how about use both libc wrapper and raw syscall via .test_variants? Kind regards, Petr > Best Regards > Yang Xu -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply [flat|nested] 22+ messages in thread
* [LTP] [PATCH 3/3] swaponoff.h: Remove useless header 2023-12-05 6:16 [LTP] [PATCH 1/3] libltpswap: Add get_maxswapfiles api Yang Xu 2023-12-05 6:16 ` [LTP] [PATCH 2/3] syscalls/swapon03: Use get_maxswapfiles() api instead of hard code Yang Xu @ 2023-12-05 6:16 ` Yang Xu 2023-12-22 5:00 ` [LTP] [PATCH v2 1/7] libltpswap: Add get_maxswapfiles api Yang Xu 2023-12-15 6:04 ` [LTP] [PATCH 1/3] " Yang Xu (Fujitsu) 2024-01-03 14:53 ` Cyril Hrubis 3 siblings, 1 reply; 22+ messages in thread From: Yang Xu @ 2023-12-05 6:16 UTC (permalink / raw) To: ltp Since we have use get_maxswapfiles() api in swapon03.c, so this header is useless and can be removed safely. Signed-off-by: Yang Xu <xuyang2018.jy@fujitsu.com> --- testcases/kernel/syscalls/swapon/swaponoff.h | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 testcases/kernel/syscalls/swapon/swaponoff.h diff --git a/testcases/kernel/syscalls/swapon/swaponoff.h b/testcases/kernel/syscalls/swapon/swaponoff.h deleted file mode 100644 index 900761bda..000000000 --- a/testcases/kernel/syscalls/swapon/swaponoff.h +++ /dev/null @@ -1,8 +0,0 @@ - -#ifndef __SWAP_ON_OFF_H_ -#define __SWAP_ON_OFF_H_ - -#include <linux/version.h> -#define MAX_SWAPFILES 30 - -#endif -- 2.27.0 -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [LTP] [PATCH v2 1/7] libltpswap: Add get_maxswapfiles api 2023-12-05 6:16 ` [LTP] [PATCH 3/3] swaponoff.h: Remove useless header Yang Xu @ 2023-12-22 5:00 ` Yang Xu 2023-12-22 5:00 ` [LTP] [PATCH v2 2/7] libltpswap: alter get_used_swapfiles api Yang Xu ` (8 more replies) 0 siblings, 9 replies; 22+ messages in thread From: Yang Xu @ 2023-12-22 5:00 UTC (permalink / raw) To: ltp Current, the kernel constant MAX_SWAPFILES value is calculated as below ------------------------------------ //#ifdef CONFIG_DEVICE_PRIVATE //#define SWP_DEVICE_NUM 4 //#else //#define SWP_DEVICE_NUM 0 //#endif //#ifdef CONFIG_MIGRATION //#define SWP_MIGRATION_NUM 3 //#else //#define SWP_MIGRATION_NUM 0 //#ifdef CONFIG_MEMORY_FAILURE //#define SWP_HWPOISON_NUM 1 //#else //#define SWP_HWPOISON_NUM 0 //#endif //#define SWP_PTE_MARKER_NUM 1 //#define MAX_SWAPFILES_SHIFT 5 //#define MAX_SWAPFILES \ // ((1 << MAX_SWAPFILES_SHIFT) - SWP_DEVICE_NUM - \ // SWP_MIGRATION_NUM - SWP_HWPOISON_NUM - \ // SWP_PTE_MARKER_NUM) ------------------------------------ Also, man-pages missed something after 5.14 kernel. I have sent two patches[1][2] to add it. The kernel patches modify this kernel constant in[3][4][5][6]. [1]https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/commit/?id=26f3ec74e [2]https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/commit/?id=6bf3937fc [3]https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/include/linux/swap.h?id=5042db43cc [4]https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/include/linux/swap.h?id=b756a3b5e [5]https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/include/linux/swap.h?id=679d10331 [6]https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/include/linux/swap.h?id=6c287605f Signed-off-by: Yang Xu <xuyang2018.jy@fujitsu.com> --- include/libswap.h | 6 ++++++ libs/libltpswap/libswap.c | 44 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/include/libswap.h b/include/libswap.h index d4b5301a5..2cab1047d 100644 --- a/include/libswap.h +++ b/include/libswap.h @@ -21,4 +21,10 @@ int make_swapfile(const char *swapfile, int safe); * we are testing on. */ void is_swap_supported(const char *filename); + +/* + * Get kernel constant MAX_SWAPFILES value + */ +unsigned int get_maxswapfiles(void); + #endif /* __LIBSWAP_H__ */ diff --git a/libs/libltpswap/libswap.c b/libs/libltpswap/libswap.c index d014325e5..658ecede7 100644 --- a/libs/libltpswap/libswap.c +++ b/libs/libltpswap/libswap.c @@ -11,6 +11,8 @@ #include "tst_test.h" #include "libswap.h" #include "lapi/syscalls.h" +#include "tst_kconfig.h" +#include "tst_safe_stdio.h" /* * Make a swap file @@ -65,3 +67,45 @@ void is_swap_supported(const char *filename) if (TST_RET == -1) tst_brk(TFAIL | TTERRNO, "swapoff on %s failed", fstype); } + +/* + * Get kernel constant MAX_SWAPFILES value + */ +unsigned int get_maxswapfiles(void) +{ + unsigned int max_swapfile = 32; + unsigned int swp_migration_num = 0, swp_hwpoison_num = 0, swp_device_num = 0, swp_pte_marker_num = 0; + struct tst_kconfig_var migration_kconfig = TST_KCONFIG_INIT("CONFIG_MIGRATION"); + struct tst_kconfig_var memory_kconfig = TST_KCONFIG_INIT("CONFIG_MEMORY_FAILURE"); + struct tst_kconfig_var device_kconfig = TST_KCONFIG_INIT("CONFIG_DEVICE_PRIVATE"); + struct tst_kconfig_var marker_kconfig = TST_KCONFIG_INIT("CONFIG_PTE_MARKER"); + + tst_kconfig_read(&migration_kconfig, 1); + tst_kconfig_read(&memory_kconfig, 1); + tst_kconfig_read(&device_kconfig, 1); + tst_kconfig_read(&marker_kconfig, 1); + + if (migration_kconfig.choice == 'y') { + if (tst_kvercmp(5, 19, 0) < 0) + swp_migration_num = 2; + else + swp_migration_num = 3; + } + + if (memory_kconfig.choice == 'y') + swp_hwpoison_num = 1; + + if (device_kconfig.choice == 'y') { + if (tst_kvercmp(4, 14, 0) >= 0) + swp_device_num = 2; + if (tst_kvercmp(5, 14, 0) >= 0) + swp_device_num = 4; + } + + if (marker_kconfig.choice == 'y') { + if (tst_kvercmp(5, 19, 0) >= 0) + swp_pte_marker_num = 1; + } + + return max_swapfile - swp_migration_num - swp_hwpoison_num - swp_device_num - swp_pte_marker_num; +} -- 2.27.0 -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [LTP] [PATCH v2 2/7] libltpswap: alter get_used_swapfiles api 2023-12-22 5:00 ` [LTP] [PATCH v2 1/7] libltpswap: Add get_maxswapfiles api Yang Xu @ 2023-12-22 5:00 ` Yang Xu 2024-01-03 15:30 ` Cyril Hrubis 2023-12-22 5:00 ` [LTP] [PATCH v2 3/7] syscalls/swapon03: use get_maxswapfiles() and GET_USED_SWAPFILES() api Yang Xu ` (7 subsequent siblings) 8 siblings, 1 reply; 22+ messages in thread From: Yang Xu @ 2023-12-22 5:00 UTC (permalink / raw) To: ltp Like we count the ipc resouce total, we can also add a similar api for swapfiles, so we can use it for swapon03 case. Signed-off-by: Yang Xu <xuyang2018.jy@fujitsu.com> --- include/libswap.h | 7 +++++++ libs/libltpswap/libswap.c | 26 ++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/include/libswap.h b/include/libswap.h index 2cab1047d..7f8df1032 100644 --- a/include/libswap.h +++ b/include/libswap.h @@ -27,4 +27,11 @@ void is_swap_supported(const char *filename); */ unsigned int get_maxswapfiles(void); +/* + * Get the used swapfiles number + */ +int get_used_swapfiles(const char *file, const int lineno); +#define GET_USED_SWAPFILES() \ + get_used_swapfiles(__FILE__, __LINE__) + #endif /* __LIBSWAP_H__ */ diff --git a/libs/libltpswap/libswap.c b/libs/libltpswap/libswap.c index 658ecede7..e10a6f5b2 100644 --- a/libs/libltpswap/libswap.c +++ b/libs/libltpswap/libswap.c @@ -14,6 +14,8 @@ #include "tst_kconfig.h" #include "tst_safe_stdio.h" +#define BUFSIZE 1024 + /* * Make a swap file */ @@ -109,3 +111,27 @@ unsigned int get_maxswapfiles(void) return max_swapfile - swp_migration_num - swp_hwpoison_num - swp_device_num - swp_pte_marker_num; } + +/* + * Get the used swapfiles number + */ +int get_used_swapfiles(const char *file, const int lineno) +{ + FILE *fp; + int used = -1; + char buf[BUFSIZE]; + + fp = safe_fopen(file, lineno, NULL, "/proc/swaps", "r"); + + while (fgets(buf, BUFSIZE, fp) != NULL) + used++; + + fclose(fp); + + if (used < 0) { + tst_brk(TBROK, "can't read /proc/swaps to get used swapfiles resource total " + "at %s:%d", file, lineno); + } + + return used; +} -- 2.27.0 -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [LTP] [PATCH v2 2/7] libltpswap: alter get_used_swapfiles api 2023-12-22 5:00 ` [LTP] [PATCH v2 2/7] libltpswap: alter get_used_swapfiles api Yang Xu @ 2024-01-03 15:30 ` Cyril Hrubis 0 siblings, 0 replies; 22+ messages in thread From: Cyril Hrubis @ 2024-01-03 15:30 UTC (permalink / raw) To: Yang Xu; +Cc: ltp Hi! > +/* > + * Get the used swapfiles number > + */ > +int get_used_swapfiles(const char *file, const int lineno); > +#define GET_USED_SWAPFILES() \ > + get_used_swapfiles(__FILE__, __LINE__) This has to be prefixed with tst_ Also I wouldn't bother withg the macro and passing down FILE and LINE, it's going to be called just once in the test setup anyways. So I would just add: int tst_count_swaps(void); > #endif /* __LIBSWAP_H__ */ > diff --git a/libs/libltpswap/libswap.c b/libs/libltpswap/libswap.c > index 658ecede7..e10a6f5b2 100644 > --- a/libs/libltpswap/libswap.c > +++ b/libs/libltpswap/libswap.c > @@ -14,6 +14,8 @@ > #include "tst_kconfig.h" > #include "tst_safe_stdio.h" > > +#define BUFSIZE 1024 > + > /* > * Make a swap file > */ > @@ -109,3 +111,27 @@ unsigned int get_maxswapfiles(void) > > return max_swapfile - swp_migration_num - swp_hwpoison_num - swp_device_num - swp_pte_marker_num; > } > + > +/* > + * Get the used swapfiles number > + */ > +int get_used_swapfiles(const char *file, const int lineno) > +{ > + FILE *fp; > + int used = -1; > + char buf[BUFSIZE]; > + > + fp = safe_fopen(file, lineno, NULL, "/proc/swaps", "r"); I suppose that that we may want to check if the file exists and return 0 if it does not, otherwise we will possibly TBROK here if CONFIG_SWAP is not set. Or do all the tests that call this function have CONFIG_SWAP in .needs_kconfig? > + while (fgets(buf, BUFSIZE, fp) != NULL) > + used++; We can do this even simpler: int c; while ((c = fgetc(f)) != EOF) { if (c == '\n') used++; } > + fclose(fp); > + > + if (used < 0) { > + tst_brk(TBROK, "can't read /proc/swaps to get used swapfiles resource total " > + "at %s:%d", file, lineno); > + } > + > + return used; > +} > -- > 2.27.0 > > > -- > Mailing list info: https://lists.linux.it/listinfo/ltp -- Cyril Hrubis chrubis@suse.cz -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply [flat|nested] 22+ messages in thread
* [LTP] [PATCH v2 3/7] syscalls/swapon03: use get_maxswapfiles() and GET_USED_SWAPFILES() api 2023-12-22 5:00 ` [LTP] [PATCH v2 1/7] libltpswap: Add get_maxswapfiles api Yang Xu 2023-12-22 5:00 ` [LTP] [PATCH v2 2/7] libltpswap: alter get_used_swapfiles api Yang Xu @ 2023-12-22 5:00 ` Yang Xu 2024-01-03 15:34 ` Cyril Hrubis 2023-12-22 5:00 ` [LTP] [PATCH v2 4/7] swaponoff.h: Remove useless header Yang Xu ` (6 subsequent siblings) 8 siblings, 1 reply; 22+ messages in thread From: Yang Xu @ 2023-12-22 5:00 UTC (permalink / raw) To: ltp Signed-off-by: Yang Xu <xuyang2018.jy@fujitsu.com> --- testcases/kernel/syscalls/swapon/swapon03.c | 40 ++++----------------- 1 file changed, 6 insertions(+), 34 deletions(-) diff --git a/testcases/kernel/syscalls/swapon/swapon03.c b/testcases/kernel/syscalls/swapon/swapon03.c index dc633ebc6..a553dd485 100644 --- a/testcases/kernel/syscalls/swapon/swapon03.c +++ b/testcases/kernel/syscalls/swapon/swapon03.c @@ -19,7 +19,6 @@ #include "tst_test.h" #include "lapi/syscalls.h" -#include "swaponoff.h" #include "libswap.h" static int setup_swap(void); @@ -101,47 +100,20 @@ static void verify_swapon(void) static int setup_swap(void) { pid_t pid; - int j, fd; + int j, max_swapfiles, used_swapfiles; int status; int res = 0; char filename[FILENAME_MAX]; - char buf[BUFSIZ + 1]; - - /* Find out how many swapfiles (1 line per entry) already exist */ - swapfiles = 0; if (seteuid(0) < 0) tst_brk(TFAIL | TERRNO, "Failed to call seteuid"); - /* This includes the first (header) line */ - if ((fd = open("/proc/swaps", O_RDONLY)) == -1) { - tst_brk(TFAIL | TERRNO, - "Failed to find out existing number of swap files"); - } - do { - char *p = buf; - res = read(fd, buf, BUFSIZ); - if (res < 0) { - tst_brk(TFAIL | TERRNO, - "Failed to find out existing number of swap files"); - } - buf[res] = '\0'; - while ((p = strchr(p, '\n'))) { - p++; - swapfiles++; - } - } while (BUFSIZ <= res); - close(fd); - if (swapfiles) - swapfiles--; /* don't count the /proc/swaps header */ - - if (swapfiles < 0) - tst_brk(TFAIL, "Failed to find existing number of swapfiles"); - /* Determine how many more files are to be created */ - swapfiles = MAX_SWAPFILES - swapfiles; - if (swapfiles > MAX_SWAPFILES) - swapfiles = MAX_SWAPFILES; + max_swapfiles = (int)get_maxswapfiles(); + used_swapfiles = GET_USED_SWAPFILES(); + swapfiles = max_swapfiles - used_swapfiles; + if (swapfiles > max_swapfiles) + swapfiles = max_swapfiles; pid = SAFE_FORK(); if (pid == 0) { /*create and turn on remaining swapfiles */ -- 2.27.0 -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [LTP] [PATCH v2 3/7] syscalls/swapon03: use get_maxswapfiles() and GET_USED_SWAPFILES() api 2023-12-22 5:00 ` [LTP] [PATCH v2 3/7] syscalls/swapon03: use get_maxswapfiles() and GET_USED_SWAPFILES() api Yang Xu @ 2024-01-03 15:34 ` Cyril Hrubis 0 siblings, 0 replies; 22+ messages in thread From: Cyril Hrubis @ 2024-01-03 15:34 UTC (permalink / raw) To: Yang Xu; +Cc: ltp Hi! > + max_swapfiles = (int)get_maxswapfiles(); We may as well declare the get_maxswapfiles() to return int instead, it's not going to overflow signed int anytime soon... > + used_swapfiles = GET_USED_SWAPFILES(); > + swapfiles = max_swapfiles - used_swapfiles; > + if (swapfiles > max_swapfiles) > + swapfiles = max_swapfiles; > pid = SAFE_FORK(); > if (pid == 0) { > /*create and turn on remaining swapfiles */ > -- > 2.27.0 > > > -- > Mailing list info: https://lists.linux.it/listinfo/ltp -- Cyril Hrubis chrubis@suse.cz -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply [flat|nested] 22+ messages in thread
* [LTP] [PATCH v2 4/7] swaponoff.h: Remove useless header 2023-12-22 5:00 ` [LTP] [PATCH v2 1/7] libltpswap: Add get_maxswapfiles api Yang Xu 2023-12-22 5:00 ` [LTP] [PATCH v2 2/7] libltpswap: alter get_used_swapfiles api Yang Xu 2023-12-22 5:00 ` [LTP] [PATCH v2 3/7] syscalls/swapon03: use get_maxswapfiles() and GET_USED_SWAPFILES() api Yang Xu @ 2023-12-22 5:00 ` Yang Xu 2023-12-22 5:00 ` [LTP] [PATCH v2 5/7] swapon/Makefile: Remove useless section for MAX_SWAPFILES Yang Xu ` (5 subsequent siblings) 8 siblings, 0 replies; 22+ messages in thread From: Yang Xu @ 2023-12-22 5:00 UTC (permalink / raw) To: ltp Since we have use get_maxswapfiles() api in swapon03.c, so this header is useless and can be removed safely. Signed-off-by: Yang Xu <xuyang2018.jy@fujitsu.com> --- testcases/kernel/syscalls/swapon/swaponoff.h | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 testcases/kernel/syscalls/swapon/swaponoff.h diff --git a/testcases/kernel/syscalls/swapon/swaponoff.h b/testcases/kernel/syscalls/swapon/swaponoff.h deleted file mode 100644 index 900761bda..000000000 --- a/testcases/kernel/syscalls/swapon/swaponoff.h +++ /dev/null @@ -1,8 +0,0 @@ - -#ifndef __SWAP_ON_OFF_H_ -#define __SWAP_ON_OFF_H_ - -#include <linux/version.h> -#define MAX_SWAPFILES 30 - -#endif -- 2.27.0 -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [LTP] [PATCH v2 5/7] swapon/Makefile: Remove useless section for MAX_SWAPFILES 2023-12-22 5:00 ` [LTP] [PATCH v2 1/7] libltpswap: Add get_maxswapfiles api Yang Xu ` (2 preceding siblings ...) 2023-12-22 5:00 ` [LTP] [PATCH v2 4/7] swaponoff.h: Remove useless header Yang Xu @ 2023-12-22 5:00 ` Yang Xu 2024-01-03 15:40 ` Cyril Hrubis 2023-12-22 5:00 ` [LTP] [PATCH v2 6/7] syscalls/swapon03: Simply this case Yang Xu ` (4 subsequent siblings) 8 siblings, 1 reply; 22+ messages in thread From: Yang Xu @ 2023-12-22 5:00 UTC (permalink / raw) To: ltp It seems this section doesn't affect anything, btw it is useless, so remove it. Signed-off-by: Yang Xu <xuyang2018.jy@fujitsu.com> --- testcases/kernel/syscalls/swapon/Makefile | 5 ----- 1 file changed, 5 deletions(-) diff --git a/testcases/kernel/syscalls/swapon/Makefile b/testcases/kernel/syscalls/swapon/Makefile index 53c795090..6954112a8 100644 --- a/testcases/kernel/syscalls/swapon/Makefile +++ b/testcases/kernel/syscalls/swapon/Makefile @@ -1,11 +1,6 @@ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (c) International Business Machines Corp., 2001 -NEEDSPECIAL := $(shell echo MAX_SWAPFILES | $(CC) -E -xc -include linux/swap.h 2>/dev/null - | tail -n 1 | grep 32; echo $?) -ifneq ($(strip $(NEEDSPECIAL)),) -export CFLAGS += -DOLDER_DISTRO_RELEASE -endif - top_srcdir ?= ../../../.. LTPLIBS = ltpswap -- 2.27.0 -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [LTP] [PATCH v2 5/7] swapon/Makefile: Remove useless section for MAX_SWAPFILES 2023-12-22 5:00 ` [LTP] [PATCH v2 5/7] swapon/Makefile: Remove useless section for MAX_SWAPFILES Yang Xu @ 2024-01-03 15:40 ` Cyril Hrubis 0 siblings, 0 replies; 22+ messages in thread From: Cyril Hrubis @ 2024-01-03 15:40 UTC (permalink / raw) To: Yang Xu; +Cc: ltp Hi! Good catch, looks like the code that used this has been removed back in 2009 in 96db7a4982e. Reviewed-by: Cyril Hrubis <chrubis@suse.cz> -- Cyril Hrubis chrubis@suse.cz -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply [flat|nested] 22+ messages in thread
* [LTP] [PATCH v2 6/7] syscalls/swapon03: Simply this case 2023-12-22 5:00 ` [LTP] [PATCH v2 1/7] libltpswap: Add get_maxswapfiles api Yang Xu ` (3 preceding siblings ...) 2023-12-22 5:00 ` [LTP] [PATCH v2 5/7] swapon/Makefile: Remove useless section for MAX_SWAPFILES Yang Xu @ 2023-12-22 5:00 ` Yang Xu 2023-12-22 5:00 ` [LTP] [PATCH v2 7/7] Add fallback for RHEL9 Yang Xu ` (3 subsequent siblings) 8 siblings, 0 replies; 22+ messages in thread From: Yang Xu @ 2023-12-22 5:00 UTC (permalink / raw) To: ltp By moving swapfile create stage from verify_swaopon and test EPERM error more accurate. Also use glibc wrapper by using swapon/swapoff instead of call syscall number directly because glibc/musl/binoic also support them since long time ago. Signed-off-by: Yang Xu <xuyang2018.jy@fujitsu.com> --- testcases/kernel/syscalls/swapon/swapon03.c | 111 +++----------------- 1 file changed, 16 insertions(+), 95 deletions(-) diff --git a/testcases/kernel/syscalls/swapon/swapon03.c b/testcases/kernel/syscalls/swapon/swapon03.c index a553dd485..3f3fa7a54 100644 --- a/testcases/kernel/syscalls/swapon/swapon03.c +++ b/testcases/kernel/syscalls/swapon/swapon03.c @@ -16,93 +16,27 @@ #include <errno.h> #include <stdlib.h> #include <sys/wait.h> - +#include <sys/swap.h> #include "tst_test.h" -#include "lapi/syscalls.h" #include "libswap.h" +#define TESTFILE "testfile" + static int setup_swap(void); static int clean_swap(void); static int check_and_swapoff(const char *filename); - static int swapfiles; -int testfiles = 3; -static struct swap_testfile_t { - char *filename; -} swap_testfiles[] = { - {"firstswapfile"}, - {"secondswapfile"}, - {"thirdswapfile"} -}; - -int expected_errno = EPERM; - static void verify_swapon(void) { - if (setup_swap() < 0) { - clean_swap(); - tst_brk(TBROK, "Setup failed, quitting the test"); - } - - TEST(tst_syscall(__NR_swapon, swap_testfiles[0].filename, 0)); - - if ((TST_RET == -1) && (TST_ERR == expected_errno)) { - tst_res(TPASS, "swapon(2) got expected failure (%d),", - expected_errno); - } else if (TST_RET < 0) { - tst_res(TFAIL | TTERRNO, - "swapon(2) failed to produce expected error " - "(%d). System reboot recommended.", - expected_errno); - } else { - /* Probably the system supports MAX_SWAPFILES > 30, - * let's try with MAX_SWAPFILES == 32 */ - - /* Call swapon sys call once again for 32 - * now we can't receive an error */ - TEST(tst_syscall(__NR_swapon, swap_testfiles[1].filename, 0)); - - /* Check return code (now we're expecting success) */ - if (TST_RET < 0) { - tst_res(TFAIL | TTERRNO, - "swapon(2) got an unexpected failure"); - } else { - /* Call swapon sys call once again for 33 - * now we have to receive an error */ - TEST(tst_syscall(__NR_swapon, swap_testfiles[2].filename, 0)); - - /* Check return code (should be an error) */ - if ((TST_RET == -1) && (TST_ERR == expected_errno)) { - tst_res(TPASS, - "swapon(2) got expected failure;" - " Got errno = %d, probably your" - " MAX_SWAPFILES is 32", - expected_errno); - } else { - tst_res(TFAIL, - "swapon(2) failed to produce" - " expected error: %d, got %s." - " System reboot after execution of LTP" - " test suite is recommended.", - expected_errno, strerror(TST_ERR)); - } - } - } - - if (clean_swap() < 0) - tst_brk(TBROK, "Cleanup failed, quitting the test"); + TST_EXP_FAIL(swapon(TESTFILE, 0), EPERM, "swapon(%s, 0)", TESTFILE); } -/* - * Create 33 and activate 30 swapfiles. - */ static int setup_swap(void) { pid_t pid; int j, max_swapfiles, used_swapfiles; int status; - int res = 0; char filename[FILENAME_MAX]; if (seteuid(0) < 0) @@ -130,16 +64,7 @@ static int setup_swap(void) make_swapfile(filename, 0); /* turn on the swap file */ - res = tst_syscall(__NR_swapon, filename, 0); - if (res != 0) { - if (errno == EPERM) { - printf("Successfully created %d swapfiles\n", j); - break; - } else { - printf("Failed to create swapfile: %s\n", filename); - exit(1); - } - } + TST_EXP_PASS_SILENT(swapon(filename, 0)); } exit(0); } else @@ -148,9 +73,8 @@ static int setup_swap(void) if (WEXITSTATUS(status)) tst_brk(TFAIL, "Failed to setup swaps"); - /* Create all needed extra swapfiles for testing */ - for (j = 0; j < testfiles; j++) - make_swapfile(swap_testfiles[j].filename, 0); + tst_res(TINFO, "Successfully created %d swapfiles", swapfiles); + make_swapfile(TESTFILE, 0); return 0; } @@ -178,12 +102,9 @@ static int clean_swap(void) } } - for (j = 0; j < testfiles; j++) { - if (check_and_swapoff(swap_testfiles[j].filename) != 0) { - tst_res(TWARN, "Failed to turn off swap file %s.", - swap_testfiles[j].filename); - return -1; - } + if (check_and_swapoff("testfile") != 0) { + tst_res(TWARN, "Failed to turn off swap file testfile"); + return -1; } return 0; @@ -201,20 +122,15 @@ static int check_and_swapoff(const char *filename) "grep -q '%s.*file' /proc/swaps", filename) < 0) { tst_res(TWARN, "sprintf() failed to create the command string"); } else { - rc = 0; - if (system(cmd_buffer) == 0) { - /* now we need to swapoff the file */ - if (tst_syscall(__NR_swapoff, filename) != 0) { - + if (swapoff(filename) != 0) { tst_res(TWARN, "Failed to turn off swap " "file. system reboot after " "execution of LTP test suite " "is recommended"); rc = -1; - } } @@ -229,6 +145,11 @@ static void setup(void) tst_brk(TCONF, "swap not supported by kernel"); is_swap_supported("./tstswap"); + + if (setup_swap() < 0) { + clean_swap(); + tst_brk(TBROK, "Setup failed, quitting the test"); + } } static void cleanup(void) -- 2.27.0 -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [LTP] [PATCH v2 7/7] Add fallback for RHEL9 2023-12-22 5:00 ` [LTP] [PATCH v2 1/7] libltpswap: Add get_maxswapfiles api Yang Xu ` (4 preceding siblings ...) 2023-12-22 5:00 ` [LTP] [PATCH v2 6/7] syscalls/swapon03: Simply this case Yang Xu @ 2023-12-22 5:00 ` Yang Xu 2024-02-05 18:37 ` Petr Vorel 2024-01-02 2:07 ` [LTP] [PATCH v2 1/7] libltpswap: Add get_maxswapfiles api Yang Xu (Fujitsu) ` (2 subsequent siblings) 8 siblings, 1 reply; 22+ messages in thread From: Yang Xu @ 2023-12-22 5:00 UTC (permalink / raw) To: ltp Since device number patch and pte number patch have been backported into RHEL9, we should add fallback for this distro. Signed-off-by: Yang Xu <xuyang2018.jy@fujitsu.com> --- libs/libltpswap/libswap.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/libs/libltpswap/libswap.c b/libs/libltpswap/libswap.c index e10a6f5b2..8c7729b8b 100644 --- a/libs/libltpswap/libswap.c +++ b/libs/libltpswap/libswap.c @@ -12,6 +12,7 @@ #include "libswap.h" #include "lapi/syscalls.h" #include "tst_kconfig.h" +#include "tst_kvercmp.h" #include "tst_safe_stdio.h" #define BUFSIZE 1024 @@ -81,6 +82,11 @@ unsigned int get_maxswapfiles(void) struct tst_kconfig_var memory_kconfig = TST_KCONFIG_INIT("CONFIG_MEMORY_FAILURE"); struct tst_kconfig_var device_kconfig = TST_KCONFIG_INIT("CONFIG_DEVICE_PRIVATE"); struct tst_kconfig_var marker_kconfig = TST_KCONFIG_INIT("CONFIG_PTE_MARKER"); + struct tst_kern_exv kvers[] = { + /* RHEL9 kernel has patch 6c287605f and 679d10331 since 5.14.0-179 */ + { "RHEL9", "5.14.0-179" }, + { NULL, NULL}, + }; tst_kconfig_read(&migration_kconfig, 1); tst_kconfig_read(&memory_kconfig, 1); @@ -88,7 +94,7 @@ unsigned int get_maxswapfiles(void) tst_kconfig_read(&marker_kconfig, 1); if (migration_kconfig.choice == 'y') { - if (tst_kvercmp(5, 19, 0) < 0) + if (tst_kvercmp2(5, 19, 0, kvers) < 0) swp_migration_num = 2; else swp_migration_num = 3; @@ -105,7 +111,7 @@ unsigned int get_maxswapfiles(void) } if (marker_kconfig.choice == 'y') { - if (tst_kvercmp(5, 19, 0) >= 0) + if (tst_kvercmp2(5, 19, 0, kvers) >= 0) swp_pte_marker_num = 1; } -- 2.27.0 -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [LTP] [PATCH v2 7/7] Add fallback for RHEL9 2023-12-22 5:00 ` [LTP] [PATCH v2 7/7] Add fallback for RHEL9 Yang Xu @ 2024-02-05 18:37 ` Petr Vorel 0 siblings, 0 replies; 22+ messages in thread From: Petr Vorel @ 2024-02-05 18:37 UTC (permalink / raw) To: Yang Xu; +Cc: ltp Hi Yang Xu, all, > Since device number patch and pte number patch have been backported into > RHEL9, we should add fallback for this distro. I guess this is for Li and Jan, thus Cc them. BTW this is the only patch not set Superseded: https://patchwork.ozlabs.org/project/ltp/list/?series=387814&state=* Kind regards, Petr -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [LTP] [PATCH v2 1/7] libltpswap: Add get_maxswapfiles api 2023-12-22 5:00 ` [LTP] [PATCH v2 1/7] libltpswap: Add get_maxswapfiles api Yang Xu ` (5 preceding siblings ...) 2023-12-22 5:00 ` [LTP] [PATCH v2 7/7] Add fallback for RHEL9 Yang Xu @ 2024-01-02 2:07 ` Yang Xu (Fujitsu) 2024-01-03 15:35 ` Cyril Hrubis 2024-02-05 18:43 ` Petr Vorel 8 siblings, 0 replies; 22+ messages in thread From: Yang Xu (Fujitsu) @ 2024-01-02 2:07 UTC (permalink / raw) To: ltp@lists.linux.it Hi all, Ping Best Regards, Yang Xu > Current, the kernel constant MAX_SWAPFILES value is calculated as below > ------------------------------------ > //#ifdef CONFIG_DEVICE_PRIVATE > //#define SWP_DEVICE_NUM 4 > //#else > //#define SWP_DEVICE_NUM 0 > //#endif > > //#ifdef CONFIG_MIGRATION > //#define SWP_MIGRATION_NUM 3 > //#else > //#define SWP_MIGRATION_NUM 0 > > //#ifdef CONFIG_MEMORY_FAILURE > //#define SWP_HWPOISON_NUM 1 > //#else > //#define SWP_HWPOISON_NUM 0 > //#endif > > //#define SWP_PTE_MARKER_NUM 1 > //#define MAX_SWAPFILES_SHIFT 5 > > //#define MAX_SWAPFILES \ > // ((1 << MAX_SWAPFILES_SHIFT) - SWP_DEVICE_NUM - \ > // SWP_MIGRATION_NUM - SWP_HWPOISON_NUM - \ > // SWP_PTE_MARKER_NUM) > ------------------------------------ > > Also, man-pages missed something after 5.14 kernel. I have sent two patches[1][2] to > add it. The kernel patches modify this kernel constant in[3][4][5][6]. > > [1]https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/commit/?id=26f3ec74e > [2]https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/commit/?id=6bf3937fc > [3]https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/include/linux/swap.h?id=5042db43cc > [4]https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/include/linux/swap.h?id=b756a3b5e > [5]https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/include/linux/swap.h?id=679d10331 > [6]https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/include/linux/swap.h?id=6c287605f > > Signed-off-by: Yang Xu <xuyang2018.jy@fujitsu.com> > --- > include/libswap.h | 6 ++++++ > libs/libltpswap/libswap.c | 44 +++++++++++++++++++++++++++++++++++++++ > 2 files changed, 50 insertions(+) > > diff --git a/include/libswap.h b/include/libswap.h > index d4b5301a5..2cab1047d 100644 > --- a/include/libswap.h > +++ b/include/libswap.h > @@ -21,4 +21,10 @@ int make_swapfile(const char *swapfile, int safe); > * we are testing on. > */ > void is_swap_supported(const char *filename); > + > +/* > + * Get kernel constant MAX_SWAPFILES value > + */ > +unsigned int get_maxswapfiles(void); > + > #endif /* __LIBSWAP_H__ */ > diff --git a/libs/libltpswap/libswap.c b/libs/libltpswap/libswap.c > index d014325e5..658ecede7 100644 > --- a/libs/libltpswap/libswap.c > +++ b/libs/libltpswap/libswap.c > @@ -11,6 +11,8 @@ > #include "tst_test.h" > #include "libswap.h" > #include "lapi/syscalls.h" > +#include "tst_kconfig.h" > +#include "tst_safe_stdio.h" > > /* > * Make a swap file > @@ -65,3 +67,45 @@ void is_swap_supported(const char *filename) > if (TST_RET == -1) > tst_brk(TFAIL | TTERRNO, "swapoff on %s failed", fstype); > } > + > +/* > + * Get kernel constant MAX_SWAPFILES value > + */ > +unsigned int get_maxswapfiles(void) > +{ > + unsigned int max_swapfile = 32; > + unsigned int swp_migration_num = 0, swp_hwpoison_num = 0, swp_device_num = 0, swp_pte_marker_num = 0; > + struct tst_kconfig_var migration_kconfig = TST_KCONFIG_INIT("CONFIG_MIGRATION"); > + struct tst_kconfig_var memory_kconfig = TST_KCONFIG_INIT("CONFIG_MEMORY_FAILURE"); > + struct tst_kconfig_var device_kconfig = TST_KCONFIG_INIT("CONFIG_DEVICE_PRIVATE"); > + struct tst_kconfig_var marker_kconfig = TST_KCONFIG_INIT("CONFIG_PTE_MARKER"); > + > + tst_kconfig_read(&migration_kconfig, 1); > + tst_kconfig_read(&memory_kconfig, 1); > + tst_kconfig_read(&device_kconfig, 1); > + tst_kconfig_read(&marker_kconfig, 1); > + > + if (migration_kconfig.choice == 'y') { > + if (tst_kvercmp(5, 19, 0) < 0) > + swp_migration_num = 2; > + else > + swp_migration_num = 3; > + } > + > + if (memory_kconfig.choice == 'y') > + swp_hwpoison_num = 1; > + > + if (device_kconfig.choice == 'y') { > + if (tst_kvercmp(4, 14, 0) >= 0) > + swp_device_num = 2; > + if (tst_kvercmp(5, 14, 0) >= 0) > + swp_device_num = 4; > + } > + > + if (marker_kconfig.choice == 'y') { > + if (tst_kvercmp(5, 19, 0) >= 0) > + swp_pte_marker_num = 1; > + } > + > + return max_swapfile - swp_migration_num - swp_hwpoison_num - swp_device_num - swp_pte_marker_num; > +} -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [LTP] [PATCH v2 1/7] libltpswap: Add get_maxswapfiles api 2023-12-22 5:00 ` [LTP] [PATCH v2 1/7] libltpswap: Add get_maxswapfiles api Yang Xu ` (6 preceding siblings ...) 2024-01-02 2:07 ` [LTP] [PATCH v2 1/7] libltpswap: Add get_maxswapfiles api Yang Xu (Fujitsu) @ 2024-01-03 15:35 ` Cyril Hrubis 2024-02-05 18:43 ` Petr Vorel 8 siblings, 0 replies; 22+ messages in thread From: Cyril Hrubis @ 2024-01-03 15:35 UTC (permalink / raw) To: Yang Xu; +Cc: ltp Hi! > + > +/* > + * Get kernel constant MAX_SWAPFILES value > + */ > +unsigned int get_maxswapfiles(void); Also this has to be with tst_ as well, I would name it simply tst_max_swapfiles(). -- Cyril Hrubis chrubis@suse.cz -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [LTP] [PATCH v2 1/7] libltpswap: Add get_maxswapfiles api 2023-12-22 5:00 ` [LTP] [PATCH v2 1/7] libltpswap: Add get_maxswapfiles api Yang Xu ` (7 preceding siblings ...) 2024-01-03 15:35 ` Cyril Hrubis @ 2024-02-05 18:43 ` Petr Vorel 2024-02-06 8:55 ` Yang Xu (Fujitsu) via ltp 8 siblings, 1 reply; 22+ messages in thread From: Petr Vorel @ 2024-02-05 18:43 UTC (permalink / raw) To: Yang Xu; +Cc: ltp Hi Yang Xu, I'm sorry, this is not applicable due my checkpatch cleanup, but it's Superseded anyway. @Yang Xu FYI I touched the same test swapon03.c [1]: The cleanup is not that much important (I'll rebase it after your changes), the second commit [2] is more important - failure on swapon03 on TMPDIR on tmpfs. I wonder if your MAX_SWAPFILES fixes will improve it. Kind regards, Petr [1] https://patchwork.ozlabs.org/project/ltp/list/?series=393561 [2] https://patchwork.ozlabs.org/project/ltp/patch/20240205022857.191692-2-pvorel@suse.cz/ -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [LTP] [PATCH v2 1/7] libltpswap: Add get_maxswapfiles api 2024-02-05 18:43 ` Petr Vorel @ 2024-02-06 8:55 ` Yang Xu (Fujitsu) via ltp 0 siblings, 0 replies; 22+ messages in thread From: Yang Xu (Fujitsu) via ltp @ 2024-02-06 8:55 UTC (permalink / raw) To: Petr Vorel; +Cc: ltp@lists.linux.it Hi Petr, > Hi Yang Xu, > > I'm sorry, this is not applicable due my checkpatch cleanup, > but it's Superseded anyway. > > @Yang Xu FYI I touched the same test swapon03.c [1]: > > The cleanup is not that much important (I'll rebase it after your changes), > the second commit [2] is more important - failure on swapon03 on TMPDIR on > tmpfs. I wonder if your MAX_SWAPFILES fixes will improve it. > I will fix it in my v3 max_swapfiles patchset. Best Regards, Yang Xu > Kind regards, > Petr > > [1] https://patchwork.ozlabs.org/project/ltp/list/?series=393561 > [2] https://patchwork.ozlabs.org/project/ltp/patch/20240205022857.191692-2-pvorel@suse.cz/ -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [LTP] [PATCH 1/3] libltpswap: Add get_maxswapfiles api 2023-12-05 6:16 [LTP] [PATCH 1/3] libltpswap: Add get_maxswapfiles api Yang Xu 2023-12-05 6:16 ` [LTP] [PATCH 2/3] syscalls/swapon03: Use get_maxswapfiles() api instead of hard code Yang Xu 2023-12-05 6:16 ` [LTP] [PATCH 3/3] swaponoff.h: Remove useless header Yang Xu @ 2023-12-15 6:04 ` Yang Xu (Fujitsu) 2024-01-03 14:53 ` Cyril Hrubis 3 siblings, 0 replies; 22+ messages in thread From: Yang Xu (Fujitsu) @ 2023-12-15 6:04 UTC (permalink / raw) To: ltp@lists.linux.it Hi all, Ping Best Regards Yang Xu > Current, the kernel constant MAX_SWAPFILES value is calculated as below > ------------------------------------ > //#ifdef CONFIG_DEVICE_PRIVATE > //#define SWP_DEVICE_NUM 4 > //#else > //#define SWP_DEVICE_NUM 0 > //#endif > > //#ifdef CONFIG_MIGRATION > //#define SWP_MIGRATION_NUM 3 > //#else > //#define SWP_MIGRATION_NUM 0 > > //#ifdef CONFIG_MEMORY_FAILURE > //#define SWP_HWPOISON_NUM 1 > //#else > //#define SWP_HWPOISON_NUM 0 > //#endif > > //#define SWP_PTE_MARKER_NUM 1 > //#define MAX_SWAPFILES_SHIFT 5 > > //#define MAX_SWAPFILES \ > // ((1 << MAX_SWAPFILES_SHIFT) - SWP_DEVICE_NUM - \ > // SWP_MIGRATION_NUM - SWP_HWPOISON_NUM - \ > // SWP_PTE_MARKER_NUM) > ------------------------------------ > > Also, man-pages missed something after 5.14 kernel. I have sent two patches to > add it. > > Signed-off-by: Yang Xu <xuyang2018.jy@fujitsu.com> > --- > include/libswap.h | 6 ++++++ > libs/libltpswap/libswap.c | 41 +++++++++++++++++++++++++++++++++++++++ > 2 files changed, 47 insertions(+) > > diff --git a/include/libswap.h b/include/libswap.h > index d4b5301a5..2cab1047d 100644 > --- a/include/libswap.h > +++ b/include/libswap.h > @@ -21,4 +21,10 @@ int make_swapfile(const char *swapfile, int safe); > * we are testing on. > */ > void is_swap_supported(const char *filename); > + > +/* > + * Get kernel constant MAX_SWAPFILES value > + */ > +unsigned int get_maxswapfiles(void); > + > #endif /* __LIBSWAP_H__ */ > diff --git a/libs/libltpswap/libswap.c b/libs/libltpswap/libswap.c > index a4427736f..54317c627 100644 > --- a/libs/libltpswap/libswap.c > +++ b/libs/libltpswap/libswap.c > @@ -11,6 +11,7 @@ > #include "tst_test.h" > #include "libswap.h" > #include "lapi/syscalls.h" > +#include "tst_kconfig.h" > > /* > * Make a swap file > @@ -63,3 +64,43 @@ void is_swap_supported(const char *filename) > if (TST_RET == -1) > tst_brk(TFAIL | TTERRNO, "swapoff on %s failed", fstype); > } > + > +/* > + * Get kernel constant MAX_SWAPFILES value > + */ > +unsigned int get_maxswapfiles(void) > +{ > + unsigned int max_swapfile = 32; > + unsigned int swp_migration_num = 0, swp_hwpoison_num = 0, swp_device_num = 0, swp_pte_marker_num = 0; > + struct tst_kconfig_var migration_kconfig = TST_KCONFIG_INIT("CONFIG_MIGRATION"); > + struct tst_kconfig_var memory_kconfig = TST_KCONFIG_INIT("CONFIG_MEMORY_FAILURE"); > + struct tst_kconfig_var device_kconfig = TST_KCONFIG_INIT("CONFIG_DEVICE_PRIVATE"); > + struct tst_kconfig_var marker_kconfig = TST_KCONFIG_INIT("CONFIG_PTE_MARKER"); > + > + tst_kconfig_read(&migration_kconfig, 1); > + tst_kconfig_read(&memory_kconfig, 1); > + tst_kconfig_read(&device_kconfig, 1); > + tst_kconfig_read(&marker_kconfig, 1); > + > + if (migration_kconfig.choice == 'y') { > + if (tst_kvercmp(5, 19, 0) < 0) > + swp_migration_num = 2; > + else > + swp_migration_num = 3; > + } > + > + if (memory_kconfig.choice == 'y') > + swp_hwpoison_num = 1; > + > + if (device_kconfig.choice == 'y') { > + if (tst_kvercmp(5, 14, 0) >= 0) > + swp_device_num = 4; > + } > + > + if (marker_kconfig.choice == 'y') { > + if (tst_kvercmp(5, 19, 0) < 0) > + swp_pte_marker_num = 1; > + } > + > + return max_swapfile - swp_migration_num - swp_hwpoison_num - swp_device_num - swp_pte_marker_num; > +} -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [LTP] [PATCH 1/3] libltpswap: Add get_maxswapfiles api 2023-12-05 6:16 [LTP] [PATCH 1/3] libltpswap: Add get_maxswapfiles api Yang Xu ` (2 preceding siblings ...) 2023-12-15 6:04 ` [LTP] [PATCH 1/3] " Yang Xu (Fujitsu) @ 2024-01-03 14:53 ` Cyril Hrubis 3 siblings, 0 replies; 22+ messages in thread From: Cyril Hrubis @ 2024-01-03 14:53 UTC (permalink / raw) To: Yang Xu; +Cc: ltp Hi! > +unsigned int get_maxswapfiles(void) > +{ > + unsigned int max_swapfile = 32; > + unsigned int swp_migration_num = 0, swp_hwpoison_num = 0, swp_device_num = 0, swp_pte_marker_num = 0; > + struct tst_kconfig_var migration_kconfig = TST_KCONFIG_INIT("CONFIG_MIGRATION"); > + struct tst_kconfig_var memory_kconfig = TST_KCONFIG_INIT("CONFIG_MEMORY_FAILURE"); > + struct tst_kconfig_var device_kconfig = TST_KCONFIG_INIT("CONFIG_DEVICE_PRIVATE"); > + struct tst_kconfig_var marker_kconfig = TST_KCONFIG_INIT("CONFIG_PTE_MARKER"); > + > + tst_kconfig_read(&migration_kconfig, 1); > + tst_kconfig_read(&memory_kconfig, 1); > + tst_kconfig_read(&device_kconfig, 1); > + tst_kconfig_read(&marker_kconfig, 1); This API is designed so that we can pass an array and parse all values in a single call. So this should be done as: struct tst_kconfig_var kconfig[] = { TST_KCONFIG_INIT("CONFIG_MIGRATION"), TST_KCONFIG_INIT("CONFIG_MEMORY_FAILURE"), ... }; tst_kconfig_read(kconfig, ARRAY_SIZE(kconfigs)); If you want to have a nice indexes into that array, you can create an enum as: enum cfg_idx { CFG_MIGRATION, CFG_MEMORY_FAILURE, ... }; Then use them in the array initialization to make sure they match: struct tst_kconfig_var kconfig[] = { [CFG_MIGRATION] = TST_KCONFIG_INIT("CONFIG_MIGRATION"), ... }; And finally we can use these as: if (kconfig[CFG_MIGRATION].choice == 'y') I guess that this is quite cumbersome to use, maybe we need optional pointer in the tst_kconfig_var structure so we can pass a pointer to a char that would be set to the value of choice then we could do: char migration_choice; struct tst_kconfig_var kconfig[] = { TST_KCONFIG_INIT2("CONFIG_MIGRATION", &migration_choice), ... }; if (migration_choice == 'y') ... -- Cyril Hrubis chrubis@suse.cz -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2024-02-06 8:55 UTC | newest] Thread overview: 22+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-12-05 6:16 [LTP] [PATCH 1/3] libltpswap: Add get_maxswapfiles api Yang Xu 2023-12-05 6:16 ` [LTP] [PATCH 2/3] syscalls/swapon03: Use get_maxswapfiles() api instead of hard code Yang Xu 2023-12-22 1:39 ` Yang Xu (Fujitsu) 2023-12-22 11:42 ` Petr Vorel 2023-12-05 6:16 ` [LTP] [PATCH 3/3] swaponoff.h: Remove useless header Yang Xu 2023-12-22 5:00 ` [LTP] [PATCH v2 1/7] libltpswap: Add get_maxswapfiles api Yang Xu 2023-12-22 5:00 ` [LTP] [PATCH v2 2/7] libltpswap: alter get_used_swapfiles api Yang Xu 2024-01-03 15:30 ` Cyril Hrubis 2023-12-22 5:00 ` [LTP] [PATCH v2 3/7] syscalls/swapon03: use get_maxswapfiles() and GET_USED_SWAPFILES() api Yang Xu 2024-01-03 15:34 ` Cyril Hrubis 2023-12-22 5:00 ` [LTP] [PATCH v2 4/7] swaponoff.h: Remove useless header Yang Xu 2023-12-22 5:00 ` [LTP] [PATCH v2 5/7] swapon/Makefile: Remove useless section for MAX_SWAPFILES Yang Xu 2024-01-03 15:40 ` Cyril Hrubis 2023-12-22 5:00 ` [LTP] [PATCH v2 6/7] syscalls/swapon03: Simply this case Yang Xu 2023-12-22 5:00 ` [LTP] [PATCH v2 7/7] Add fallback for RHEL9 Yang Xu 2024-02-05 18:37 ` Petr Vorel 2024-01-02 2:07 ` [LTP] [PATCH v2 1/7] libltpswap: Add get_maxswapfiles api Yang Xu (Fujitsu) 2024-01-03 15:35 ` Cyril Hrubis 2024-02-05 18:43 ` Petr Vorel 2024-02-06 8:55 ` Yang Xu (Fujitsu) via ltp 2023-12-15 6:04 ` [LTP] [PATCH 1/3] " Yang Xu (Fujitsu) 2024-01-03 14:53 ` Cyril Hrubis
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox