dpdk: move number of sub-interfaces to 2nd cacheline, introduce flag 46/2946/4
authorDamjan Marion <damarion@cisco.com>
Mon, 19 Sep 2016 11:31:49 +0000 (13:31 +0200)
committerDave Barach <openvpp@barachs.net>
Tue, 20 Sep 2016 22:26:14 +0000 (22:26 +0000)
This saves 2 bytes from the 1st cacheline.

Change-Id: I691a3a0ee07ec2db4ae85b96b451ef53ad8c9458
Signed-off-by: Damjan Marion <damarion@cisco.com>
vnet/vnet/devices/dpdk/device.c
vnet/vnet/devices/dpdk/dpdk.h
vnet/vnet/devices/dpdk/node.c

index be54bd2..119d603 100644 (file)
@@ -1165,27 +1165,29 @@ dpdk_subif_add_del_function (vnet_main_t * vnm,
   dpdk_device_t *xd = vec_elt_at_index (xm->devices, hw->dev_instance);
   vnet_sw_interface_t *t = (vnet_sw_interface_t *) st;
   int r, vlan_offload;
-  u32 prev_subifs = xd->vlan_subifs;
+  u32 prev_subifs = xd->num_subifs;
+  clib_error_t *err = 0;
 
   if (is_add)
-    xd->vlan_subifs++;
-  else if (xd->vlan_subifs)
-    xd->vlan_subifs--;
+    xd->num_subifs++;
+  else if (xd->num_subifs)
+    xd->num_subifs--;
 
   if ((xd->flags & DPDK_DEVICE_FLAG_PMD) == 0)
-    return 0;
+    goto done;
 
   /* currently we program VLANS only for IXGBE VF and I40E VF */
   if ((xd->pmd != VNET_DPDK_PMD_IXGBEVF) && (xd->pmd != VNET_DPDK_PMD_I40EVF))
-    return 0;
+    goto done;
 
   if (t->sub.eth.flags.no_tags == 1)
-    return 0;
+    goto done;
 
   if ((t->sub.eth.flags.one_tag != 1) || (t->sub.eth.flags.exact_match != 1))
     {
-      xd->vlan_subifs = prev_subifs;
-      return clib_error_return (0, "unsupported VLAN setup");
+      xd->num_subifs = prev_subifs;
+      err = clib_error_return (0, "unsupported VLAN setup");
+      goto done;
     }
 
   vlan_offload = rte_eth_dev_get_vlan_offload (xd->device_index);
@@ -1193,9 +1195,10 @@ dpdk_subif_add_del_function (vnet_main_t * vnm,
 
   if ((r = rte_eth_dev_set_vlan_offload (xd->device_index, vlan_offload)))
     {
-      xd->vlan_subifs = prev_subifs;
-      return clib_error_return (0, "rte_eth_dev_set_vlan_offload[%d]: err %d",
-                               xd->device_index, r);
+      xd->num_subifs = prev_subifs;
+      err = clib_error_return (0, "rte_eth_dev_set_vlan_offload[%d]: err %d",
+                              xd->device_index, r);
+      goto done;
     }
 
 
@@ -1203,12 +1206,19 @@ dpdk_subif_add_del_function (vnet_main_t * vnm,
        rte_eth_dev_vlan_filter (xd->device_index, t->sub.eth.outer_vlan_id,
                                is_add)))
     {
-      xd->vlan_subifs = prev_subifs;
-      return clib_error_return (0, "rte_eth_dev_vlan_filter[%d]: err %d",
-                               xd->device_index, r);
+      xd->num_subifs = prev_subifs;
+      err = clib_error_return (0, "rte_eth_dev_vlan_filter[%d]: err %d",
+                              xd->device_index, r);
+      goto done;
     }
 
-  return 0;
+done:
+  if (xd->num_subifs)
+    xd->flags |= DPDK_DEVICE_FLAG_HAVE_SUBIF;
+  else
+    xd->flags &= ~DPDK_DEVICE_FLAG_HAVE_SUBIF;
+
+  return err;
 }
 
 /* *INDENT-OFF* */
index 025ebf4..2cb301c 100644 (file)
@@ -203,9 +203,6 @@ typedef struct
   /* vector of traced contexts, per device */
   u32 *d_trace_buffers;
 
-  /* number of sub-interfaces */
-  u16 vlan_subifs;
-
   dpdk_pmd_t pmd:8;
   i8 cpu_socket;
 
@@ -215,11 +212,15 @@ typedef struct
 #define DPDK_DEVICE_FLAG_PMD            (1 << 2)
 #define DPDK_DEVICE_FLAG_KNI            (1 << 3)
 #define DPDK_DEVICE_FLAG_VHOST_USER     (1 << 4)
+#define DPDK_DEVICE_FLAG_HAVE_SUBIF     (1 << 5)
 
     CLIB_CACHE_LINE_ALIGN_MARK (cacheline1);
 
   u8 *interface_name_suffix;
 
+  /* number of sub-interfaces */
+  u16 num_subifs;
+
   /* PMD related */
   u16 tx_q_used;
   u16 rx_q_used;
index 5852b3d..a9e286e 100644 (file)
@@ -121,7 +121,8 @@ dpdk_rx_next_and_error_from_mb_flags_x1 (dpdk_device_t * xd,
              HANDOFF_DISPATCH_NEXT_ETHERNET_INPUT;
        }
       else
-       if (PREDICT_FALSE (xd->vlan_subifs || (mb_flags & PKT_RX_VLAN_PKT)))
+       if (PREDICT_FALSE ((xd->flags & DPDK_DEVICE_FLAG_HAVE_SUBIF) ||
+                          (mb_flags & PKT_RX_VLAN_PKT)))
        n0 = DPDK_RX_NEXT_ETHERNET_INPUT;
       else
        {