Page MenuHomeFreeBSD

D39405.diff
No OneTemporary

D39405.diff

diff --git a/sys/net/if_infiniband.c b/sys/net/if_infiniband.c
--- a/sys/net/if_infiniband.c
+++ b/sys/net/if_infiniband.c
@@ -415,9 +415,13 @@
struct infiniband_header *ibh;
struct epoch_tracker et;
int isr;
+ bool needs_epoch;
+
+ needs_epoch = (ifp->if_flags & IFF_KNOWSEPOCH) == 0;
CURVNET_SET_QUIET(ifp->if_vnet);
- NET_EPOCH_ENTER(et);
+ if (__predict_false(needs_epoch))
+ NET_EPOCH_ENTER(et);
if ((ifp->if_flags & IFF_UP) == 0) {
if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
@@ -507,7 +511,8 @@
/* Allow monitor mode to claim this frame, after stats are updated. */
netisr_dispatch(isr, m);
done:
- NET_EPOCH_EXIT(et);
+ if (__predict_false(needs_epoch))
+ NET_EPOCH_EXIT(et);
CURVNET_RESTORE();
}
diff --git a/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib.h b/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib.h
--- a/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib.h
+++ b/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib.h
@@ -459,7 +459,7 @@
void ipoib_mark_paths_invalid(struct ipoib_dev_priv *priv);
void ipoib_flush_paths(struct ipoib_dev_priv *priv);
-struct ipoib_dev_priv *ipoib_intf_alloc(const char *format);
+struct ipoib_dev_priv *ipoib_intf_alloc(const char *format, struct ib_device *ca);
int ipoib_ib_dev_init(struct ipoib_dev_priv *priv, struct ib_device *ca,
int port);
diff --git a/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c b/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c
--- a/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -901,7 +901,7 @@
}
struct ipoib_dev_priv *
-ipoib_intf_alloc(const char *name)
+ipoib_intf_alloc(const char *name, struct ib_device *hca)
{
struct ipoib_dev_priv *priv;
if_t dev;
@@ -922,6 +922,8 @@
}
if_initname(dev, name, priv->unit);
if_setflags(dev, IFF_BROADCAST | IFF_MULTICAST);
+ if (hca->attrs.device_cap_flags & IB_DEVICE_KNOWSEPOCH)
+ if_setflagbits(dev, IFF_KNOWSEPOCH, 0);
infiniband_ifattach(priv->dev, NULL, priv->broadcastaddr);
@@ -976,7 +978,7 @@
struct ib_port_attr attr;
int result = -ENOMEM;
- priv = ipoib_intf_alloc(format);
+ priv = ipoib_intf_alloc(format, hca);
if (!priv)
goto alloc_mem_failed;
diff --git a/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_vlan.c b/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_vlan.c
--- a/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_vlan.c
+++ b/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_vlan.c
@@ -89,7 +89,7 @@
snprintf(intf_name, sizeof intf_name, "%s.%04x",
ppriv->dev->name, pkey);
- priv = ipoib_intf_alloc(intf_name);
+ priv = ipoib_intf_alloc(intf_name, ppriv->ca);
if (!priv) {
result = -ENOMEM;
goto err;
diff --git a/sys/ofed/include/rdma/ib_verbs.h b/sys/ofed/include/rdma/ib_verbs.h
--- a/sys/ofed/include/rdma/ib_verbs.h
+++ b/sys/ofed/include/rdma/ib_verbs.h
@@ -242,6 +242,7 @@
IB_DEVICE_SG_GAPS_REG = (1ULL << 32),
IB_DEVICE_VIRTUAL_FUNCTION = (1ULL << 33),
IB_DEVICE_RAW_SCATTER_FCS = (1ULL << 34),
+ IB_DEVICE_KNOWSEPOCH = (1ULL << 35),
};
enum ib_atomic_cap {

File Metadata

Mime Type
text/plain
Expires
Tue, Aug 4, 3:54 AM (2 h, 23 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
35933456
Default Alt Text
D39405.diff (2 KB)

Event Timeline