VisionFive2 Linux kernel

StarFive Tech Linux Kernel for VisionFive (JH7110) boards (mirror)

More than 9999 Commits   32 Branches   54 Tags
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");