Lines Matching refs:ht
82 struct tc_u_knode __rcu *ht[]; member
111 struct tc_u_hnode *ht = rcu_dereference_bh(tp->root); in u32_classify() local
123 n = rcu_dereference_bh(ht->ht[sel]); in u32_classify()
168 ht = rcu_dereference_bh(n->ht_down); in u32_classify()
169 if (!ht) { in u32_classify()
200 ht = rcu_dereference_bh(n->ht_down); in u32_classify()
202 if (ht->divisor) { in u32_classify()
209 sel = ht->divisor & u32_hash_fold(*data, &n->sel, in u32_classify()
242 ht = rcu_dereference_bh(n->ht_up); in u32_classify()
256 struct tc_u_hnode *ht; in u32_lookup_ht() local
258 for (ht = rtnl_dereference(tp_c->hlist); in u32_lookup_ht()
259 ht; in u32_lookup_ht()
260 ht = rtnl_dereference(ht->next)) in u32_lookup_ht()
261 if (ht->handle == handle) in u32_lookup_ht()
264 return ht; in u32_lookup_ht()
267 static struct tc_u_knode *u32_lookup_key(struct tc_u_hnode *ht, u32 handle) in u32_lookup_key() argument
273 if (sel > ht->divisor) in u32_lookup_key()
276 for (n = rtnl_dereference(ht->ht[sel]); in u32_lookup_key()
288 struct tc_u_hnode *ht; in u32_get() local
292 ht = rtnl_dereference(tp->root); in u32_get()
294 ht = u32_lookup_ht(tp_c, TC_U32_HTID(handle)); in u32_get()
296 if (!ht) in u32_get()
300 return ht; in u32_get()
302 return u32_lookup_key(ht, handle); in u32_get()
356 root_ht = kzalloc(struct_size(root_ht, ht, 1), GFP_KERNEL); in u32_init()
367 tp_c = kzalloc(struct_size(tp_c, hlist->ht, 1), GFP_KERNEL); in u32_init()
391 struct tc_u_hnode *ht = rtnl_dereference(n->ht_down); in u32_destroy_key() local
395 if (ht && --ht->refcnt == 0) in u32_destroy_key()
396 kfree(ht); in u32_destroy_key()
449 struct tc_u_hnode *ht = rtnl_dereference(key->ht_up); in u32_delete_key() local
451 if (ht) { in u32_delete_key()
452 kp = &ht->ht[TC_U32_HASH(key->handle)]; in u32_delete_key()
460 idr_remove(&ht->handle_idr, key->handle); in u32_delete_key()
532 struct tc_u_hnode *ht = rtnl_dereference(n->ht_down); in u32_replace_hw_knode() local
553 cls_u32.knode.link_handle = ht->handle; in u32_replace_hw_knode()
568 static void u32_clear_hnode(struct tcf_proto *tp, struct tc_u_hnode *ht, in u32_clear_hnode() argument
575 for (h = 0; h <= ht->divisor; h++) { in u32_clear_hnode()
576 while ((n = rtnl_dereference(ht->ht[h])) != NULL) { in u32_clear_hnode()
577 RCU_INIT_POINTER(ht->ht[h], in u32_clear_hnode()
582 idr_remove(&ht->handle_idr, n->handle); in u32_clear_hnode()
591 static int u32_destroy_hnode(struct tcf_proto *tp, struct tc_u_hnode *ht, in u32_destroy_hnode() argument
598 WARN_ON(--ht->refcnt); in u32_destroy_hnode()
600 u32_clear_hnode(tp, ht, extack); in u32_destroy_hnode()
606 if (phn == ht) { in u32_destroy_hnode()
607 u32_clear_hw_hnode(tp, ht, extack); in u32_destroy_hnode()
608 idr_destroy(&ht->handle_idr); in u32_destroy_hnode()
609 idr_remove(&tp_c->handle_idr, ht->handle); in u32_destroy_hnode()
610 RCU_INIT_POINTER(*hn, ht->next); in u32_destroy_hnode()
611 kfree_rcu(ht, rcu); in u32_destroy_hnode()
631 struct tc_u_hnode *ht; in u32_destroy() local
635 while ((ht = rtnl_dereference(tp_c->hlist)) != NULL) { in u32_destroy()
636 u32_clear_hnode(tp, ht, extack); in u32_destroy()
637 RCU_INIT_POINTER(tp_c->hlist, ht->next); in u32_destroy()
642 if (--ht->refcnt == 0) in u32_destroy()
643 kfree_rcu(ht, rcu); in u32_destroy()
656 struct tc_u_hnode *ht = arg; in u32_delete() local
660 if (TC_U32_KEY(ht->handle)) { in u32_delete()
661 u32_remove_hw_knode(tp, (struct tc_u_knode *)ht, extack); in u32_delete()
662 ret = u32_delete_key(tp, (struct tc_u_knode *)ht); in u32_delete()
666 if (ht->is_root) { in u32_delete()
671 if (ht->refcnt == 1) { in u32_delete()
672 u32_destroy_hnode(tp, ht, extack); in u32_delete()
683 static u32 gen_new_kid(struct tc_u_hnode *ht, u32 htid) in gen_new_kid() argument
688 if (idr_alloc_u32(&ht->handle_idr, NULL, &index, max, GFP_KERNEL)) { in gen_new_kid()
690 if (idr_alloc_u32(&ht->handle_idr, NULL, &index, max, in gen_new_kid()
770 struct tc_u_hnode *ht; in u32_replace_knode() local
773 ht = rtnl_dereference(tp->root); in u32_replace_knode()
775 ht = u32_lookup_ht(tp_c, TC_U32_HTID(n->handle)); in u32_replace_knode()
777 ins = &ht->ht[TC_U32_HASH(n->handle)]; in u32_replace_knode()
787 idr_replace(&ht->handle_idr, n, n->handle); in u32_replace_knode()
795 struct tc_u_hnode *ht = rtnl_dereference(n->ht_down); in u32_init_knode() local
811 RCU_INIT_POINTER(new->ht_down, ht); in u32_init_knode()
814 if (ht) in u32_init_knode()
815 ht->refcnt++; in u32_init_knode()
847 struct tc_u_hnode *ht; in u32_change() local
936 ht = kzalloc(struct_size(ht, ht, divisor + 1), GFP_KERNEL); in u32_change()
937 if (ht == NULL) in u32_change()
940 handle = gen_new_htid(tp->data, ht); in u32_change()
942 kfree(ht); in u32_change()
946 err = idr_alloc_u32(&tp_c->handle_idr, ht, &handle, in u32_change()
949 kfree(ht); in u32_change()
953 ht->refcnt = 1; in u32_change()
954 ht->divisor = divisor; in u32_change()
955 ht->handle = handle; in u32_change()
956 ht->prio = tp->prio; in u32_change()
957 idr_init(&ht->handle_idr); in u32_change()
958 ht->flags = userflags; in u32_change()
960 err = u32_replace_hw_hnode(tp, ht, userflags, extack); in u32_change()
963 kfree(ht); in u32_change()
967 RCU_INIT_POINTER(ht->next, tp_c->hlist); in u32_change()
968 rcu_assign_pointer(tp_c->hlist, ht); in u32_change()
969 *arg = ht; in u32_change()
977 ht = rtnl_dereference(tp->root); in u32_change()
978 htid = ht->handle; in u32_change()
980 ht = u32_lookup_ht(tp->data, TC_U32_HTID(htid)); in u32_change()
981 if (!ht) { in u32_change()
987 ht = rtnl_dereference(tp->root); in u32_change()
988 htid = ht->handle; in u32_change()
991 if (ht->divisor < TC_U32_HASH(htid)) { in u32_change()
1002 err = idr_alloc_u32(&ht->handle_idr, NULL, &handle, handle, in u32_change()
1007 handle = gen_new_kid(ht, htid); in u32_change()
1038 RCU_INIT_POINTER(n->ht_up, ht); in u32_change()
1076 ins = &ht->ht[TC_U32_HASH(handle)]; in u32_change()
1102 idr_remove(&ht->handle_idr, handle); in u32_change()
1110 struct tc_u_hnode *ht; in u32_walk() local
1117 for (ht = rtnl_dereference(tp_c->hlist); in u32_walk()
1118 ht; in u32_walk()
1119 ht = rtnl_dereference(ht->next)) { in u32_walk()
1120 if (ht->prio != tp->prio) in u32_walk()
1123 if (arg->fn(tp, ht, arg) < 0) { in u32_walk()
1129 for (h = 0; h <= ht->divisor; h++) { in u32_walk()
1130 for (n = rtnl_dereference(ht->ht[h]); in u32_walk()
1147 static int u32_reoffload_hnode(struct tcf_proto *tp, struct tc_u_hnode *ht, in u32_reoffload_hnode() argument
1154 tc_cls_common_offload_init(&cls_u32.common, tp, ht->flags, extack); in u32_reoffload_hnode()
1156 cls_u32.hnode.divisor = ht->divisor; in u32_reoffload_hnode()
1157 cls_u32.hnode.handle = ht->handle; in u32_reoffload_hnode()
1158 cls_u32.hnode.prio = ht->prio; in u32_reoffload_hnode()
1161 if (err && add && tc_skip_sw(ht->flags)) in u32_reoffload_hnode()
1171 struct tc_u_hnode *ht = rtnl_dereference(n->ht_down); in u32_reoffload_knode() local
1193 cls_u32.knode.link_handle = ht->handle; in u32_reoffload_knode()
1205 struct tc_u_hnode *ht; in u32_reoffload() local
1210 for (ht = rtnl_dereference(tp_c->hlist); in u32_reoffload()
1211 ht; in u32_reoffload()
1212 ht = rtnl_dereference(ht->next)) { in u32_reoffload()
1213 if (ht->prio != tp->prio) in u32_reoffload()
1220 if (add && !tc_skip_hw(ht->flags)) { in u32_reoffload()
1221 err = u32_reoffload_hnode(tp, ht, add, cb, cb_priv, in u32_reoffload()
1227 for (h = 0; h <= ht->divisor; h++) { in u32_reoffload()
1228 for (n = rtnl_dereference(ht->ht[h]); in u32_reoffload()
1241 if (!add && !tc_skip_hw(ht->flags)) in u32_reoffload()
1242 u32_reoffload_hnode(tp, ht, add, cb, cb_priv, extack); in u32_reoffload()
1278 struct tc_u_hnode *ht = fh; in u32_dump() local
1279 u32 divisor = ht->divisor + 1; in u32_dump()