diff mbox series

[ovs-dev,v6,1/2] lib: limit table_id space for meters

Message ID 1ee9f4c914938d4c9c0586edfdcdd9af7aa73609.1645809202.git.lorenzo.bianconi@redhat.com
State Superseded
Headers show
Series reconfigure ovs meters for ovn meters updates | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed
ovsrobot/github-robot-_ovn-kubernetes fail github build: failed

Commit Message

Lorenzo Bianconi Feb. 25, 2022, 5:15 p.m. UTC
This is a preliminary patch to move metering management in IP engine.

Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
---
 controller/ovn-controller.c |  5 +++--
 lib/extend-table.c          | 22 +++++++++++++++-------
 lib/extend-table.h          |  4 +++-
 tests/ovn-controller.at     |  6 +++---
 tests/ovn.at                | 10 +++++-----
 tests/test-ovn.c            |  5 +++--
 6 files changed, 32 insertions(+), 20 deletions(-)
diff mbox series

Patch

diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
index c09018243..e4b8b1bdd 100644
--- a/controller/ovn-controller.c
+++ b/controller/ovn-controller.c
@@ -2366,8 +2366,9 @@  en_lflow_output_init(struct engine_node *node OVS_UNUSED,
 {
     struct ed_type_lflow_output *data = xzalloc(sizeof *data);
     ovn_desired_flow_table_init(&data->flow_table);
-    ovn_extend_table_init(&data->group_table);
-    ovn_extend_table_init(&data->meter_table);
+    ovn_extend_table_init(&data->group_table, 0, MAX_EXT_TABLE_ID);
+    ovn_extend_table_init(&data->meter_table, MAX_EXT_TABLE_ID / 2,
+                          MAX_EXT_TABLE_ID / 2);
     lflow_resource_init(&data->lflow_resource_ref);
     lflow_conj_ids_init(&data->conj_ids);
     hmap_init(&data->lflows_processed);
diff --git a/lib/extend-table.c b/lib/extend-table.c
index c708e24b9..b4fd1aa11 100644
--- a/lib/extend-table.c
+++ b/lib/extend-table.c
@@ -30,9 +30,12 @@  ovn_extend_table_delete_desired(struct ovn_extend_table *table,
                                 struct ovn_extend_table_lflow_to_desired *l);
 
 void
-ovn_extend_table_init(struct ovn_extend_table *table)
+ovn_extend_table_init(struct ovn_extend_table *table,
+                      size_t offset, size_t size)
 {
-    table->table_ids = bitmap_allocate(MAX_EXT_TABLE_ID);
+    table->table_ids = bitmap_allocate(size);
+    table->table_ids_offset = offset;
+    table->table_ids_size = size;
     bitmap_set1(table->table_ids, 0); /* table id 0 is invalid. */
     hmap_init(&table->desired);
     hmap_init(&table->lflow_to_desired);
@@ -187,7 +190,8 @@  ovn_extend_table_clear(struct ovn_extend_table *table, bool existing)
         /* Don't unset bitmap for desired group_info if the group_id
          * was not freshly reserved. */
         if (existing || g->new_table_id) {
-            bitmap_set0(table->table_ids, g->table_id);
+            bitmap_set0(table->table_ids,
+                        g->table_id - table->table_ids_offset);
         }
         ovn_extend_table_info_destroy(g);
     }
@@ -213,7 +217,8 @@  ovn_extend_table_remove_existing(struct ovn_extend_table *table,
     hmap_remove(&table->existing, &existing->hmap_node);
 
     /* Dealloc group_id. */
-    bitmap_set0(table->table_ids, existing->table_id);
+    bitmap_set0(table->table_ids,
+                existing->table_id - table->table_ids_offset);
     ovn_extend_table_info_destroy(existing);
 }
 
@@ -231,7 +236,8 @@  ovn_extend_table_delete_desired(struct ovn_extend_table *table,
                      e->name, UUID_ARGS(&l->lflow_uuid));
             hmap_remove(&table->desired, &e->hmap_node);
             if (e->new_table_id) {
-                bitmap_set0(table->table_ids, e->table_id);
+                bitmap_set0(table->table_ids,
+                            e->table_id - table->table_ids_offset);
             }
             ovn_extend_table_info_destroy(e);
         }
@@ -316,16 +322,18 @@  ovn_extend_table_assign_id(struct ovn_extend_table *table, const char *name,
     bool new_table_id = false;
     if (!table_id) {
         /* Reserve a new group_id. */
-        table_id = bitmap_scan(table->table_ids, 0, 1, MAX_EXT_TABLE_ID + 1);
+        table_id = bitmap_scan(table->table_ids, 0, 1,
+                               table->table_ids_size + 1);
         new_table_id = true;
     }
 
-    if (table_id == MAX_EXT_TABLE_ID + 1) {
+    if (table_id == table->table_ids_size + 1) {
         static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
         VLOG_ERR_RL(&rl, "%"PRIu32" out of table ids.", table_id);
         return EXT_TABLE_ID_INVALID;
     }
     bitmap_set1(table->table_ids, table_id);
+    table_id += table->table_ids_offset;
 
     table_info = ovn_extend_table_info_alloc(name, table_id, new_table_id,
                                              hash);
diff --git a/lib/extend-table.h b/lib/extend-table.h
index 4d80cfd80..a5599950a 100644
--- a/lib/extend-table.h
+++ b/lib/extend-table.h
@@ -30,6 +30,8 @@  struct ovn_extend_table {
     unsigned long *table_ids;  /* Used as a bitmap with value set
                                 * for allocated group ids in either
                                 * desired or existing. */
+    size_t table_ids_offset;   /* table first id offset */
+    size_t table_ids_size;     /* table ids size */
     struct hmap desired;
     struct hmap lflow_to_desired; /* Index for looking up desired table
                                    * items from given lflow uuid, with
@@ -72,7 +74,7 @@  struct ovn_extend_table_lflow_ref {
     struct ovn_extend_table_info *desired;
 };
 
-void ovn_extend_table_init(struct ovn_extend_table *);
+void ovn_extend_table_init(struct ovn_extend_table *, size_t, size_t);
 
 void ovn_extend_table_destroy(struct ovn_extend_table *);
 
diff --git a/tests/ovn-controller.at b/tests/ovn-controller.at
index 6e4c24f0f..f5e5448a4 100644
--- a/tests/ovn-controller.at
+++ b/tests/ovn-controller.at
@@ -725,7 +725,7 @@  check ovn-nbctl meter-add event-elb drop 100 pktps 10
 check ovn-nbctl --wait=hv copp-add copp0 event-elb event-elb
 check ovn-nbctl --wait=hv ls-copp-add copp0 ls1
 
-AT_CHECK([as hv1 ovs-ofctl dump-flows br-int | grep controller | grep userdata=00.00.00.0f | grep -q meter_id=1])
+AT_CHECK([as hv1 ovs-ofctl dump-flows br-int | grep controller | grep userdata=00.00.00.0f | grep -q meter_id=32768])
 
 check ovn-nbctl copp-del copp0
 AT_CHECK([ovn-nbctl copp-list copp0], [0], [dnl
@@ -738,13 +738,13 @@  check ovn-nbctl --wait=hv copp-add copp1 reject acl-meter
 check ovn-nbctl ls-copp-add copp1 ls1
 check ovn-nbctl --wait=hv acl-add ls1 from-lport 1002 'inport == "lsp1" && ip && udp' reject
 
-AT_CHECK([as hv1 ovs-ofctl dump-flows br-int | grep controller | grep userdata=00.00.00.16 | grep -q meter_id=1])
+AT_CHECK([as hv1 ovs-ofctl dump-flows br-int | grep controller | grep userdata=00.00.00.16 | grep -q meter_id=32768])
 
 # arp metering
 check ovn-nbctl meter-add arp-meter drop 200 pktps 0
 check ovn-nbctl --wait=hv copp-add copp2 arp-resolve arp-meter
 check ovn-nbctl --wait=hv lr-copp-add copp2 lr1
-AT_CHECK([as hv1 ovs-ofctl dump-flows br-int | grep controller | grep userdata=00.00.00.00 | grep -q meter_id=2])
+AT_CHECK([as hv1 ovs-ofctl dump-flows br-int | grep controller | grep userdata=00.00.00.00 | grep -q meter_id=32769])
 
 OVN_CLEANUP([hv1])
 AT_CLEANUP
diff --git a/tests/ovn.at b/tests/ovn.at
index fa0e0a4a2..7adf6003d 100644
--- a/tests/ovn.at
+++ b/tests/ovn.at
@@ -1584,13 +1584,13 @@  reg1[0] = dns_lookup("foo");
 set_meter(0);
     Rate 0 for set_meter is not in valid.
 set_meter(1);
-    encodes as meter:1
+    encodes as meter:32768
 set_meter(100, 1000);
-    encodes as meter:2
+    encodes as meter:32769
 set_meter(100, 1000, );
     Syntax error at `,' expecting `)'.
 set_meter(4294967295, 4294967295);
-    encodes as meter:3
+    encodes as meter:32770
 
 # log
 log(verdict=allow, severity=warning);
@@ -9159,8 +9159,8 @@  AT_SKIP_IF([test $d_secs -gt 9])
 
 # Print some information that may help debugging.
 AT_CHECK([as hv ovs-appctl -t ovn-controller meter-table-list], [0], [dnl
-http-rl1: 1
-http-rl2: 2
+http-rl1: 32768
+http-rl2: 32769
 ])
 as hv ovs-ofctl -O OpenFlow13 meter-stats br-int
 
diff --git a/tests/test-ovn.c b/tests/test-ovn.c
index d79c6a5bc..f747b4eb9 100644
--- a/tests/test-ovn.c
+++ b/tests/test-ovn.c
@@ -1290,11 +1290,12 @@  test_parse_actions(struct ovs_cmdl_context *ctx OVS_UNUSED)
 
     /* Initialize group ids. */
     struct ovn_extend_table group_table;
-    ovn_extend_table_init(&group_table);
+    ovn_extend_table_init(&group_table, 0, MAX_EXT_TABLE_ID);
 
     /* Initialize meter ids for QoS. */
     struct ovn_extend_table meter_table;
-    ovn_extend_table_init(&meter_table);
+    ovn_extend_table_init(&meter_table, MAX_EXT_TABLE_ID / 2,
+                          MAX_EXT_TABLE_ID / 2);
 
     simap_init(&ports);
     simap_put(&ports, "eth0", 5);