Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband: (87 commits) mlx4_core: Fix section mismatches IPoIB: Allow setting policy to ignore multicast groups IB/mthca: Mark error paths as unlikely() in post_srq_recv functions IB/ipath: Minor fix to ordering of freeing and zeroing of tid pages. IB/ipath: Remove redundant link state checks IB/ipath: Fix IB_EVENT_PORT_ERR event IB/ipath: Better handling of unexpected GPIO interrupts IB/ipath: Maintain active time on all chips IB/ipath: Fix QHT7040 serial number check IB/ipath: Indicate a couple of chip bugs to userspace IB/ipath: iba6110 rev4 no longer needs recv header overrun workaround IB/ipath: Use counters in ipath_poll and cleanup interrupts in ipath_close IB/ipath: Remove duplicate copy of LMC IB/ipath: Add ability to set the LMC via the sysfs debugging interface IB/ipath: Optimize completion queue entry insertion and polling IB/ipath: Implement IB_EVENT_QP_LAST_WQE_REACHED IB/ipath: Generate flush CQE when QP is in error state IB/ipath: Remove redundant code IB/ipath: Future proof eeprom checksum code (contents reading) IB/ipath: UC RDMA WRITE with IMMEDIATE doesn't send the immediate ...
This commit is contained in:
@@ -86,6 +86,7 @@ enum {
|
||||
IPOIB_MCAST_STARTED = 8,
|
||||
IPOIB_FLAG_NETIF_STOPPED = 9,
|
||||
IPOIB_FLAG_ADMIN_CM = 10,
|
||||
IPOIB_FLAG_UMCAST = 11,
|
||||
|
||||
IPOIB_MAX_BACKOFF_SECONDS = 16,
|
||||
|
||||
@@ -113,7 +114,27 @@ struct ipoib_pseudoheader {
|
||||
u8 hwaddr[INFINIBAND_ALEN];
|
||||
};
|
||||
|
||||
struct ipoib_mcast;
|
||||
/* Used for all multicast joins (broadcast, IPv4 mcast and IPv6 mcast) */
|
||||
struct ipoib_mcast {
|
||||
struct ib_sa_mcmember_rec mcmember;
|
||||
struct ib_sa_multicast *mc;
|
||||
struct ipoib_ah *ah;
|
||||
|
||||
struct rb_node rb_node;
|
||||
struct list_head list;
|
||||
|
||||
unsigned long created;
|
||||
unsigned long backoff;
|
||||
|
||||
unsigned long flags;
|
||||
unsigned char logcount;
|
||||
|
||||
struct list_head neigh_list;
|
||||
|
||||
struct sk_buff_head pkt_queue;
|
||||
|
||||
struct net_device *dev;
|
||||
};
|
||||
|
||||
struct ipoib_rx_buf {
|
||||
struct sk_buff *skb;
|
||||
@@ -364,6 +385,7 @@ static inline void ipoib_put_ah(struct ipoib_ah *ah)
|
||||
|
||||
int ipoib_open(struct net_device *dev);
|
||||
int ipoib_add_pkey_attr(struct net_device *dev);
|
||||
int ipoib_add_umcast_attr(struct net_device *dev);
|
||||
|
||||
void ipoib_send(struct net_device *dev, struct sk_buff *skb,
|
||||
struct ipoib_ah *address, u32 qpn);
|
||||
|
@@ -810,14 +810,16 @@ static int ipoib_cm_rep_handler(struct ib_cm_id *cm_id, struct ib_cm_event *even
|
||||
static struct ib_qp *ipoib_cm_create_tx_qp(struct net_device *dev, struct ib_cq *cq)
|
||||
{
|
||||
struct ipoib_dev_priv *priv = netdev_priv(dev);
|
||||
struct ib_qp_init_attr attr = {};
|
||||
attr.recv_cq = priv->cq;
|
||||
attr.srq = priv->cm.srq;
|
||||
attr.cap.max_send_wr = ipoib_sendq_size;
|
||||
attr.cap.max_send_sge = 1;
|
||||
attr.sq_sig_type = IB_SIGNAL_ALL_WR;
|
||||
attr.qp_type = IB_QPT_RC;
|
||||
attr.send_cq = cq;
|
||||
struct ib_qp_init_attr attr = {
|
||||
.send_cq = cq,
|
||||
.recv_cq = priv->cq,
|
||||
.srq = priv->cm.srq,
|
||||
.cap.max_send_wr = ipoib_sendq_size,
|
||||
.cap.max_send_sge = 1,
|
||||
.sq_sig_type = IB_SIGNAL_ALL_WR,
|
||||
.qp_type = IB_QPT_RC,
|
||||
};
|
||||
|
||||
return ib_create_qp(priv->pd, &attr);
|
||||
}
|
||||
|
||||
|
@@ -553,6 +553,14 @@ void ipoib_drain_cq(struct net_device *dev)
|
||||
do {
|
||||
n = ib_poll_cq(priv->cq, IPOIB_NUM_WC, priv->ibwc);
|
||||
for (i = 0; i < n; ++i) {
|
||||
/*
|
||||
* Convert any successful completions to flush
|
||||
* errors to avoid passing packets up the
|
||||
* stack after bringing the device down.
|
||||
*/
|
||||
if (priv->ibwc[i].status == IB_WC_SUCCESS)
|
||||
priv->ibwc[i].status = IB_WC_WR_FLUSH_ERR;
|
||||
|
||||
if (priv->ibwc[i].wr_id & IPOIB_CM_OP_SRQ)
|
||||
ipoib_cm_handle_rx_wc(dev, priv->ibwc + i);
|
||||
else if (priv->ibwc[i].wr_id & IPOIB_OP_RECV)
|
||||
|
@@ -473,9 +473,10 @@ static struct ipoib_path *path_rec_create(struct net_device *dev, void *gid)
|
||||
INIT_LIST_HEAD(&path->neigh_list);
|
||||
|
||||
memcpy(path->pathrec.dgid.raw, gid, sizeof (union ib_gid));
|
||||
path->pathrec.sgid = priv->local_gid;
|
||||
path->pathrec.pkey = cpu_to_be16(priv->pkey);
|
||||
path->pathrec.numb_path = 1;
|
||||
path->pathrec.sgid = priv->local_gid;
|
||||
path->pathrec.pkey = cpu_to_be16(priv->pkey);
|
||||
path->pathrec.numb_path = 1;
|
||||
path->pathrec.traffic_class = priv->broadcast->mcmember.traffic_class;
|
||||
|
||||
return path;
|
||||
}
|
||||
@@ -496,6 +497,7 @@ static int path_rec_start(struct net_device *dev,
|
||||
IB_SA_PATH_REC_DGID |
|
||||
IB_SA_PATH_REC_SGID |
|
||||
IB_SA_PATH_REC_NUMB_PATH |
|
||||
IB_SA_PATH_REC_TRAFFIC_CLASS |
|
||||
IB_SA_PATH_REC_PKEY,
|
||||
1000, GFP_ATOMIC,
|
||||
path_rec_completion,
|
||||
@@ -1015,6 +1017,37 @@ static ssize_t show_pkey(struct device *dev,
|
||||
}
|
||||
static DEVICE_ATTR(pkey, S_IRUGO, show_pkey, NULL);
|
||||
|
||||
static ssize_t show_umcast(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct ipoib_dev_priv *priv = netdev_priv(to_net_dev(dev));
|
||||
|
||||
return sprintf(buf, "%d\n", test_bit(IPOIB_FLAG_UMCAST, &priv->flags));
|
||||
}
|
||||
|
||||
static ssize_t set_umcast(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct ipoib_dev_priv *priv = netdev_priv(to_net_dev(dev));
|
||||
unsigned long umcast_val = simple_strtoul(buf, NULL, 0);
|
||||
|
||||
if (umcast_val > 0) {
|
||||
set_bit(IPOIB_FLAG_UMCAST, &priv->flags);
|
||||
ipoib_warn(priv, "ignoring multicast groups joined directly "
|
||||
"by userspace\n");
|
||||
} else
|
||||
clear_bit(IPOIB_FLAG_UMCAST, &priv->flags);
|
||||
|
||||
return count;
|
||||
}
|
||||
static DEVICE_ATTR(umcast, S_IWUSR | S_IRUGO, show_umcast, set_umcast);
|
||||
|
||||
int ipoib_add_umcast_attr(struct net_device *dev)
|
||||
{
|
||||
return device_create_file(&dev->dev, &dev_attr_umcast);
|
||||
}
|
||||
|
||||
static ssize_t create_child(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
@@ -1081,7 +1114,7 @@ static struct net_device *ipoib_add_port(const char *format,
|
||||
if (result) {
|
||||
printk(KERN_WARNING "%s: ib_query_pkey port %d failed (ret = %d)\n",
|
||||
hca->name, port, result);
|
||||
goto alloc_mem_failed;
|
||||
goto device_init_failed;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1097,7 +1130,7 @@ static struct net_device *ipoib_add_port(const char *format,
|
||||
if (result) {
|
||||
printk(KERN_WARNING "%s: ib_query_gid port %d failed (ret = %d)\n",
|
||||
hca->name, port, result);
|
||||
goto alloc_mem_failed;
|
||||
goto device_init_failed;
|
||||
} else
|
||||
memcpy(priv->dev->dev_addr + 4, priv->local_gid.raw, sizeof (union ib_gid));
|
||||
|
||||
@@ -1132,6 +1165,8 @@ static struct net_device *ipoib_add_port(const char *format,
|
||||
goto sysfs_failed;
|
||||
if (ipoib_add_pkey_attr(priv->dev))
|
||||
goto sysfs_failed;
|
||||
if (ipoib_add_umcast_attr(priv->dev))
|
||||
goto sysfs_failed;
|
||||
if (device_create_file(&priv->dev->dev, &dev_attr_create_child))
|
||||
goto sysfs_failed;
|
||||
if (device_create_file(&priv->dev->dev, &dev_attr_delete_child))
|
||||
|
@@ -57,28 +57,6 @@ MODULE_PARM_DESC(mcast_debug_level,
|
||||
|
||||
static DEFINE_MUTEX(mcast_mutex);
|
||||
|
||||
/* Used for all multicast joins (broadcast, IPv4 mcast and IPv6 mcast) */
|
||||
struct ipoib_mcast {
|
||||
struct ib_sa_mcmember_rec mcmember;
|
||||
struct ib_sa_multicast *mc;
|
||||
struct ipoib_ah *ah;
|
||||
|
||||
struct rb_node rb_node;
|
||||
struct list_head list;
|
||||
|
||||
unsigned long created;
|
||||
unsigned long backoff;
|
||||
|
||||
unsigned long flags;
|
||||
unsigned char logcount;
|
||||
|
||||
struct list_head neigh_list;
|
||||
|
||||
struct sk_buff_head pkt_queue;
|
||||
|
||||
struct net_device *dev;
|
||||
};
|
||||
|
||||
struct ipoib_mcast_iter {
|
||||
struct net_device *dev;
|
||||
union ib_gid mgid;
|
||||
@@ -783,6 +761,7 @@ void ipoib_mcast_restart_task(struct work_struct *work)
|
||||
struct ipoib_mcast *mcast, *tmcast;
|
||||
LIST_HEAD(remove_list);
|
||||
unsigned long flags;
|
||||
struct ib_sa_mcmember_rec rec;
|
||||
|
||||
ipoib_dbg_mcast(priv, "restarting multicast task\n");
|
||||
|
||||
@@ -816,6 +795,14 @@ void ipoib_mcast_restart_task(struct work_struct *work)
|
||||
if (!mcast || test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) {
|
||||
struct ipoib_mcast *nmcast;
|
||||
|
||||
/* ignore group which is directly joined by userspace */
|
||||
if (test_bit(IPOIB_FLAG_UMCAST, &priv->flags) &&
|
||||
!ib_sa_get_mcmember_rec(priv->ca, priv->port, &mgid, &rec)) {
|
||||
ipoib_dbg_mcast(priv, "ignoring multicast entry for mgid "
|
||||
IPOIB_GID_FMT "\n", IPOIB_GID_ARG(mgid));
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Not found or send-only group, let's add a new entry */
|
||||
ipoib_dbg_mcast(priv, "adding multicast entry for mgid "
|
||||
IPOIB_GID_FMT "\n", IPOIB_GID_ARG(mgid));
|
||||
|
@@ -185,7 +185,7 @@ int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca)
|
||||
goto out_free_cq;
|
||||
|
||||
init_attr.send_cq = priv->cq;
|
||||
init_attr.recv_cq = priv->cq,
|
||||
init_attr.recv_cq = priv->cq;
|
||||
|
||||
priv->qp = ib_create_qp(priv->pd, &init_attr);
|
||||
if (IS_ERR(priv->qp)) {
|
||||
|
@@ -119,6 +119,8 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey)
|
||||
goto sysfs_failed;
|
||||
if (ipoib_add_pkey_attr(priv->dev))
|
||||
goto sysfs_failed;
|
||||
if (ipoib_add_umcast_attr(priv->dev))
|
||||
goto sysfs_failed;
|
||||
|
||||
if (device_create_file(&priv->dev->dev, &dev_attr_parent))
|
||||
goto sysfs_failed;
|
||||
|
@@ -34,8 +34,6 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/mm.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/scatterlist.h>
|
||||
#include <linux/scatterlist.h>
|
||||
#include <linux/kfifo.h>
|
||||
#include <scsi/scsi_cmnd.h>
|
||||
|
@@ -36,8 +36,6 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/highmem.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/scatterlist.h>
|
||||
#include <linux/scatterlist.h>
|
||||
|
||||
#include "iscsi_iser.h"
|
||||
|
@@ -32,7 +32,6 @@
|
||||
*
|
||||
* $Id: iser_verbs.c 7051 2006-05-10 12:29:11Z ogerlitz $
|
||||
*/
|
||||
#include <asm/io.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/delay.h>
|
||||
|
@@ -285,6 +285,7 @@ static int srp_lookup_path(struct srp_target_port *target)
|
||||
target->srp_host->dev->dev,
|
||||
target->srp_host->port,
|
||||
&target->path,
|
||||
IB_SA_PATH_REC_SERVICE_ID |
|
||||
IB_SA_PATH_REC_DGID |
|
||||
IB_SA_PATH_REC_SGID |
|
||||
IB_SA_PATH_REC_NUMB_PATH |
|
||||
@@ -1692,6 +1693,7 @@ static int srp_parse_options(const char *buf, struct srp_target_port *target)
|
||||
goto out;
|
||||
}
|
||||
target->service_id = cpu_to_be64(simple_strtoull(p, NULL, 16));
|
||||
target->path.service_id = target->service_id;
|
||||
kfree(p);
|
||||
break;
|
||||
|
||||
|
Reference in New Issue
Block a user