Lines Matching refs:meter
20 #include "meter.h"
45 static void ovs_meter_free(struct dp_meter *meter)
47 if (!meter)
50 kfree_rcu(meter, rcu);
59 struct dp_meter *meter;
61 meter = rcu_dereference_ovsl(ti->dp_meters[hash]);
62 if (meter && likely(meter->id == meter_id))
63 return meter;
117 struct dp_meter *meter)
121 hash = meter_hash(ti, meter->id);
122 rcu_assign_pointer(ti->dp_meters[hash], meter);
126 struct dp_meter *meter)
130 hash = meter_hash(ti, meter->id);
134 static int attach_meter(struct dp_meter_table *tbl, struct dp_meter *meter)
137 u32 hash = meter_hash(ti, meter->id);
146 dp_meter_instance_insert(ti, meter);
164 dp_meter_instance_remove(ti, meter);
169 static int detach_meter(struct dp_meter_table *tbl, struct dp_meter *meter)
174 if (!meter)
178 dp_meter_instance_remove(ti, meter);
182 /* Shrink the meter array if necessary. */
204 dp_meter_instance_insert(ti, meter);
233 struct dp_meter *meter)
243 sizeof(struct ovs_flow_stats), &meter->stats))
246 if (nla_put_u64_64bit(reply, OVS_METER_ATTR_USED, meter->used,
254 band = meter->bands;
256 for (i = 0; i < meter->n_bands; ++i, ++band) {
331 struct dp_meter *meter;
343 /* Allocate and set up the meter before locking anything. */
344 meter = kzalloc(struct_size(meter, bands, n_bands), GFP_KERNEL_ACCOUNT);
345 if (!meter)
348 meter->id = nla_get_u32(a[OVS_METER_ATTR_ID]);
349 meter->used = div_u64(ktime_get_ns(), 1000 * 1000);
350 meter->kbps = a[OVS_METER_ATTR_KBPS] ? 1 : 0;
351 meter->keep_stats = !a[OVS_METER_ATTR_CLEAR];
352 spin_lock_init(&meter->lock);
353 if (meter->keep_stats && a[OVS_METER_ATTR_STATS]) {
354 meter->stats = *(struct ovs_flow_stats *)
357 meter->n_bands = n_bands;
359 /* Set up meter bands. */
360 band = meter->bands;
394 if (band_max_delta_t > meter->max_delta_t)
395 meter->max_delta_t = band_max_delta_t;
399 return meter;
402 kfree(meter);
409 struct dp_meter *meter, *old_meter;
422 meter = dp_meter_create(a);
423 if (IS_ERR(meter))
424 return PTR_ERR(meter);
448 err = attach_meter(meter_tbl, meter);
455 * the old meter, if any.
479 kfree(meter);
488 struct dp_meter *meter;
512 /* Locate meter, copy stats. */
513 meter = lookup_meter(&dp->meter_tbl, meter_id);
514 if (!meter) {
519 spin_lock_bh(&meter->lock);
520 err = ovs_meter_cmd_reply_stats(reply, meter_id, meter);
521 spin_unlock_bh(&meter->lock);
598 struct dp_meter *meter;
604 meter = lookup_meter(&dp->meter_tbl, meter_id);
605 /* Do not drop the packet when there is no meter. */
606 if (!meter)
609 /* Lock the meter while using it. */
610 spin_lock(&meter->lock);
612 long_delta_ms = (now_ms - meter->used); /* ms */
615 * for a meter lock, and the one who received the packets a
625 delta_ms = (long_delta_ms > (long long int)meter->max_delta_t)
626 ? meter->max_delta_t : (u32)long_delta_ms;
628 /* Update meter statistics.
630 meter->used = now_ms;
631 meter->stats.n_packets += 1;
632 meter->stats.n_bytes += skb->len;
644 cost = (meter->kbps) ? skb->len * 8 : 1000;
647 for (i = 0; i < meter->n_bands; ++i) {
650 band = &meter->bands[i];
667 band = &meter->bands[band_exceeded_max];
673 spin_unlock(&meter->lock);
678 spin_unlock(&meter->lock);