0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 1) // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 2) /* Copyright (c) 2018 Mellanox Technologies. All rights reserved */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 3)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 4) #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 5)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 6) #include <linux/kernel.h>
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 7) #include <linux/module.h>
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 8) #include <linux/slab.h>
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 9) #include <linux/random.h>
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 10) #include <linux/objagg.h>
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 11)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 12) struct tokey {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 13) unsigned int id;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 14) };
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 15)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 16) #define NUM_KEYS 32
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 17)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 18) static int key_id_index(unsigned int key_id)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 19) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 20) if (key_id >= NUM_KEYS) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 21) WARN_ON(1);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 22) return 0;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 23) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 24) return key_id;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 25) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 26)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 27) #define BUF_LEN 128
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 28)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 29) struct world {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 30) unsigned int root_count;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 31) unsigned int delta_count;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 32) char next_root_buf[BUF_LEN];
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 33) struct objagg_obj *objagg_objs[NUM_KEYS];
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 34) unsigned int key_refs[NUM_KEYS];
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 35) };
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 36)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 37) struct root {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 38) struct tokey key;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 39) char buf[BUF_LEN];
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 40) };
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 41)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 42) struct delta {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 43) unsigned int key_id_diff;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 44) };
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 45)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 46) static struct objagg_obj *world_obj_get(struct world *world,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 47) struct objagg *objagg,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 48) unsigned int key_id)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 49) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 50) struct objagg_obj *objagg_obj;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 51) struct tokey key;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 52) int err;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 53)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 54) key.id = key_id;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 55) objagg_obj = objagg_obj_get(objagg, &key);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 56) if (IS_ERR(objagg_obj)) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 57) pr_err("Key %u: Failed to get object.\n", key_id);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 58) return objagg_obj;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 59) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 60) if (!world->key_refs[key_id_index(key_id)]) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 61) world->objagg_objs[key_id_index(key_id)] = objagg_obj;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 62) } else if (world->objagg_objs[key_id_index(key_id)] != objagg_obj) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 63) pr_err("Key %u: God another object for the same key.\n",
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 64) key_id);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 65) err = -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 66) goto err_key_id_check;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 67) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 68) world->key_refs[key_id_index(key_id)]++;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 69) return objagg_obj;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 70)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 71) err_key_id_check:
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 72) objagg_obj_put(objagg, objagg_obj);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 73) return ERR_PTR(err);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 74) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 75)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 76) static void world_obj_put(struct world *world, struct objagg *objagg,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 77) unsigned int key_id)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 78) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 79) struct objagg_obj *objagg_obj;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 80)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 81) if (!world->key_refs[key_id_index(key_id)])
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 82) return;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 83) objagg_obj = world->objagg_objs[key_id_index(key_id)];
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 84) objagg_obj_put(objagg, objagg_obj);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 85) world->key_refs[key_id_index(key_id)]--;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 86) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 87)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 88) #define MAX_KEY_ID_DIFF 5
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 89)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 90) static bool delta_check(void *priv, const void *parent_obj, const void *obj)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 91) {
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 92) const struct tokey *parent_key = parent_obj;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 93) const struct tokey *key = obj;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 94) int diff = key->id - parent_key->id;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 95)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 96) return diff >= 0 && diff <= MAX_KEY_ID_DIFF;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 97) }
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 98)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 99) static void *delta_create(void *priv, void *parent_obj, void *obj)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 100) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 101) struct tokey *parent_key = parent_obj;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 102) struct world *world = priv;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 103) struct tokey *key = obj;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 104) int diff = key->id - parent_key->id;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 105) struct delta *delta;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 106)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 107) if (!delta_check(priv, parent_obj, obj))
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 108) return ERR_PTR(-EINVAL);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 109)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 110) delta = kzalloc(sizeof(*delta), GFP_KERNEL);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 111) if (!delta)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 112) return ERR_PTR(-ENOMEM);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 113) delta->key_id_diff = diff;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 114) world->delta_count++;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 115) return delta;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 116) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 117)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 118) static void delta_destroy(void *priv, void *delta_priv)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 119) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 120) struct delta *delta = delta_priv;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 121) struct world *world = priv;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 122)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 123) world->delta_count--;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 124) kfree(delta);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 125) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 126)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 127) static void *root_create(void *priv, void *obj, unsigned int id)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 128) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 129) struct world *world = priv;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 130) struct tokey *key = obj;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 131) struct root *root;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 132)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 133) root = kzalloc(sizeof(*root), GFP_KERNEL);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 134) if (!root)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 135) return ERR_PTR(-ENOMEM);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 136) memcpy(&root->key, key, sizeof(root->key));
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 137) memcpy(root->buf, world->next_root_buf, sizeof(root->buf));
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 138) world->root_count++;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 139) return root;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 140) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 141)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 142) static void root_destroy(void *priv, void *root_priv)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 143) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 144) struct root *root = root_priv;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 145) struct world *world = priv;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 146)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 147) world->root_count--;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 148) kfree(root);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 149) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 150)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 151) static int test_nodelta_obj_get(struct world *world, struct objagg *objagg,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 152) unsigned int key_id, bool should_create_root)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 153) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 154) unsigned int orig_root_count = world->root_count;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 155) struct objagg_obj *objagg_obj;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 156) const struct root *root;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 157) int err;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 158)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 159) if (should_create_root)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 160) prandom_bytes(world->next_root_buf,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 161) sizeof(world->next_root_buf));
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 162)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 163) objagg_obj = world_obj_get(world, objagg, key_id);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 164) if (IS_ERR(objagg_obj)) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 165) pr_err("Key %u: Failed to get object.\n", key_id);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 166) return PTR_ERR(objagg_obj);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 167) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 168) if (should_create_root) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 169) if (world->root_count != orig_root_count + 1) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 170) pr_err("Key %u: Root was not created\n", key_id);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 171) err = -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 172) goto err_check_root_count;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 173) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 174) } else {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 175) if (world->root_count != orig_root_count) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 176) pr_err("Key %u: Root was incorrectly created\n",
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 177) key_id);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 178) err = -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 179) goto err_check_root_count;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 180) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 181) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 182) root = objagg_obj_root_priv(objagg_obj);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 183) if (root->key.id != key_id) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 184) pr_err("Key %u: Root has unexpected key id\n", key_id);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 185) err = -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 186) goto err_check_key_id;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 187) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 188) if (should_create_root &&
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 189) memcmp(world->next_root_buf, root->buf, sizeof(root->buf))) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 190) pr_err("Key %u: Buffer does not match the expected content\n",
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 191) key_id);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 192) err = -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 193) goto err_check_buf;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 194) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 195) return 0;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 196)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 197) err_check_buf:
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 198) err_check_key_id:
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 199) err_check_root_count:
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 200) objagg_obj_put(objagg, objagg_obj);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 201) return err;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 202) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 203)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 204) static int test_nodelta_obj_put(struct world *world, struct objagg *objagg,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 205) unsigned int key_id, bool should_destroy_root)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 206) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 207) unsigned int orig_root_count = world->root_count;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 208)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 209) world_obj_put(world, objagg, key_id);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 210)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 211) if (should_destroy_root) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 212) if (world->root_count != orig_root_count - 1) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 213) pr_err("Key %u: Root was not destroyed\n", key_id);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 214) return -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 215) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 216) } else {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 217) if (world->root_count != orig_root_count) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 218) pr_err("Key %u: Root was incorrectly destroyed\n",
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 219) key_id);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 220) return -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 221) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 222) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 223) return 0;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 224) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 225)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 226) static int check_stats_zero(struct objagg *objagg)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 227) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 228) const struct objagg_stats *stats;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 229) int err = 0;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 230)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 231) stats = objagg_stats_get(objagg);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 232) if (IS_ERR(stats))
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 233) return PTR_ERR(stats);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 234)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 235) if (stats->stats_info_count != 0) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 236) pr_err("Stats: Object count is not zero while it should be\n");
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 237) err = -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 238) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 239)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 240) objagg_stats_put(stats);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 241) return err;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 242) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 243)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 244) static int check_stats_nodelta(struct objagg *objagg)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 245) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 246) const struct objagg_stats *stats;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 247) int i;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 248) int err;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 249)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 250) stats = objagg_stats_get(objagg);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 251) if (IS_ERR(stats))
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 252) return PTR_ERR(stats);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 253)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 254) if (stats->stats_info_count != NUM_KEYS) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 255) pr_err("Stats: Unexpected object count (%u expected, %u returned)\n",
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 256) NUM_KEYS, stats->stats_info_count);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 257) err = -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 258) goto stats_put;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 259) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 260)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 261) for (i = 0; i < stats->stats_info_count; i++) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 262) if (stats->stats_info[i].stats.user_count != 2) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 263) pr_err("Stats: incorrect user count\n");
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 264) err = -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 265) goto stats_put;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 266) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 267) if (stats->stats_info[i].stats.delta_user_count != 2) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 268) pr_err("Stats: incorrect delta user count\n");
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 269) err = -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 270) goto stats_put;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 271) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 272) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 273) err = 0;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 274)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 275) stats_put:
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 276) objagg_stats_put(stats);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 277) return err;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 278) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 279)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 280) static bool delta_check_dummy(void *priv, const void *parent_obj,
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 281) const void *obj)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 282) {
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 283) return false;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 284) }
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 285)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 286) static void *delta_create_dummy(void *priv, void *parent_obj, void *obj)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 287) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 288) return ERR_PTR(-EOPNOTSUPP);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 289) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 290)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 291) static void delta_destroy_dummy(void *priv, void *delta_priv)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 292) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 293) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 294)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 295) static const struct objagg_ops nodelta_ops = {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 296) .obj_size = sizeof(struct tokey),
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 297) .delta_check = delta_check_dummy,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 298) .delta_create = delta_create_dummy,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 299) .delta_destroy = delta_destroy_dummy,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 300) .root_create = root_create,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 301) .root_destroy = root_destroy,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 302) };
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 303)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 304) static int test_nodelta(void)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 305) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 306) struct world world = {};
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 307) struct objagg *objagg;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 308) int i;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 309) int err;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 310)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 311) objagg = objagg_create(&nodelta_ops, NULL, &world);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 312) if (IS_ERR(objagg))
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 313) return PTR_ERR(objagg);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 314)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 315) err = check_stats_zero(objagg);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 316) if (err)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 317) goto err_stats_first_zero;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 318)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 319) /* First round of gets, the root objects should be created */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 320) for (i = 0; i < NUM_KEYS; i++) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 321) err = test_nodelta_obj_get(&world, objagg, i, true);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 322) if (err)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 323) goto err_obj_first_get;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 324) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 325)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 326) /* Do the second round of gets, all roots are already created,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 327) * make sure that no new root is created
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 328) */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 329) for (i = 0; i < NUM_KEYS; i++) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 330) err = test_nodelta_obj_get(&world, objagg, i, false);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 331) if (err)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 332) goto err_obj_second_get;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 333) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 334)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 335) err = check_stats_nodelta(objagg);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 336) if (err)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 337) goto err_stats_nodelta;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 338)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 339) for (i = NUM_KEYS - 1; i >= 0; i--) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 340) err = test_nodelta_obj_put(&world, objagg, i, false);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 341) if (err)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 342) goto err_obj_first_put;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 343) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 344) for (i = NUM_KEYS - 1; i >= 0; i--) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 345) err = test_nodelta_obj_put(&world, objagg, i, true);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 346) if (err)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 347) goto err_obj_second_put;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 348) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 349)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 350) err = check_stats_zero(objagg);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 351) if (err)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 352) goto err_stats_second_zero;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 353)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 354) objagg_destroy(objagg);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 355) return 0;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 356)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 357) err_stats_nodelta:
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 358) err_obj_first_put:
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 359) err_obj_second_get:
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 360) for (i--; i >= 0; i--)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 361) world_obj_put(&world, objagg, i);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 362)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 363) i = NUM_KEYS;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 364) err_obj_first_get:
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 365) err_obj_second_put:
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 366) for (i--; i >= 0; i--)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 367) world_obj_put(&world, objagg, i);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 368) err_stats_first_zero:
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 369) err_stats_second_zero:
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 370) objagg_destroy(objagg);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 371) return err;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 372) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 373)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 374) static const struct objagg_ops delta_ops = {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 375) .obj_size = sizeof(struct tokey),
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 376) .delta_check = delta_check,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 377) .delta_create = delta_create,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 378) .delta_destroy = delta_destroy,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 379) .root_create = root_create,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 380) .root_destroy = root_destroy,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 381) };
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 382)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 383) enum action {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 384) ACTION_GET,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 385) ACTION_PUT,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 386) };
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 387)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 388) enum expect_delta {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 389) EXPECT_DELTA_SAME,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 390) EXPECT_DELTA_INC,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 391) EXPECT_DELTA_DEC,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 392) };
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 393)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 394) enum expect_root {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 395) EXPECT_ROOT_SAME,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 396) EXPECT_ROOT_INC,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 397) EXPECT_ROOT_DEC,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 398) };
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 399)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 400) struct expect_stats_info {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 401) struct objagg_obj_stats stats;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 402) bool is_root;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 403) unsigned int key_id;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 404) };
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 405)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 406) struct expect_stats {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 407) unsigned int info_count;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 408) struct expect_stats_info info[NUM_KEYS];
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 409) };
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 410)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 411) struct action_item {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 412) unsigned int key_id;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 413) enum action action;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 414) enum expect_delta expect_delta;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 415) enum expect_root expect_root;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 416) struct expect_stats expect_stats;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 417) };
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 418)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 419) #define EXPECT_STATS(count, ...) \
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 420) { \
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 421) .info_count = count, \
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 422) .info = { __VA_ARGS__ } \
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 423) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 424)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 425) #define ROOT(key_id, user_count, delta_user_count) \
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 426) {{user_count, delta_user_count}, true, key_id}
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 427)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 428) #define DELTA(key_id, user_count) \
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 429) {{user_count, user_count}, false, key_id}
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 430)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 431) static const struct action_item action_items[] = {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 432) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 433) 1, ACTION_GET, EXPECT_DELTA_SAME, EXPECT_ROOT_INC,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 434) EXPECT_STATS(1, ROOT(1, 1, 1)),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 435) }, /* r: 1 d: */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 436) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 437) 7, ACTION_GET, EXPECT_DELTA_SAME, EXPECT_ROOT_INC,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 438) EXPECT_STATS(2, ROOT(1, 1, 1), ROOT(7, 1, 1)),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 439) }, /* r: 1, 7 d: */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 440) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 441) 3, ACTION_GET, EXPECT_DELTA_INC, EXPECT_ROOT_SAME,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 442) EXPECT_STATS(3, ROOT(1, 1, 2), ROOT(7, 1, 1),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 443) DELTA(3, 1)),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 444) }, /* r: 1, 7 d: 3^1 */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 445) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 446) 5, ACTION_GET, EXPECT_DELTA_INC, EXPECT_ROOT_SAME,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 447) EXPECT_STATS(4, ROOT(1, 1, 3), ROOT(7, 1, 1),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 448) DELTA(3, 1), DELTA(5, 1)),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 449) }, /* r: 1, 7 d: 3^1, 5^1 */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 450) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 451) 3, ACTION_GET, EXPECT_DELTA_SAME, EXPECT_ROOT_SAME,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 452) EXPECT_STATS(4, ROOT(1, 1, 4), ROOT(7, 1, 1),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 453) DELTA(3, 2), DELTA(5, 1)),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 454) }, /* r: 1, 7 d: 3^1, 3^1, 5^1 */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 455) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 456) 1, ACTION_GET, EXPECT_DELTA_SAME, EXPECT_ROOT_SAME,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 457) EXPECT_STATS(4, ROOT(1, 2, 5), ROOT(7, 1, 1),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 458) DELTA(3, 2), DELTA(5, 1)),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 459) }, /* r: 1, 1, 7 d: 3^1, 3^1, 5^1 */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 460) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 461) 30, ACTION_GET, EXPECT_DELTA_SAME, EXPECT_ROOT_INC,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 462) EXPECT_STATS(5, ROOT(1, 2, 5), ROOT(7, 1, 1), ROOT(30, 1, 1),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 463) DELTA(3, 2), DELTA(5, 1)),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 464) }, /* r: 1, 1, 7, 30 d: 3^1, 3^1, 5^1 */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 465) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 466) 8, ACTION_GET, EXPECT_DELTA_INC, EXPECT_ROOT_SAME,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 467) EXPECT_STATS(6, ROOT(1, 2, 5), ROOT(7, 1, 2), ROOT(30, 1, 1),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 468) DELTA(3, 2), DELTA(5, 1), DELTA(8, 1)),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 469) }, /* r: 1, 1, 7, 30 d: 3^1, 3^1, 5^1, 8^7 */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 470) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 471) 8, ACTION_GET, EXPECT_DELTA_SAME, EXPECT_ROOT_SAME,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 472) EXPECT_STATS(6, ROOT(1, 2, 5), ROOT(7, 1, 3), ROOT(30, 1, 1),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 473) DELTA(3, 2), DELTA(8, 2), DELTA(5, 1)),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 474) }, /* r: 1, 1, 7, 30 d: 3^1, 3^1, 5^1, 8^7, 8^7 */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 475) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 476) 3, ACTION_PUT, EXPECT_DELTA_SAME, EXPECT_ROOT_SAME,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 477) EXPECT_STATS(6, ROOT(1, 2, 4), ROOT(7, 1, 3), ROOT(30, 1, 1),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 478) DELTA(8, 2), DELTA(3, 1), DELTA(5, 1)),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 479) }, /* r: 1, 1, 7, 30 d: 3^1, 5^1, 8^7, 8^7 */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 480) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 481) 3, ACTION_PUT, EXPECT_DELTA_DEC, EXPECT_ROOT_SAME,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 482) EXPECT_STATS(5, ROOT(1, 2, 3), ROOT(7, 1, 3), ROOT(30, 1, 1),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 483) DELTA(8, 2), DELTA(5, 1)),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 484) }, /* r: 1, 1, 7, 30 d: 5^1, 8^7, 8^7 */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 485) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 486) 1, ACTION_PUT, EXPECT_DELTA_SAME, EXPECT_ROOT_SAME,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 487) EXPECT_STATS(5, ROOT(7, 1, 3), ROOT(1, 1, 2), ROOT(30, 1, 1),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 488) DELTA(8, 2), DELTA(5, 1)),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 489) }, /* r: 1, 7, 30 d: 5^1, 8^7, 8^7 */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 490) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 491) 1, ACTION_PUT, EXPECT_DELTA_SAME, EXPECT_ROOT_SAME,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 492) EXPECT_STATS(5, ROOT(7, 1, 3), ROOT(30, 1, 1), ROOT(1, 0, 1),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 493) DELTA(8, 2), DELTA(5, 1)),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 494) }, /* r: 7, 30 d: 5^1, 8^7, 8^7 */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 495) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 496) 5, ACTION_PUT, EXPECT_DELTA_DEC, EXPECT_ROOT_DEC,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 497) EXPECT_STATS(3, ROOT(7, 1, 3), ROOT(30, 1, 1),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 498) DELTA(8, 2)),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 499) }, /* r: 7, 30 d: 8^7, 8^7 */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 500) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 501) 5, ACTION_GET, EXPECT_DELTA_SAME, EXPECT_ROOT_INC,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 502) EXPECT_STATS(4, ROOT(7, 1, 3), ROOT(30, 1, 1), ROOT(5, 1, 1),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 503) DELTA(8, 2)),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 504) }, /* r: 7, 30, 5 d: 8^7, 8^7 */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 505) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 506) 6, ACTION_GET, EXPECT_DELTA_INC, EXPECT_ROOT_SAME,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 507) EXPECT_STATS(5, ROOT(7, 1, 3), ROOT(5, 1, 2), ROOT(30, 1, 1),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 508) DELTA(8, 2), DELTA(6, 1)),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 509) }, /* r: 7, 30, 5 d: 8^7, 8^7, 6^5 */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 510) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 511) 8, ACTION_GET, EXPECT_DELTA_SAME, EXPECT_ROOT_SAME,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 512) EXPECT_STATS(5, ROOT(7, 1, 4), ROOT(5, 1, 2), ROOT(30, 1, 1),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 513) DELTA(8, 3), DELTA(6, 1)),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 514) }, /* r: 7, 30, 5 d: 8^7, 8^7, 8^7, 6^5 */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 515) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 516) 8, ACTION_PUT, EXPECT_DELTA_SAME, EXPECT_ROOT_SAME,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 517) EXPECT_STATS(5, ROOT(7, 1, 3), ROOT(5, 1, 2), ROOT(30, 1, 1),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 518) DELTA(8, 2), DELTA(6, 1)),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 519) }, /* r: 7, 30, 5 d: 8^7, 8^7, 6^5 */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 520) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 521) 8, ACTION_PUT, EXPECT_DELTA_SAME, EXPECT_ROOT_SAME,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 522) EXPECT_STATS(5, ROOT(7, 1, 2), ROOT(5, 1, 2), ROOT(30, 1, 1),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 523) DELTA(8, 1), DELTA(6, 1)),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 524) }, /* r: 7, 30, 5 d: 8^7, 6^5 */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 525) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 526) 8, ACTION_PUT, EXPECT_DELTA_DEC, EXPECT_ROOT_SAME,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 527) EXPECT_STATS(4, ROOT(5, 1, 2), ROOT(7, 1, 1), ROOT(30, 1, 1),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 528) DELTA(6, 1)),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 529) }, /* r: 7, 30, 5 d: 6^5 */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 530) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 531) 8, ACTION_GET, EXPECT_DELTA_INC, EXPECT_ROOT_SAME,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 532) EXPECT_STATS(5, ROOT(5, 1, 3), ROOT(7, 1, 1), ROOT(30, 1, 1),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 533) DELTA(6, 1), DELTA(8, 1)),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 534) }, /* r: 7, 30, 5 d: 6^5, 8^5 */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 535) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 536) 7, ACTION_PUT, EXPECT_DELTA_SAME, EXPECT_ROOT_DEC,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 537) EXPECT_STATS(4, ROOT(5, 1, 3), ROOT(30, 1, 1),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 538) DELTA(6, 1), DELTA(8, 1)),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 539) }, /* r: 30, 5 d: 6^5, 8^5 */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 540) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 541) 30, ACTION_PUT, EXPECT_DELTA_SAME, EXPECT_ROOT_DEC,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 542) EXPECT_STATS(3, ROOT(5, 1, 3),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 543) DELTA(6, 1), DELTA(8, 1)),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 544) }, /* r: 5 d: 6^5, 8^5 */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 545) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 546) 5, ACTION_PUT, EXPECT_DELTA_SAME, EXPECT_ROOT_SAME,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 547) EXPECT_STATS(3, ROOT(5, 0, 2),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 548) DELTA(6, 1), DELTA(8, 1)),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 549) }, /* r: d: 6^5, 8^5 */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 550) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 551) 6, ACTION_PUT, EXPECT_DELTA_DEC, EXPECT_ROOT_SAME,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 552) EXPECT_STATS(2, ROOT(5, 0, 1),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 553) DELTA(8, 1)),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 554) }, /* r: d: 6^5 */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 555) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 556) 8, ACTION_PUT, EXPECT_DELTA_DEC, EXPECT_ROOT_DEC,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 557) EXPECT_STATS(0, ),
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 558) }, /* r: d: */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 559) };
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 560)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 561) static int check_expect(struct world *world,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 562) const struct action_item *action_item,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 563) unsigned int orig_delta_count,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 564) unsigned int orig_root_count)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 565) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 566) unsigned int key_id = action_item->key_id;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 567)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 568) switch (action_item->expect_delta) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 569) case EXPECT_DELTA_SAME:
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 570) if (orig_delta_count != world->delta_count) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 571) pr_err("Key %u: Delta count changed while expected to remain the same.\n",
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 572) key_id);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 573) return -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 574) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 575) break;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 576) case EXPECT_DELTA_INC:
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 577) if (WARN_ON(action_item->action == ACTION_PUT))
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 578) return -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 579) if (orig_delta_count + 1 != world->delta_count) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 580) pr_err("Key %u: Delta count was not incremented.\n",
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 581) key_id);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 582) return -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 583) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 584) break;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 585) case EXPECT_DELTA_DEC:
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 586) if (WARN_ON(action_item->action == ACTION_GET))
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 587) return -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 588) if (orig_delta_count - 1 != world->delta_count) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 589) pr_err("Key %u: Delta count was not decremented.\n",
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 590) key_id);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 591) return -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 592) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 593) break;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 594) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 595)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 596) switch (action_item->expect_root) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 597) case EXPECT_ROOT_SAME:
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 598) if (orig_root_count != world->root_count) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 599) pr_err("Key %u: Root count changed while expected to remain the same.\n",
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 600) key_id);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 601) return -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 602) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 603) break;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 604) case EXPECT_ROOT_INC:
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 605) if (WARN_ON(action_item->action == ACTION_PUT))
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 606) return -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 607) if (orig_root_count + 1 != world->root_count) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 608) pr_err("Key %u: Root count was not incremented.\n",
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 609) key_id);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 610) return -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 611) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 612) break;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 613) case EXPECT_ROOT_DEC:
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 614) if (WARN_ON(action_item->action == ACTION_GET))
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 615) return -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 616) if (orig_root_count - 1 != world->root_count) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 617) pr_err("Key %u: Root count was not decremented.\n",
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 618) key_id);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 619) return -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 620) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 621) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 622)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 623) return 0;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 624) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 625)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 626) static unsigned int obj_to_key_id(struct objagg_obj *objagg_obj)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 627) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 628) const struct tokey *root_key;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 629) const struct delta *delta;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 630) unsigned int key_id;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 631)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 632) root_key = objagg_obj_root_priv(objagg_obj);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 633) key_id = root_key->id;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 634) delta = objagg_obj_delta_priv(objagg_obj);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 635) if (delta)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 636) key_id += delta->key_id_diff;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 637) return key_id;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 638) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 639)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 640) static int
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 641) check_expect_stats_nums(const struct objagg_obj_stats_info *stats_info,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 642) const struct expect_stats_info *expect_stats_info,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 643) const char **errmsg)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 644) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 645) if (stats_info->is_root != expect_stats_info->is_root) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 646) if (errmsg)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 647) *errmsg = "Incorrect root/delta indication";
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 648) return -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 649) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 650) if (stats_info->stats.user_count !=
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 651) expect_stats_info->stats.user_count) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 652) if (errmsg)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 653) *errmsg = "Incorrect user count";
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 654) return -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 655) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 656) if (stats_info->stats.delta_user_count !=
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 657) expect_stats_info->stats.delta_user_count) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 658) if (errmsg)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 659) *errmsg = "Incorrect delta user count";
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 660) return -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 661) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 662) return 0;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 663) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 664)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 665) static int
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 666) check_expect_stats_key_id(const struct objagg_obj_stats_info *stats_info,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 667) const struct expect_stats_info *expect_stats_info,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 668) const char **errmsg)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 669) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 670) if (obj_to_key_id(stats_info->objagg_obj) !=
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 671) expect_stats_info->key_id) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 672) if (errmsg)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 673) *errmsg = "incorrect key id";
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 674) return -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 675) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 676) return 0;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 677) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 678)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 679) static int check_expect_stats_neigh(const struct objagg_stats *stats,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 680) const struct expect_stats *expect_stats,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 681) int pos)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 682) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 683) int i;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 684) int err;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 685)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 686) for (i = pos - 1; i >= 0; i--) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 687) err = check_expect_stats_nums(&stats->stats_info[i],
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 688) &expect_stats->info[pos], NULL);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 689) if (err)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 690) break;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 691) err = check_expect_stats_key_id(&stats->stats_info[i],
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 692) &expect_stats->info[pos], NULL);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 693) if (!err)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 694) return 0;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 695) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 696) for (i = pos + 1; i < stats->stats_info_count; i++) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 697) err = check_expect_stats_nums(&stats->stats_info[i],
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 698) &expect_stats->info[pos], NULL);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 699) if (err)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 700) break;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 701) err = check_expect_stats_key_id(&stats->stats_info[i],
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 702) &expect_stats->info[pos], NULL);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 703) if (!err)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 704) return 0;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 705) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 706) return -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 707) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 708)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 709) static int __check_expect_stats(const struct objagg_stats *stats,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 710) const struct expect_stats *expect_stats,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 711) const char **errmsg)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 712) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 713) int i;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 714) int err;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 715)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 716) if (stats->stats_info_count != expect_stats->info_count) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 717) *errmsg = "Unexpected object count";
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 718) return -EINVAL;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 719) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 720)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 721) for (i = 0; i < stats->stats_info_count; i++) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 722) err = check_expect_stats_nums(&stats->stats_info[i],
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 723) &expect_stats->info[i], errmsg);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 724) if (err)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 725) return err;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 726) err = check_expect_stats_key_id(&stats->stats_info[i],
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 727) &expect_stats->info[i], errmsg);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 728) if (err) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 729) /* It is possible that one of the neighbor stats with
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 730) * same numbers have the correct key id, so check it
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 731) */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 732) err = check_expect_stats_neigh(stats, expect_stats, i);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 733) if (err)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 734) return err;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 735) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 736) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 737) return 0;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 738) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 739)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 740) static int check_expect_stats(struct objagg *objagg,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 741) const struct expect_stats *expect_stats,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 742) const char **errmsg)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 743) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 744) const struct objagg_stats *stats;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 745) int err;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 746)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 747) stats = objagg_stats_get(objagg);
e7c2e3b570442 (Dan Carpenter 2019-02-13 11:59:31 +0300 748) if (IS_ERR(stats)) {
e7c2e3b570442 (Dan Carpenter 2019-02-13 11:59:31 +0300 749) *errmsg = "objagg_stats_get() failed.";
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 750) return PTR_ERR(stats);
e7c2e3b570442 (Dan Carpenter 2019-02-13 11:59:31 +0300 751) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 752) err = __check_expect_stats(stats, expect_stats, errmsg);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 753) objagg_stats_put(stats);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 754) return err;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 755) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 756)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 757) static int test_delta_action_item(struct world *world,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 758) struct objagg *objagg,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 759) const struct action_item *action_item,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 760) bool inverse)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 761) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 762) unsigned int orig_delta_count = world->delta_count;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 763) unsigned int orig_root_count = world->root_count;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 764) unsigned int key_id = action_item->key_id;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 765) enum action action = action_item->action;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 766) struct objagg_obj *objagg_obj;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 767) const char *errmsg;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 768) int err;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 769)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 770) if (inverse)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 771) action = action == ACTION_GET ? ACTION_PUT : ACTION_GET;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 772)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 773) switch (action) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 774) case ACTION_GET:
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 775) objagg_obj = world_obj_get(world, objagg, key_id);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 776) if (IS_ERR(objagg_obj))
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 777) return PTR_ERR(objagg_obj);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 778) break;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 779) case ACTION_PUT:
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 780) world_obj_put(world, objagg, key_id);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 781) break;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 782) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 783)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 784) if (inverse)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 785) return 0;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 786) err = check_expect(world, action_item,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 787) orig_delta_count, orig_root_count);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 788) if (err)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 789) goto errout;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 790)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 791) err = check_expect_stats(objagg, &action_item->expect_stats, &errmsg);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 792) if (err) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 793) pr_err("Key %u: Stats: %s\n", action_item->key_id, errmsg);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 794) goto errout;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 795) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 796)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 797) return 0;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 798)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 799) errout:
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 800) /* This can only happen when action is not inversed.
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 801) * So in case of an error, cleanup by doing inverse action.
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 802) */
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 803) test_delta_action_item(world, objagg, action_item, true);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 804) return err;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 805) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 806)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 807) static int test_delta(void)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 808) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 809) struct world world = {};
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 810) struct objagg *objagg;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 811) int i;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 812) int err;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 813)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 814) objagg = objagg_create(&delta_ops, NULL, &world);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 815) if (IS_ERR(objagg))
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 816) return PTR_ERR(objagg);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 817)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 818) for (i = 0; i < ARRAY_SIZE(action_items); i++) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 819) err = test_delta_action_item(&world, objagg,
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 820) &action_items[i], false);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 821) if (err)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 822) goto err_do_action_item;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 823) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 824)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 825) objagg_destroy(objagg);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 826) return 0;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 827)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 828) err_do_action_item:
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 829) for (i--; i >= 0; i--)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 830) test_delta_action_item(&world, objagg, &action_items[i], true);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 831)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 832) objagg_destroy(objagg);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 833) return err;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 834) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 835)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 836) struct hints_case {
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 837) const unsigned int *key_ids;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 838) size_t key_ids_count;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 839) struct expect_stats expect_stats;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 840) struct expect_stats expect_stats_hints;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 841) };
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 842)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 843) static const unsigned int hints_case_key_ids[] = {
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 844) 1, 7, 3, 5, 3, 1, 30, 8, 8, 5, 6, 8,
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 845) };
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 846)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 847) static const struct hints_case hints_case = {
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 848) .key_ids = hints_case_key_ids,
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 849) .key_ids_count = ARRAY_SIZE(hints_case_key_ids),
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 850) .expect_stats =
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 851) EXPECT_STATS(7, ROOT(1, 2, 7), ROOT(7, 1, 4), ROOT(30, 1, 1),
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 852) DELTA(8, 3), DELTA(3, 2),
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 853) DELTA(5, 2), DELTA(6, 1)),
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 854) .expect_stats_hints =
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 855) EXPECT_STATS(7, ROOT(3, 2, 9), ROOT(1, 2, 2), ROOT(30, 1, 1),
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 856) DELTA(8, 3), DELTA(5, 2),
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 857) DELTA(6, 1), DELTA(7, 1)),
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 858) };
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 859)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 860) static void __pr_debug_stats(const struct objagg_stats *stats)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 861) {
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 862) int i;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 863)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 864) for (i = 0; i < stats->stats_info_count; i++)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 865) pr_debug("Stat index %d key %u: u %d, d %d, %s\n", i,
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 866) obj_to_key_id(stats->stats_info[i].objagg_obj),
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 867) stats->stats_info[i].stats.user_count,
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 868) stats->stats_info[i].stats.delta_user_count,
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 869) stats->stats_info[i].is_root ? "root" : "noroot");
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 870) }
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 871)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 872) static void pr_debug_stats(struct objagg *objagg)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 873) {
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 874) const struct objagg_stats *stats;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 875)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 876) stats = objagg_stats_get(objagg);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 877) if (IS_ERR(stats))
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 878) return;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 879) __pr_debug_stats(stats);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 880) objagg_stats_put(stats);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 881) }
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 882)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 883) static void pr_debug_hints_stats(struct objagg_hints *objagg_hints)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 884) {
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 885) const struct objagg_stats *stats;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 886)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 887) stats = objagg_hints_stats_get(objagg_hints);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 888) if (IS_ERR(stats))
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 889) return;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 890) __pr_debug_stats(stats);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 891) objagg_stats_put(stats);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 892) }
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 893)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 894) static int check_expect_hints_stats(struct objagg_hints *objagg_hints,
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 895) const struct expect_stats *expect_stats,
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 896) const char **errmsg)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 897) {
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 898) const struct objagg_stats *stats;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 899) int err;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 900)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 901) stats = objagg_hints_stats_get(objagg_hints);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 902) if (IS_ERR(stats))
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 903) return PTR_ERR(stats);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 904) err = __check_expect_stats(stats, expect_stats, errmsg);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 905) objagg_stats_put(stats);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 906) return err;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 907) }
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 908)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 909) static int test_hints_case(const struct hints_case *hints_case)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 910) {
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 911) struct objagg_obj *objagg_obj;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 912) struct objagg_hints *hints;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 913) struct world world2 = {};
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 914) struct world world = {};
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 915) struct objagg *objagg2;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 916) struct objagg *objagg;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 917) const char *errmsg;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 918) int i;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 919) int err;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 920)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 921) objagg = objagg_create(&delta_ops, NULL, &world);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 922) if (IS_ERR(objagg))
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 923) return PTR_ERR(objagg);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 924)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 925) for (i = 0; i < hints_case->key_ids_count; i++) {
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 926) objagg_obj = world_obj_get(&world, objagg,
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 927) hints_case->key_ids[i]);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 928) if (IS_ERR(objagg_obj)) {
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 929) err = PTR_ERR(objagg_obj);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 930) goto err_world_obj_get;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 931) }
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 932) }
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 933)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 934) pr_debug_stats(objagg);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 935) err = check_expect_stats(objagg, &hints_case->expect_stats, &errmsg);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 936) if (err) {
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 937) pr_err("Stats: %s\n", errmsg);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 938) goto err_check_expect_stats;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 939) }
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 940)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 941) hints = objagg_hints_get(objagg, OBJAGG_OPT_ALGO_SIMPLE_GREEDY);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 942) if (IS_ERR(hints)) {
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 943) err = PTR_ERR(hints);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 944) goto err_hints_get;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 945) }
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 946)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 947) pr_debug_hints_stats(hints);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 948) err = check_expect_hints_stats(hints, &hints_case->expect_stats_hints,
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 949) &errmsg);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 950) if (err) {
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 951) pr_err("Hints stats: %s\n", errmsg);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 952) goto err_check_expect_hints_stats;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 953) }
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 954)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 955) objagg2 = objagg_create(&delta_ops, hints, &world2);
951d3d6fcd72f (Dan Carpenter 2019-02-13 11:58:20 +0300 956) if (IS_ERR(objagg2))
951d3d6fcd72f (Dan Carpenter 2019-02-13 11:58:20 +0300 957) return PTR_ERR(objagg2);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 958)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 959) for (i = 0; i < hints_case->key_ids_count; i++) {
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 960) objagg_obj = world_obj_get(&world2, objagg2,
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 961) hints_case->key_ids[i]);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 962) if (IS_ERR(objagg_obj)) {
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 963) err = PTR_ERR(objagg_obj);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 964) goto err_world2_obj_get;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 965) }
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 966) }
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 967)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 968) pr_debug_stats(objagg2);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 969) err = check_expect_stats(objagg2, &hints_case->expect_stats_hints,
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 970) &errmsg);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 971) if (err) {
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 972) pr_err("Stats2: %s\n", errmsg);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 973) goto err_check_expect_stats2;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 974) }
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 975)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 976) err = 0;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 977)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 978) err_check_expect_stats2:
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 979) err_world2_obj_get:
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 980) for (i--; i >= 0; i--)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 981) world_obj_put(&world2, objagg, hints_case->key_ids[i]);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 982) i = hints_case->key_ids_count;
a6379f0ad6375 (Aditya Pakki 2020-06-12 15:01:54 -0500 983) objagg_destroy(objagg2);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 984) err_check_expect_hints_stats:
a6379f0ad6375 (Aditya Pakki 2020-06-12 15:01:54 -0500 985) objagg_hints_put(hints);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 986) err_hints_get:
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 987) err_check_expect_stats:
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 988) err_world_obj_get:
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 989) for (i--; i >= 0; i--)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 990) world_obj_put(&world, objagg, hints_case->key_ids[i]);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 991)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 992) objagg_destroy(objagg);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 993) return err;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 994) }
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 995) static int test_hints(void)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 996) {
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 997) return test_hints_case(&hints_case);
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 998) }
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 999)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 1000) static int __init test_objagg_init(void)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 1001) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 1002) int err;
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 1003)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 1004) err = test_nodelta();
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 1005) if (err)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 1006) return err;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 1007) err = test_delta();
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 1008) if (err)
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 1009) return err;
9069a3817d82b (Jiri Pirko 2019-02-07 11:22:46 +0000 1010) return test_hints();
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 1011) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 1012)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 1013) static void __exit test_objagg_exit(void)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 1014) {
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 1015) }
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 1016)
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 1017) module_init(test_objagg_init);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 1018) module_exit(test_objagg_exit);
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 1019) MODULE_LICENSE("Dual BSD/GPL");
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 1020) MODULE_AUTHOR("Jiri Pirko <jiri@mellanox.com>");
0a020d416d0af (Jiri Pirko 2018-11-14 08:22:28 +0000 1021) MODULE_DESCRIPTION("Test module for objagg");