Lines Matching refs:map
201 static int tracing_map_add_field(struct tracing_map *map, in tracing_map_add_field() argument
206 if (map->n_fields < TRACING_MAP_FIELDS_MAX) { in tracing_map_add_field()
207 ret = map->n_fields; in tracing_map_add_field()
208 map->fields[map->n_fields++].cmp_fn = cmp_fn; in tracing_map_add_field()
226 int tracing_map_add_sum_field(struct tracing_map *map) in tracing_map_add_sum_field() argument
228 return tracing_map_add_field(map, tracing_map_cmp_atomic64); in tracing_map_add_sum_field()
243 int tracing_map_add_var(struct tracing_map *map) in tracing_map_add_var() argument
247 if (map->n_vars < TRACING_MAP_VARS_MAX) in tracing_map_add_var()
248 ret = map->n_vars++; in tracing_map_add_var()
269 int tracing_map_add_key_field(struct tracing_map *map, in tracing_map_add_key_field() argument
274 int idx = tracing_map_add_field(map, cmp_fn); in tracing_map_add_key_field()
279 map->fields[idx].offset = offset; in tracing_map_add_key_field()
281 map->key_idx[map->n_keys++] = idx; in tracing_map_add_key_field()
359 for (i = 0; i < elt->map->n_fields; i++) in tracing_map_elt_clear()
363 for (i = 0; i < elt->map->n_vars; i++) { in tracing_map_elt_clear()
368 if (elt->map->ops && elt->map->ops->elt_clear) in tracing_map_elt_clear()
369 elt->map->ops->elt_clear(elt); in tracing_map_elt_clear()
378 for (i = 0; i < elt->map->n_fields; i++) { in tracing_map_elt_init_fields()
379 elt->fields[i].cmp_fn = elt->map->fields[i].cmp_fn; in tracing_map_elt_init_fields()
382 elt->fields[i].offset = elt->map->fields[i].offset; in tracing_map_elt_init_fields()
391 if (elt->map->ops && elt->map->ops->elt_free) in tracing_map_elt_free()
392 elt->map->ops->elt_free(elt); in tracing_map_elt_free()
400 static struct tracing_map_elt *tracing_map_elt_alloc(struct tracing_map *map) in tracing_map_elt_alloc() argument
409 elt->map = map; in tracing_map_elt_alloc()
411 elt->key = kzalloc(map->key_size, GFP_KERNEL); in tracing_map_elt_alloc()
417 elt->fields = kcalloc(map->n_fields, sizeof(*elt->fields), GFP_KERNEL); in tracing_map_elt_alloc()
423 elt->vars = kcalloc(map->n_vars, sizeof(*elt->vars), GFP_KERNEL); in tracing_map_elt_alloc()
429 elt->var_set = kcalloc(map->n_vars, sizeof(*elt->var_set), GFP_KERNEL); in tracing_map_elt_alloc()
437 if (map->ops && map->ops->elt_alloc) { in tracing_map_elt_alloc()
438 err = map->ops->elt_alloc(elt); in tracing_map_elt_alloc()
449 static struct tracing_map_elt *get_free_elt(struct tracing_map *map) in get_free_elt() argument
454 idx = atomic_inc_return(&map->next_elt); in get_free_elt()
455 if (idx < map->max_elts) { in get_free_elt()
456 elt = *(TRACING_MAP_ELT(map->elts, idx)); in get_free_elt()
457 if (map->ops && map->ops->elt_init) in get_free_elt()
458 map->ops->elt_init(elt); in get_free_elt()
464 static void tracing_map_free_elts(struct tracing_map *map) in tracing_map_free_elts() argument
468 if (!map->elts) in tracing_map_free_elts()
471 for (i = 0; i < map->max_elts; i++) { in tracing_map_free_elts()
472 tracing_map_elt_free(*(TRACING_MAP_ELT(map->elts, i))); in tracing_map_free_elts()
473 *(TRACING_MAP_ELT(map->elts, i)) = NULL; in tracing_map_free_elts()
476 tracing_map_array_free(map->elts); in tracing_map_free_elts()
477 map->elts = NULL; in tracing_map_free_elts()
480 static int tracing_map_alloc_elts(struct tracing_map *map) in tracing_map_alloc_elts() argument
484 map->elts = tracing_map_array_alloc(map->max_elts, in tracing_map_alloc_elts()
486 if (!map->elts) in tracing_map_alloc_elts()
489 for (i = 0; i < map->max_elts; i++) { in tracing_map_alloc_elts()
490 *(TRACING_MAP_ELT(map->elts, i)) = tracing_map_elt_alloc(map); in tracing_map_alloc_elts()
491 if (IS_ERR(*(TRACING_MAP_ELT(map->elts, i)))) { in tracing_map_alloc_elts()
492 *(TRACING_MAP_ELT(map->elts, i)) = NULL; in tracing_map_alloc_elts()
493 tracing_map_free_elts(map); in tracing_map_alloc_elts()
513 __tracing_map_insert(struct tracing_map *map, void *key, bool lookup_only) in __tracing_map_insert() argument
520 key_hash = jhash(key, map->key_size, 0); in __tracing_map_insert()
523 idx = key_hash >> (32 - (map->map_bits + 1)); in __tracing_map_insert()
526 idx &= (map->map_size - 1); in __tracing_map_insert()
527 entry = TRACING_MAP_ENTRY(map->map, idx); in __tracing_map_insert()
533 keys_match(key, val->key, map->key_size)) { in __tracing_map_insert()
535 atomic64_inc(&map->hits); in __tracing_map_insert()
551 if (dup_try > map->map_size) { in __tracing_map_insert()
552 atomic64_inc(&map->drops); in __tracing_map_insert()
566 elt = get_free_elt(map); in __tracing_map_insert()
568 atomic64_inc(&map->drops); in __tracing_map_insert()
573 memcpy(elt->key, key, map->key_size); in __tracing_map_insert()
575 atomic64_inc(&map->hits); in __tracing_map_insert()
631 struct tracing_map_elt *tracing_map_insert(struct tracing_map *map, void *key) in tracing_map_insert() argument
633 return __tracing_map_insert(map, key, false); in tracing_map_insert()
653 struct tracing_map_elt *tracing_map_lookup(struct tracing_map *map, void *key) in tracing_map_lookup() argument
655 return __tracing_map_insert(map, key, true); in tracing_map_lookup()
668 void tracing_map_destroy(struct tracing_map *map) in tracing_map_destroy() argument
670 if (!map) in tracing_map_destroy()
673 tracing_map_free_elts(map); in tracing_map_destroy()
675 tracing_map_array_free(map->map); in tracing_map_destroy()
676 kfree(map); in tracing_map_destroy()
690 void tracing_map_clear(struct tracing_map *map) in tracing_map_clear() argument
694 atomic_set(&map->next_elt, -1); in tracing_map_clear()
695 atomic64_set(&map->hits, 0); in tracing_map_clear()
696 atomic64_set(&map->drops, 0); in tracing_map_clear()
698 tracing_map_array_clear(map->map); in tracing_map_clear()
700 for (i = 0; i < map->max_elts; i++) in tracing_map_clear()
701 tracing_map_elt_clear(*(TRACING_MAP_ELT(map->elts, i))); in tracing_map_clear()
704 static void set_sort_key(struct tracing_map *map, in set_sort_key() argument
707 map->sort_key = *sort_key; in set_sort_key()
765 struct tracing_map *map; in tracing_map_create() local
772 map = kzalloc(sizeof(*map), GFP_KERNEL); in tracing_map_create()
773 if (!map) in tracing_map_create()
776 map->map_bits = map_bits; in tracing_map_create()
777 map->max_elts = (1 << map_bits); in tracing_map_create()
778 atomic_set(&map->next_elt, -1); in tracing_map_create()
780 map->map_size = (1 << (map_bits + 1)); in tracing_map_create()
781 map->ops = ops; in tracing_map_create()
783 map->private_data = private_data; in tracing_map_create()
785 map->map = tracing_map_array_alloc(map->map_size, in tracing_map_create()
787 if (!map->map) in tracing_map_create()
790 map->key_size = key_size; in tracing_map_create()
792 map->key_idx[i] = -1; in tracing_map_create()
794 return map; in tracing_map_create()
796 tracing_map_destroy(map); in tracing_map_create()
797 map = ERR_PTR(-ENOMEM); in tracing_map_create()
821 int tracing_map_init(struct tracing_map *map) in tracing_map_init() argument
825 if (map->n_fields < 2) in tracing_map_init()
828 err = tracing_map_alloc_elts(map); in tracing_map_init()
832 tracing_map_clear(map); in tracing_map_init()
842 if (memcmp((*a)->key, (*b)->key, (*a)->elt->map->key_size)) in cmp_entries_dup()
861 sort_key = &elt_a->map->sort_key; in cmp_entries_sum()
889 sort_key = &elt_a->map->sort_key; in cmp_entries_key()
976 static bool is_key(struct tracing_map *map, unsigned int field_idx) in is_key() argument
980 for (i = 0; i < map->n_keys; i++) in is_key()
981 if (map->key_idx[i] == field_idx) in is_key()
986 static void sort_secondary(struct tracing_map *map, in sort_secondary() argument
998 if (is_key(map, primary_key->field_idx)) in sort_secondary()
1003 if (is_key(map, secondary_key->field_idx)) in sort_secondary()
1024 set_sort_key(map, secondary_key); in sort_secondary()
1028 set_sort_key(map, primary_key); in sort_secondary()
1059 int tracing_map_sort_entries(struct tracing_map *map, in tracing_map_sort_entries() argument
1069 entries = vmalloc(array_size(sizeof(sort_entry), map->max_elts)); in tracing_map_sort_entries()
1073 for (i = 0, n_entries = 0; i < map->map_size; i++) { in tracing_map_sort_entries()
1076 entry = TRACING_MAP_ENTRY(map->map, i); in tracing_map_sort_entries()
1099 detect_dups(entries, n_entries, map->key_size); in tracing_map_sort_entries()
1101 if (is_key(map, sort_keys[0].field_idx)) in tracing_map_sort_entries()
1106 set_sort_key(map, &sort_keys[0]); in tracing_map_sort_entries()
1112 sort_secondary(map, in tracing_map_sort_entries()