From: Ira Weiny <[email protected]>
It is more convenient to use command line options for debug and
iterations vs changing the code and recompiling.
Add command line options for debug level and number of iterations.
$ ./protection_keys_64 -h
Usage: ./protection_keys_64 [-h,-d,-i <iter>]
--help,-h This help
--debug,-d Increase debug level for each -d
--iterations,-i <iter> repeate test <iter> times
default: 22
Cc: Dave Hansen <[email protected]>
Cc: Aneesh Kumar K.V <[email protected]>
Signed-off-by: Ira Weiny <[email protected]>
---
tools/testing/selftests/vm/pkey-helpers.h | 7 +--
tools/testing/selftests/vm/protection_keys.c | 59 +++++++++++++++++---
2 files changed, 55 insertions(+), 11 deletions(-)
diff --git a/tools/testing/selftests/vm/pkey-helpers.h b/tools/testing/selftests/vm/pkey-helpers.h
index 92f3be3dd8e5..7aaac1c8ebca 100644
--- a/tools/testing/selftests/vm/pkey-helpers.h
+++ b/tools/testing/selftests/vm/pkey-helpers.h
@@ -23,9 +23,8 @@
#define PTR_ERR_ENOTSUP ((void *)-ENOTSUP)
-#ifndef DEBUG_LEVEL
-#define DEBUG_LEVEL 0
-#endif
+extern int debug_level;
+
#define DPRINT_IN_SIGNAL_BUF_SIZE 4096
extern int dprint_in_signal;
extern char dprint_in_signal_buffer[DPRINT_IN_SIGNAL_BUF_SIZE];
@@ -58,7 +57,7 @@ static inline void sigsafe_printf(const char *format, ...)
}
}
#define dprintf_level(level, args...) do { \
- if (level <= DEBUG_LEVEL) \
+ if (level <= debug_level) \
sigsafe_printf(args); \
} while (0)
#define dprintf0(args...) dprintf_level(0, args)
diff --git a/tools/testing/selftests/vm/protection_keys.c b/tools/testing/selftests/vm/protection_keys.c
index 291bc1e07842..d0183c381859 100644
--- a/tools/testing/selftests/vm/protection_keys.c
+++ b/tools/testing/selftests/vm/protection_keys.c
@@ -44,9 +44,13 @@
#include <unistd.h>
#include <sys/ptrace.h>
#include <setjmp.h>
+#include <getopt.h>
#include "pkey-helpers.h"
+#define DEFAULT_ITERATIONS 22
+
+int debug_level;
int iteration_nr = 1;
int test_nr;
@@ -361,7 +365,7 @@ void signal_handler(int signum, siginfo_t *si, void *vucontext)
* here.
*/
dprintf1("pkey_reg_xstate_offset: %d\n", pkey_reg_xstate_offset());
- if (DEBUG_LEVEL > 4)
+ if (debug_level > 4)
dump_mem(pkey_reg_ptr - 128, 256);
pkey_assert(*pkey_reg_ptr);
#endif /* arch */
@@ -480,7 +484,7 @@ int sys_mprotect_pkey(void *ptr, size_t size, unsigned long orig_prot,
dprintf2("SYS_mprotect_key sret: %d\n", sret);
dprintf2("SYS_mprotect_key prot: 0x%lx\n", orig_prot);
dprintf2("SYS_mprotect_key failed, errno: %d\n", errno);
- if (DEBUG_LEVEL >= 2)
+ if (debug_level >= 2)
perror("SYS_mprotect_pkey");
}
return sret;
@@ -1116,7 +1120,7 @@ void test_kernel_write_of_write_disabled_region(int *ptr, u16 pkey)
pkey_write_deny(pkey);
ret = read(test_fd, ptr, 100);
dprintf1("read ret: %d\n", ret);
- if (ret < 0 && (DEBUG_LEVEL > 0))
+ if (ret < 0 && (debug_level > 0))
perror("verbose read result (OK for this to be bad)");
pkey_assert(ret);
}
@@ -1155,7 +1159,7 @@ void test_kernel_gup_write_to_write_disabled_region(int *ptr, u16 pkey)
pkey_write_deny(pkey);
futex_ret = syscall(SYS_futex, ptr, FUTEX_WAIT, some_int-1, NULL,
&ignored, ignored);
- if (DEBUG_LEVEL > 0)
+ if (debug_level > 0)
perror("futex");
dprintf1("futex() ret: %d\n", futex_ret);
}
@@ -1626,11 +1630,52 @@ void pkey_setup_shadow(void)
shadow_pkey_reg = __read_pkey_reg();
}
-int main(void)
+static void print_help_and_exit(char *argv0)
+{
+ printf("Usage: %s [-h,-d,-i <iter>]\n", argv0);
+ printf(" --help,-h This help\n");
+ printf(" --debug,-d Increase debug level for each -d\n");
+ printf(" --iterations,-i <iter> repeate test <iter> times\n");
+ printf(" default: %d\n", DEFAULT_ITERATIONS);
+ printf("\n");
+}
+
+int main(int argc, char *argv[])
{
- int nr_iterations = 22;
- int pkeys_supported = is_pkeys_supported();
+ int nr_iterations = DEFAULT_ITERATIONS;
+ int pkeys_supported;
+
+ while (1) {
+ static struct option long_options[] = {
+ {"help", no_argument, 0, 'h' },
+ {"debug", no_argument, 0, 'd' },
+ {"iterations", required_argument, 0, 'i' },
+ {0, 0, 0, 0 }
+ };
+ int option_index = 0;
+ int c;
+
+ c = getopt_long(argc, argv, "hdi:", long_options, &option_index);
+ if (c == -1)
+ break;
+
+ switch (c) {
+ case 'h':
+ print_help_and_exit(argv[0]);
+ return 0;
+ case 'd':
+ debug_level++;
+ break;
+ case 'i':
+ nr_iterations = strtoul(optarg, NULL, 0);
+ break;
+ default:
+ print_help_and_exit(argv[0]);
+ exit(-1);
+ }
+ }
+ pkeys_supported = is_pkeys_supported();
srand((unsigned int)time(NULL));
setup_handlers();
--
2.35.1
On 6/10/2022 4:35 PM, [email protected] wrote:
> Add command line options for debug level and number of iterations.
>
> $ ./protection_keys_64 -h
> Usage: ./protection_keys_64 [-h,-d,-i <iter>]
> --help,-h This help
> --debug,-d Increase debug level for each -d
Is this mechanism (of counting d's) commonplace in other selftests as
well? Looking at the test code for pkeys the debug levels run from 1-5.
That feels like quite a few d's to input :)
Would it be easier to input the number in the command line directly?
Either way it would be useful to know the debug range in the help.
Maybe something like:
--debug,-d Increase debug level for each -d (1-5)
The patch seems fine to me otherwise.
> --iterations,-i <iter> repeate test <iter> times
> default: 22
>
Thanks,
Sohil
On Mon, Jun 13, 2022 at 03:31:02PM -0700, Mehta, Sohil wrote:
> On 6/10/2022 4:35 PM, [email protected] wrote:
>
> > Add command line options for debug level and number of iterations.
> >
> > $ ./protection_keys_64 -h
> > Usage: ./protection_keys_64 [-h,-d,-i <iter>]
> > --help,-h This help
> > --debug,-d Increase debug level for each -d
>
> Is this mechanism (of counting d's) commonplace in other selftests as well?
> Looking at the test code for pkeys the debug levels run from 1-5. That feels
> like quite a few d's to input :)
I've seen (and used) it before yes. See ibnetdiscover.
...
# Debugging flags
-d raise the IB debugging level. May be used several times (-ddd or -d -d -d).
...
-v increase the application verbosity level. May be used several times (-vv or -v -v -v)
...
- https://linux.die.net/man/8/ibnetdiscover
But a much more mainstream example I can think of is verbosity level with
lspci.
16:29:12 > lspci -h
...
Display options:
-v Be verbose (-vv or -vvv for higher verbosity)
...
>
> Would it be easier to input the number in the command line directly?
>
> Either way it would be useful to know the debug range in the help.
> Maybe something like:
> --debug,-d Increase debug level for each -d (1-5)
I'm inclined not to do this because it would encode the max debug level. On
the other hand I'm not sure why there are 5 levels now. ;-)
Having the multiple options specified was an easy way to maintain the large
number of levels.
Ira
>
> The patch seems fine to me otherwise.
>
> > --iterations,-i <iter> repeate test <iter> times
> > default: 22
> >
>
> Thanks,
> Sohil