9c92ab6191415 (Thomas Gleixner 2019-05-29 07:17:56 -0700 1) // SPDX-License-Identifier: GPL-2.0-only
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 2) /*
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 3) * Kernel module for testing static keys.
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 4) *
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 5) * Copyright 2015 Akamai Technologies Inc. All Rights Reserved
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 6) *
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 7) * Authors:
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 8) * Jason Baron <jbaron@akamai.com>
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 9) */
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 10)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 11) #include <linux/module.h>
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 12) #include <linux/jump_label.h>
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 13)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 14) /* old keys */
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 15) struct static_key old_true_key = STATIC_KEY_INIT_TRUE;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 16) struct static_key old_false_key = STATIC_KEY_INIT_FALSE;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 17)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 18) /* new api */
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 19) DEFINE_STATIC_KEY_TRUE(true_key);
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 20) DEFINE_STATIC_KEY_FALSE(false_key);
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 21)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 22) /* external */
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 23) extern struct static_key base_old_true_key;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 24) extern struct static_key base_inv_old_true_key;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 25) extern struct static_key base_old_false_key;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 26) extern struct static_key base_inv_old_false_key;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 27)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 28) /* new api */
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 29) extern struct static_key_true base_true_key;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 30) extern struct static_key_true base_inv_true_key;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 31) extern struct static_key_false base_false_key;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 32) extern struct static_key_false base_inv_false_key;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 33)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 34)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 35) struct test_key {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 36) bool init_state;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 37) struct static_key *key;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 38) bool (*test_key)(void);
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 39) };
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 40)
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 41) #define test_key_func(key, branch) \
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 42) static bool key ## _ ## branch(void) \
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 43) { \
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 44) return branch(&key); \
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 45) }
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 46)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 47) static void invert_key(struct static_key *key)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 48) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 49) if (static_key_enabled(key))
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 50) static_key_disable(key);
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 51) else
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 52) static_key_enable(key);
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 53) }
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 54)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 55) static void invert_keys(struct test_key *keys, int size)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 56) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 57) struct static_key *previous = NULL;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 58) int i;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 59)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 60) for (i = 0; i < size; i++) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 61) if (previous != keys[i].key) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 62) invert_key(keys[i].key);
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 63) previous = keys[i].key;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 64) }
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 65) }
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 66) }
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 67)
20f9ed1568c00 (kbuild test robot 2015-08-04 02:47:48 +0800 68) static int verify_keys(struct test_key *keys, int size, bool invert)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 69) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 70) int i;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 71) bool ret, init;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 72)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 73) for (i = 0; i < size; i++) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 74) ret = static_key_enabled(keys[i].key);
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 75) init = keys[i].init_state;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 76) if (ret != (invert ? !init : init))
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 77) return -EINVAL;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 78) ret = keys[i].test_key();
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 79) if (static_key_enabled(keys[i].key)) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 80) if (!ret)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 81) return -EINVAL;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 82) } else {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 83) if (ret)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 84) return -EINVAL;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 85) }
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 86) }
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 87) return 0;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 88) }
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 89)
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 90) test_key_func(old_true_key, static_key_true)
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 91) test_key_func(old_false_key, static_key_false)
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 92) test_key_func(true_key, static_branch_likely)
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 93) test_key_func(true_key, static_branch_unlikely)
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 94) test_key_func(false_key, static_branch_likely)
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 95) test_key_func(false_key, static_branch_unlikely)
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 96) test_key_func(base_old_true_key, static_key_true)
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 97) test_key_func(base_inv_old_true_key, static_key_true)
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 98) test_key_func(base_old_false_key, static_key_false)
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 99) test_key_func(base_inv_old_false_key, static_key_false)
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 100) test_key_func(base_true_key, static_branch_likely)
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 101) test_key_func(base_true_key, static_branch_unlikely)
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 102) test_key_func(base_inv_true_key, static_branch_likely)
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 103) test_key_func(base_inv_true_key, static_branch_unlikely)
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 104) test_key_func(base_false_key, static_branch_likely)
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 105) test_key_func(base_false_key, static_branch_unlikely)
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 106) test_key_func(base_inv_false_key, static_branch_likely)
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 107) test_key_func(base_inv_false_key, static_branch_unlikely)
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 108)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 109) static int __init test_static_key_init(void)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 110) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 111) int ret;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 112) int size;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 113)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 114) struct test_key static_key_tests[] = {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 115) /* internal keys - old keys */
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 116) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 117) .init_state = true,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 118) .key = &old_true_key,
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 119) .test_key = &old_true_key_static_key_true,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 120) },
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 121) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 122) .init_state = false,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 123) .key = &old_false_key,
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 124) .test_key = &old_false_key_static_key_false,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 125) },
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 126) /* internal keys - new keys */
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 127) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 128) .init_state = true,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 129) .key = &true_key.key,
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 130) .test_key = &true_key_static_branch_likely,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 131) },
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 132) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 133) .init_state = true,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 134) .key = &true_key.key,
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 135) .test_key = &true_key_static_branch_unlikely,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 136) },
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 137) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 138) .init_state = false,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 139) .key = &false_key.key,
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 140) .test_key = &false_key_static_branch_likely,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 141) },
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 142) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 143) .init_state = false,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 144) .key = &false_key.key,
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 145) .test_key = &false_key_static_branch_unlikely,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 146) },
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 147) /* external keys - old keys */
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 148) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 149) .init_state = true,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 150) .key = &base_old_true_key,
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 151) .test_key = &base_old_true_key_static_key_true,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 152) },
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 153) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 154) .init_state = false,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 155) .key = &base_inv_old_true_key,
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 156) .test_key = &base_inv_old_true_key_static_key_true,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 157) },
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 158) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 159) .init_state = false,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 160) .key = &base_old_false_key,
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 161) .test_key = &base_old_false_key_static_key_false,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 162) },
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 163) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 164) .init_state = true,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 165) .key = &base_inv_old_false_key,
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 166) .test_key = &base_inv_old_false_key_static_key_false,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 167) },
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 168) /* external keys - new keys */
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 169) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 170) .init_state = true,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 171) .key = &base_true_key.key,
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 172) .test_key = &base_true_key_static_branch_likely,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 173) },
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 174) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 175) .init_state = true,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 176) .key = &base_true_key.key,
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 177) .test_key = &base_true_key_static_branch_unlikely,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 178) },
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 179) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 180) .init_state = false,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 181) .key = &base_inv_true_key.key,
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 182) .test_key = &base_inv_true_key_static_branch_likely,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 183) },
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 184) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 185) .init_state = false,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 186) .key = &base_inv_true_key.key,
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 187) .test_key = &base_inv_true_key_static_branch_unlikely,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 188) },
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 189) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 190) .init_state = false,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 191) .key = &base_false_key.key,
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 192) .test_key = &base_false_key_static_branch_likely,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 193) },
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 194) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 195) .init_state = false,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 196) .key = &base_false_key.key,
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 197) .test_key = &base_false_key_static_branch_unlikely,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 198) },
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 199) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 200) .init_state = true,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 201) .key = &base_inv_false_key.key,
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 202) .test_key = &base_inv_false_key_static_branch_likely,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 203) },
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 204) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 205) .init_state = true,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 206) .key = &base_inv_false_key.key,
975db45e9cc56 (Arnd Bergmann 2016-02-08 15:36:52 +0100 207) .test_key = &base_inv_false_key_static_branch_unlikely,
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 208) },
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 209) };
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 210)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 211) size = ARRAY_SIZE(static_key_tests);
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 212)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 213) ret = verify_keys(static_key_tests, size, false);
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 214) if (ret)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 215) goto out;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 216)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 217) invert_keys(static_key_tests, size);
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 218) ret = verify_keys(static_key_tests, size, true);
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 219) if (ret)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 220) goto out;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 221)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 222) invert_keys(static_key_tests, size);
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 223) ret = verify_keys(static_key_tests, size, false);
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 224) if (ret)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 225) goto out;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 226) return 0;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 227) out:
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 228) return ret;
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 229) }
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 230)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 231) static void __exit test_static_key_exit(void)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 232) {
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 233) }
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 234)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 235) module_init(test_static_key_init);
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 236) module_exit(test_static_key_exit);
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 237)
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 238) MODULE_AUTHOR("Jason Baron <jbaron@akamai.com>");
2bf9e0ab08c64 (Ingo Molnar 2015-08-03 11:42:57 +0200 239) MODULE_LICENSE("GPL");