提交 ccbf04f2 编写于 作者: L Linus Torvalds

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:
  IB/iser: Add dependency on INFINIBAND_ADDR_TRANS
  IPoIB: Do not join broadcast group if interface is brought down
  RDMA/nes: Fix for NIPQUAD removal
  IPoIB: Fix loss of connectivity after bonding failover on both sides
  IB/mlx4: Don't register IB device for adapters with no IB ports
  mlx4_core: Fix warning from min()
  IB/ehca: spin_lock_irqsave() takes an unsigned long
...@@ -955,7 +955,7 @@ void ehca_poll_eqs(unsigned long data) ...@@ -955,7 +955,7 @@ void ehca_poll_eqs(unsigned long data)
struct ehca_eq *eq = &shca->eq; struct ehca_eq *eq = &shca->eq;
int max = 3; int max = 3;
volatile u64 q_ofs, q_ofs2; volatile u64 q_ofs, q_ofs2;
u64 flags; unsigned long flags;
spin_lock_irqsave(&eq->spinlock, flags); spin_lock_irqsave(&eq->spinlock, flags);
q_ofs = eq->ipz_queue.current_q_offset; q_ofs = eq->ipz_queue.current_q_offset;
spin_unlock_irqrestore(&eq->spinlock, flags); spin_unlock_irqrestore(&eq->spinlock, flags);
......
...@@ -543,14 +543,21 @@ static void *mlx4_ib_add(struct mlx4_dev *dev) ...@@ -543,14 +543,21 @@ static void *mlx4_ib_add(struct mlx4_dev *dev)
{ {
static int mlx4_ib_version_printed; static int mlx4_ib_version_printed;
struct mlx4_ib_dev *ibdev; struct mlx4_ib_dev *ibdev;
int num_ports = 0;
int i; int i;
if (!mlx4_ib_version_printed) { if (!mlx4_ib_version_printed) {
printk(KERN_INFO "%s", mlx4_ib_version); printk(KERN_INFO "%s", mlx4_ib_version);
++mlx4_ib_version_printed; ++mlx4_ib_version_printed;
} }
mlx4_foreach_port(i, dev, MLX4_PORT_TYPE_IB)
num_ports++;
/* No point in registering a device with no ports... */
if (num_ports == 0)
return NULL;
ibdev = (struct mlx4_ib_dev *) ib_alloc_device(sizeof *ibdev); ibdev = (struct mlx4_ib_dev *) ib_alloc_device(sizeof *ibdev);
if (!ibdev) { if (!ibdev) {
dev_err(&dev->pdev->dev, "Device struct alloc failed\n"); dev_err(&dev->pdev->dev, "Device struct alloc failed\n");
...@@ -574,9 +581,7 @@ static void *mlx4_ib_add(struct mlx4_dev *dev) ...@@ -574,9 +581,7 @@ static void *mlx4_ib_add(struct mlx4_dev *dev)
ibdev->ib_dev.owner = THIS_MODULE; ibdev->ib_dev.owner = THIS_MODULE;
ibdev->ib_dev.node_type = RDMA_NODE_IB_CA; ibdev->ib_dev.node_type = RDMA_NODE_IB_CA;
ibdev->ib_dev.local_dma_lkey = dev->caps.reserved_lkey; ibdev->ib_dev.local_dma_lkey = dev->caps.reserved_lkey;
ibdev->num_ports = 0; ibdev->num_ports = num_ports;
mlx4_foreach_port(i, dev, MLX4_PORT_TYPE_IB)
ibdev->num_ports++;
ibdev->ib_dev.phys_port_cnt = ibdev->num_ports; ibdev->ib_dev.phys_port_cnt = ibdev->num_ports;
ibdev->ib_dev.num_comp_vectors = dev->caps.num_comp_vectors; ibdev->ib_dev.num_comp_vectors = dev->caps.num_comp_vectors;
ibdev->ib_dev.dma_device = &dev->pdev->dev; ibdev->ib_dev.dma_device = &dev->pdev->dev;
......
...@@ -778,12 +778,13 @@ static struct nes_cm_node *find_node(struct nes_cm_core *cm_core, ...@@ -778,12 +778,13 @@ static struct nes_cm_node *find_node(struct nes_cm_core *cm_core,
unsigned long flags; unsigned long flags;
struct list_head *hte; struct list_head *hte;
struct nes_cm_node *cm_node; struct nes_cm_node *cm_node;
__be32 tmp_addr = cpu_to_be32(loc_addr);
/* get a handle on the hte */ /* get a handle on the hte */
hte = &cm_core->connected_nodes; hte = &cm_core->connected_nodes;
nes_debug(NES_DBG_CM, "Searching for an owner node: %pI4:%x from core %p->%p\n", nes_debug(NES_DBG_CM, "Searching for an owner node: %pI4:%x from core %p->%p\n",
&loc_addr, loc_port, cm_core, hte); &tmp_addr, loc_port, cm_core, hte);
/* walk list and find cm_node associated with this session ID */ /* walk list and find cm_node associated with this session ID */
spin_lock_irqsave(&cm_core->ht_lock, flags); spin_lock_irqsave(&cm_core->ht_lock, flags);
...@@ -816,6 +817,7 @@ static struct nes_cm_listener *find_listener(struct nes_cm_core *cm_core, ...@@ -816,6 +817,7 @@ static struct nes_cm_listener *find_listener(struct nes_cm_core *cm_core,
{ {
unsigned long flags; unsigned long flags;
struct nes_cm_listener *listen_node; struct nes_cm_listener *listen_node;
__be32 tmp_addr = cpu_to_be32(dst_addr);
/* walk list and find cm_node associated with this session ID */ /* walk list and find cm_node associated with this session ID */
spin_lock_irqsave(&cm_core->listen_list_lock, flags); spin_lock_irqsave(&cm_core->listen_list_lock, flags);
...@@ -833,7 +835,7 @@ static struct nes_cm_listener *find_listener(struct nes_cm_core *cm_core, ...@@ -833,7 +835,7 @@ static struct nes_cm_listener *find_listener(struct nes_cm_core *cm_core,
spin_unlock_irqrestore(&cm_core->listen_list_lock, flags); spin_unlock_irqrestore(&cm_core->listen_list_lock, flags);
nes_debug(NES_DBG_CM, "Unable to find listener for %pI4:%x\n", nes_debug(NES_DBG_CM, "Unable to find listener for %pI4:%x\n",
&dst_addr, dst_port); &tmp_addr, dst_port);
/* no listener */ /* no listener */
return NULL; return NULL;
...@@ -2059,6 +2061,7 @@ static int mini_cm_recv_pkt(struct nes_cm_core *cm_core, ...@@ -2059,6 +2061,7 @@ static int mini_cm_recv_pkt(struct nes_cm_core *cm_core,
struct tcphdr *tcph; struct tcphdr *tcph;
struct nes_cm_info nfo; struct nes_cm_info nfo;
int skb_handled = 1; int skb_handled = 1;
__be32 tmp_daddr, tmp_saddr;
if (!skb) if (!skb)
return 0; return 0;
...@@ -2074,8 +2077,11 @@ static int mini_cm_recv_pkt(struct nes_cm_core *cm_core, ...@@ -2074,8 +2077,11 @@ static int mini_cm_recv_pkt(struct nes_cm_core *cm_core,
nfo.rem_addr = ntohl(iph->saddr); nfo.rem_addr = ntohl(iph->saddr);
nfo.rem_port = ntohs(tcph->source); nfo.rem_port = ntohs(tcph->source);
tmp_daddr = cpu_to_be32(iph->daddr);
tmp_saddr = cpu_to_be32(iph->saddr);
nes_debug(NES_DBG_CM, "Received packet: dest=%pI4:0x%04X src=%pI4:0x%04X\n", nes_debug(NES_DBG_CM, "Received packet: dest=%pI4:0x%04X src=%pI4:0x%04X\n",
&iph->daddr, tcph->dest, &iph->saddr, tcph->source); &tmp_daddr, tcph->dest, &tmp_saddr, tcph->source);
do { do {
cm_node = find_node(cm_core, cm_node = find_node(cm_core,
......
...@@ -655,6 +655,7 @@ int nes_arp_table(struct nes_device *nesdev, u32 ip_addr, u8 *mac_addr, u32 acti ...@@ -655,6 +655,7 @@ int nes_arp_table(struct nes_device *nesdev, u32 ip_addr, u8 *mac_addr, u32 acti
struct nes_adapter *nesadapter = nesdev->nesadapter; struct nes_adapter *nesadapter = nesdev->nesadapter;
int arp_index; int arp_index;
int err = 0; int err = 0;
__be32 tmp_addr;
for (arp_index = 0; (u32) arp_index < nesadapter->arp_table_size; arp_index++) { for (arp_index = 0; (u32) arp_index < nesadapter->arp_table_size; arp_index++) {
if (nesadapter->arp_table[arp_index].ip_addr == ip_addr) if (nesadapter->arp_table[arp_index].ip_addr == ip_addr)
...@@ -682,8 +683,9 @@ int nes_arp_table(struct nes_device *nesdev, u32 ip_addr, u8 *mac_addr, u32 acti ...@@ -682,8 +683,9 @@ int nes_arp_table(struct nes_device *nesdev, u32 ip_addr, u8 *mac_addr, u32 acti
/* DELETE or RESOLVE */ /* DELETE or RESOLVE */
if (arp_index == nesadapter->arp_table_size) { if (arp_index == nesadapter->arp_table_size) {
tmp_addr = cpu_to_be32(ip_addr);
nes_debug(NES_DBG_NETDEV, "MAC for %pI4 not in ARP table - cannot %s\n", nes_debug(NES_DBG_NETDEV, "MAC for %pI4 not in ARP table - cannot %s\n",
&ip_addr, action == NES_ARP_RESOLVE ? "resolve" : "delete"); &tmp_addr, action == NES_ARP_RESOLVE ? "resolve" : "delete");
return -1; return -1;
} }
......
...@@ -711,26 +711,26 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -711,26 +711,26 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev)
neigh = *to_ipoib_neigh(skb->dst->neighbour); neigh = *to_ipoib_neigh(skb->dst->neighbour);
if (neigh->ah) if (unlikely((memcmp(&neigh->dgid.raw,
if (unlikely((memcmp(&neigh->dgid.raw, skb->dst->neighbour->ha + 4,
skb->dst->neighbour->ha + 4, sizeof(union ib_gid))) ||
sizeof(union ib_gid))) || (neigh->dev != dev))) {
(neigh->dev != dev))) { spin_lock_irqsave(&priv->lock, flags);
spin_lock_irqsave(&priv->lock, flags); /*
/* * It's safe to call ipoib_put_ah() inside
* It's safe to call ipoib_put_ah() inside * priv->lock here, because we know that
* priv->lock here, because we know that * path->ah will always hold one more reference,
* path->ah will always hold one more reference, * so ipoib_put_ah() will never do more than
* so ipoib_put_ah() will never do more than * decrement the ref count.
* decrement the ref count. */
*/ if (neigh->ah)
ipoib_put_ah(neigh->ah); ipoib_put_ah(neigh->ah);
list_del(&neigh->list); list_del(&neigh->list);
ipoib_neigh_free(dev, neigh); ipoib_neigh_free(dev, neigh);
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irqrestore(&priv->lock, flags);
ipoib_path_lookup(skb, dev); ipoib_path_lookup(skb, dev);
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }
if (ipoib_cm_get(neigh)) { if (ipoib_cm_get(neigh)) {
if (ipoib_cm_up(neigh)) { if (ipoib_cm_up(neigh)) {
......
...@@ -529,6 +529,9 @@ void ipoib_mcast_join_task(struct work_struct *work) ...@@ -529,6 +529,9 @@ void ipoib_mcast_join_task(struct work_struct *work)
if (!priv->broadcast) { if (!priv->broadcast) {
struct ipoib_mcast *broadcast; struct ipoib_mcast *broadcast;
if (!test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
return;
broadcast = ipoib_mcast_alloc(dev, 1); broadcast = ipoib_mcast_alloc(dev, 1);
if (!broadcast) { if (!broadcast) {
ipoib_warn(priv, "failed to allocate broadcast group\n"); ipoib_warn(priv, "failed to allocate broadcast group\n");
......
config INFINIBAND_ISER config INFINIBAND_ISER
tristate "iSCSI Extensions for RDMA (iSER)" tristate "iSCSI Extensions for RDMA (iSER)"
depends on SCSI && INET depends on SCSI && INET && INFINIBAND_ADDR_TRANS
select SCSI_ISCSI_ATTRS select SCSI_ISCSI_ATTRS
---help--- ---help---
Support for the iSCSI Extensions for RDMA (iSER) Protocol Support for the iSCSI Extensions for RDMA (iSER) Protocol
......
...@@ -912,8 +912,8 @@ static void mlx4_enable_msi_x(struct mlx4_dev *dev) ...@@ -912,8 +912,8 @@ static void mlx4_enable_msi_x(struct mlx4_dev *dev)
int i; int i;
if (msi_x) { if (msi_x) {
nreq = min(dev->caps.num_eqs - dev->caps.reserved_eqs, nreq = min_t(int, dev->caps.num_eqs - dev->caps.reserved_eqs,
num_possible_cpus() + 1); num_possible_cpus() + 1);
entries = kcalloc(nreq, sizeof *entries, GFP_KERNEL); entries = kcalloc(nreq, sizeof *entries, GFP_KERNEL);
if (!entries) if (!entries)
goto no_msi; goto no_msi;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册