dev: keep dev_instance data in struct 42/41742/2
authorDamjan Marion <[email protected]>
Wed, 23 Oct 2024 18:56:27 +0000 (20:56 +0200)
committerDamjan Marion <[email protected]>
Wed, 23 Oct 2024 19:03:30 +0000 (21:03 +0200)
Type: refactor
Change-Id: I05d04e2e9872d025384524b1bc133d909581e18a
Signed-off-by: Damjan Marion <[email protected]>
src/vnet/dev/api.c
src/vnet/dev/dev.h
src/vnet/dev/dev_funcs.h
src/vnet/dev/port.c

index 114b63d..0f4bd0b 100644 (file)
@@ -263,7 +263,7 @@ vnet_dev_api_remove_port_if (vlib_main_t *vm,
   if (!hi)
     return VNET_DEV_ERR_UNKNOWN_INTERFACE;
 
-  if (pool_is_free_index (dm->ports_by_dev_instance, hi->dev_instance))
+  if (pool_is_free_index (dm->dev_instances, hi->dev_instance))
     return VNET_DEV_ERR_UNKNOWN_INTERFACE;
 
   port = vnet_dev_get_port_from_dev_instance (hi->dev_instance);
index 744dc5a..a00c9e2 100644 (file)
@@ -459,12 +459,17 @@ typedef struct
   vnet_dev_ops_t ops;
 } vnet_dev_driver_t;
 
+typedef struct
+{
+  vnet_dev_port_t *port;
+} vnet_dev_instance_t;
+
 typedef struct
 {
   vnet_dev_bus_t *buses;
   vnet_dev_driver_t *drivers;
   vnet_dev_t **devices;
-  vnet_dev_port_t **ports_by_dev_instance;
+  vnet_dev_instance_t *dev_instances;
   vnet_dev_bus_registration_t *bus_registrations;
   vnet_dev_driver_registration_t *driver_registrations;
   void *runtime_temp_spaces;
index b805698..0531b17 100644 (file)
@@ -51,13 +51,21 @@ vnet_dev_get_port_by_index (vnet_dev_t *dev, u32 index)
   return pool_elt_at_index (dev->ports, index)[0];
 }
 
-static_always_inline vnet_dev_port_t *
-vnet_dev_get_port_from_dev_instance (u32 dev_instance)
+static_always_inline vnet_dev_instance_t *
+vnet_dev_get_dev_instance (u32 dev_instance)
 {
   vnet_dev_main_t *dm = &vnet_dev_main;
-  if (pool_is_free_index (dm->ports_by_dev_instance, dev_instance))
+  if (pool_is_free_index (dm->dev_instances, dev_instance))
     return 0;
-  return pool_elt_at_index (dm->ports_by_dev_instance, dev_instance)[0];
+  return pool_elt_at_index (dm->dev_instances, dev_instance);
+}
+
+static_always_inline vnet_dev_port_t *
+vnet_dev_get_port_from_dev_instance (u32 dev_instance)
+{
+  vnet_dev_instance_t *di = vnet_dev_get_dev_instance (dev_instance);
+
+  return di ? di->port : 0;
 }
 
 static_always_inline vnet_dev_port_t *
index 0ebe3c4..7126cee 100644 (file)
@@ -517,7 +517,7 @@ vnet_dev_port_if_create (vlib_main_t *vm, vnet_dev_port_t *port)
   u16 n_threads = vlib_get_n_threads ();
   vnet_dev_main_t *dm = &vnet_dev_main;
   vnet_dev_t *dev = port->dev;
-  vnet_dev_port_t **pp;
+  vnet_dev_instance_t *di;
   vnet_dev_rv_t rv;
   u16 ti = 0;
 
@@ -563,10 +563,9 @@ vnet_dev_port_if_create (vlib_main_t *vm, vnet_dev_port_t *port)
        break;
     }
 
-  /* pool of port pointers helps us to assign unique dev_instance */
-  pool_get (dm->ports_by_dev_instance, pp);
-  port->intf.dev_instance = pp - dm->ports_by_dev_instance;
-  pp[0] = port;
+  pool_get (dm->dev_instances, di);
+  port->intf.dev_instance = di - dm->dev_instances;
+  di->port = port;
 
   if (port->attr.type == VNET_DEV_PORT_TYPE_ETHERNET)
     {
@@ -709,7 +708,7 @@ vnet_dev_port_if_remove (vlib_main_t *vm, vnet_dev_port_t *port)
       vlib_worker_thread_barrier_sync (vm);
       vnet_delete_hw_interface (vnm, port->intf.hw_if_index);
       vlib_worker_thread_barrier_release (vm);
-      pool_put_index (dm->ports_by_dev_instance, port->intf.dev_instance);
+      pool_put_index (dm->dev_instances, port->intf.dev_instance);
       port->interface_created = 0;
     }