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