aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/ulp/ipoib/ipoib.h
diff options
context:
space:
mode:
authorOr Gerlitz <ogerlitz@voltaire.com>2007-10-08 04:13:00 -0400
committerRoland Dreier <rolandd@cisco.com>2007-10-10 16:02:30 -0400
commit335a64a5a958002bc238c90de695e120c3c8c120 (patch)
treee75f6aba0b89516e4100b5b9d6e77be86ce4d79d /drivers/infiniband/ulp/ipoib/ipoib.h
parent55a98e955caab78a5959933a4a3a0136e2491d6c (diff)
IPoIB: Allow setting policy to ignore multicast groups
The kernel IB stack allows (through the RDMA CM) userspace applications to join and use multicast groups from the IPoIB MGID range. This allows multicast traffic to be handled directly from userspace QPs, without going through the kernel stack, which gives better performance for some applications. However, to fully interoperate with IP multicast, such userspace applications need to participate in IGMP reports and queries, or else routers may not forward the multicast traffic to the system where the application is running. The simplest way to do this is to share the kernel IGMP implementation by using the IP_ADD_MEMBERSHIP option to join multicast groups that are being handled directly in userspace. However, in such cases, the actual multicast traffic should not also be handled by the IPoIB interface, because that would burn resources handling multicast packets that will just be discarded in the kernel. To handle this, this patch adds lookup on the database used for IB multicast group reference counting when IPoIB is joining multicast groups, and if a multicast group is already handled by user space, then the IPoIB kernel driver ignores the group. This is controlled by a per-interface policy flag. When the flag is set, IPoIB will not join and attach its QP to a multicast group which already has an entry in the database; when the flag is cleared, IPoIB will behave as before this change. For each IPoIB interface, the /sys/class/net/$intf/umcast attribute controls the policy flag. The default value is off/0. Signed-off-by: Or Gerlitz <ogerlitz@voltaire.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers/infiniband/ulp/ipoib/ipoib.h')
-rw-r--r--drivers/infiniband/ulp/ipoib/ipoib.h2
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h
index fc16bced8e54..a198ce8371db 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib.h
+++ b/drivers/infiniband/ulp/ipoib/ipoib.h
@@ -86,6 +86,7 @@ enum {
86 IPOIB_MCAST_STARTED = 8, 86 IPOIB_MCAST_STARTED = 8,
87 IPOIB_FLAG_NETIF_STOPPED = 9, 87 IPOIB_FLAG_NETIF_STOPPED = 9,
88 IPOIB_FLAG_ADMIN_CM = 10, 88 IPOIB_FLAG_ADMIN_CM = 10,
89 IPOIB_FLAG_UMCAST = 11,
89 90
90 IPOIB_MAX_BACKOFF_SECONDS = 16, 91 IPOIB_MAX_BACKOFF_SECONDS = 16,
91 92
@@ -384,6 +385,7 @@ static inline void ipoib_put_ah(struct ipoib_ah *ah)
384 385
385int ipoib_open(struct net_device *dev); 386int ipoib_open(struct net_device *dev);
386int ipoib_add_pkey_attr(struct net_device *dev); 387int ipoib_add_pkey_attr(struct net_device *dev);
388int ipoib_add_umcast_attr(struct net_device *dev);
387 389
388void ipoib_send(struct net_device *dev, struct sk_buff *skb, 390void ipoib_send(struct net_device *dev, struct sk_buff *skb,
389 struct ipoib_ah *address, u32 qpn); 391 struct ipoib_ah *address, u32 qpn);