Lines Matching refs:ti
40 static u32 meter_hash(struct dp_meter_instance *ti, u32 id)
42 return id % ti->n_meters;
57 struct dp_meter_instance *ti = rcu_dereference_ovsl(tbl->ti);
58 u32 hash = meter_hash(ti, meter_id);
61 meter = rcu_dereference_ovsl(ti->dp_meters[hash]);
70 struct dp_meter_instance *ti;
72 ti = kvzalloc(struct_size(ti, dp_meters, size), GFP_KERNEL);
73 if (!ti)
76 ti->n_meters = size;
78 return ti;
81 static void dp_meter_instance_free(struct dp_meter_instance *ti)
83 kvfree(ti);
88 struct dp_meter_instance *ti;
90 ti = container_of(rcu, struct dp_meter_instance, rcu);
91 kvfree(ti);
97 struct dp_meter_instance *ti = rcu_dereference_ovsl(tbl->ti);
98 int n_meters = min(size, ti->n_meters);
107 if (rcu_dereference_ovsl(ti->dp_meters[i]))
108 new_ti->dp_meters[i] = ti->dp_meters[i];
110 rcu_assign_pointer(tbl->ti, new_ti);
111 call_rcu(&ti->rcu, dp_meter_instance_free_rcu);
116 static void dp_meter_instance_insert(struct dp_meter_instance *ti,
121 hash = meter_hash(ti, meter->id);
122 rcu_assign_pointer(ti->dp_meters[hash], meter);
125 static void dp_meter_instance_remove(struct dp_meter_instance *ti,
130 hash = meter_hash(ti, meter->id);
131 RCU_INIT_POINTER(ti->dp_meters[hash], NULL);
136 struct dp_meter_instance *ti = rcu_dereference_ovsl(tbl->ti);
137 u32 hash = meter_hash(ti, meter->id);
143 if (unlikely(rcu_dereference_ovsl(ti->dp_meters[hash])))
146 dp_meter_instance_insert(ti, meter);
155 if (tbl->count >= ti->n_meters &&
156 dp_meter_instance_realloc(tbl, ti->n_meters * 2)) {
164 dp_meter_instance_remove(ti, meter);
171 struct dp_meter_instance *ti;
177 ti = rcu_dereference_ovsl(tbl->ti);
178 dp_meter_instance_remove(ti, meter);
183 if (ti->n_meters > DP_METER_ARRAY_SIZE_MIN &&
184 tbl->count <= (ti->n_meters / 4)) {
185 int half_size = ti->n_meters / 2;
192 for (i = half_size; i < ti->n_meters; i++)
193 if (rcu_dereference_ovsl(ti->dp_meters[i]))
204 dp_meter_instance_insert(ti, meter);
732 struct dp_meter_instance *ti;
735 ti = dp_meter_instance_alloc(DP_METER_ARRAY_SIZE_MIN);
736 if (!ti)
746 rcu_assign_pointer(tbl->ti, ti);
752 dp_meter_instance_free(ti);
759 struct dp_meter_instance *ti = rcu_dereference_raw(tbl->ti);
762 for (i = 0; i < ti->n_meters; i++)
763 ovs_meter_free(rcu_dereference_raw(ti->dp_meters[i]));
765 dp_meter_instance_free(ti);