Lines Matching refs:meter

46 static void ovs_meter_free(struct dp_meter *meter)  in ovs_meter_free()  argument
48 if (!meter) in ovs_meter_free()
51 kfree_rcu(meter, rcu); in ovs_meter_free()
60 struct dp_meter *meter; in lookup_meter() local
62 meter = rcu_dereference_ovsl(ti->dp_meters[hash]); in lookup_meter()
63 if (meter && likely(meter->id == meter_id)) in lookup_meter()
64 return meter; in lookup_meter()
120 struct dp_meter *meter) in dp_meter_instance_insert() argument
124 hash = meter_hash(ti, meter->id); in dp_meter_instance_insert()
125 rcu_assign_pointer(ti->dp_meters[hash], meter); in dp_meter_instance_insert()
129 struct dp_meter *meter) in dp_meter_instance_remove() argument
133 hash = meter_hash(ti, meter->id); in dp_meter_instance_remove()
137 static int attach_meter(struct dp_meter_table *tbl, struct dp_meter *meter) in attach_meter() argument
140 u32 hash = meter_hash(ti, meter->id); in attach_meter()
149 dp_meter_instance_insert(ti, meter); in attach_meter()
167 dp_meter_instance_remove(ti, meter); in attach_meter()
172 static int detach_meter(struct dp_meter_table *tbl, struct dp_meter *meter) in detach_meter() argument
177 if (!meter) in detach_meter()
181 dp_meter_instance_remove(ti, meter); in detach_meter()
207 dp_meter_instance_insert(ti, meter); in detach_meter()
236 struct dp_meter *meter) in ovs_meter_cmd_reply_stats() argument
246 sizeof(struct ovs_flow_stats), &meter->stats)) in ovs_meter_cmd_reply_stats()
249 if (nla_put_u64_64bit(reply, OVS_METER_ATTR_USED, meter->used, in ovs_meter_cmd_reply_stats()
257 band = meter->bands; in ovs_meter_cmd_reply_stats()
259 for (i = 0; i < meter->n_bands; ++i, ++band) { in ovs_meter_cmd_reply_stats()
334 struct dp_meter *meter; in dp_meter_create() local
347 meter = kzalloc(struct_size(meter, bands, n_bands), GFP_KERNEL); in dp_meter_create()
348 if (!meter) in dp_meter_create()
351 meter->id = nla_get_u32(a[OVS_METER_ATTR_ID]); in dp_meter_create()
352 meter->used = div_u64(ktime_get_ns(), 1000 * 1000); in dp_meter_create()
353 meter->kbps = a[OVS_METER_ATTR_KBPS] ? 1 : 0; in dp_meter_create()
354 meter->keep_stats = !a[OVS_METER_ATTR_CLEAR]; in dp_meter_create()
355 spin_lock_init(&meter->lock); in dp_meter_create()
356 if (meter->keep_stats && a[OVS_METER_ATTR_STATS]) { in dp_meter_create()
357 meter->stats = *(struct ovs_flow_stats *) in dp_meter_create()
360 meter->n_bands = n_bands; in dp_meter_create()
363 band = meter->bands; in dp_meter_create()
397 if (band_max_delta_t > meter->max_delta_t) in dp_meter_create()
398 meter->max_delta_t = band_max_delta_t; in dp_meter_create()
402 return meter; in dp_meter_create()
405 kfree(meter); in dp_meter_create()
412 struct dp_meter *meter, *old_meter; in ovs_meter_cmd_set() local
425 meter = dp_meter_create(a); in ovs_meter_cmd_set()
426 if (IS_ERR_OR_NULL(meter)) in ovs_meter_cmd_set()
427 return PTR_ERR(meter); in ovs_meter_cmd_set()
451 err = attach_meter(meter_tbl, meter); in ovs_meter_cmd_set()
480 kfree(meter); in ovs_meter_cmd_set()
489 struct dp_meter *meter; in ovs_meter_cmd_get() local
514 meter = lookup_meter(&dp->meter_tbl, meter_id); in ovs_meter_cmd_get()
515 if (!meter) { in ovs_meter_cmd_get()
520 spin_lock_bh(&meter->lock); in ovs_meter_cmd_get()
521 err = ovs_meter_cmd_reply_stats(reply, meter_id, meter); in ovs_meter_cmd_get()
522 spin_unlock_bh(&meter->lock); in ovs_meter_cmd_get()
599 struct dp_meter *meter; in ovs_meter_execute() local
605 meter = lookup_meter(&dp->meter_tbl, meter_id); in ovs_meter_execute()
607 if (!meter) in ovs_meter_execute()
611 spin_lock(&meter->lock); in ovs_meter_execute()
613 long_delta_ms = (now_ms - meter->used); /* ms */ in ovs_meter_execute()
626 delta_ms = (long_delta_ms > (long long int)meter->max_delta_t) in ovs_meter_execute()
627 ? meter->max_delta_t : (u32)long_delta_ms; in ovs_meter_execute()
631 meter->used = now_ms; in ovs_meter_execute()
632 meter->stats.n_packets += 1; in ovs_meter_execute()
633 meter->stats.n_bytes += skb->len; in ovs_meter_execute()
645 cost = (meter->kbps) ? skb->len * 8 : 1000; in ovs_meter_execute()
648 for (i = 0; i < meter->n_bands; ++i) { in ovs_meter_execute()
651 band = &meter->bands[i]; in ovs_meter_execute()
668 band = &meter->bands[band_exceeded_max]; in ovs_meter_execute()
674 spin_unlock(&meter->lock); in ovs_meter_execute()
679 spin_unlock(&meter->lock); in ovs_meter_execute()