]> git.openfabrics.org - ~emulex/for-vlad/compat-rdma.git/commitdiff
Add RHEL6.2 backports
authorVladimir Sokolovsky <vlad@mellanox.com>
Fri, 23 Mar 2012 20:47:51 +0000 (22:47 +0200)
committerVladimir Sokolovsky <vlad@mellanox.com>
Fri, 23 Mar 2012 20:47:51 +0000 (22:47 +0200)
Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.com>
backports/2.6.32-EL6.2/01-pinned_to_locked_vm_to_3_1.patch [new file with mode: 0644]
backports/2.6.32-EL6.2/02-remove-SKB-paged-frag-API.patch [new file with mode: 0644]
backports/2.6.32-EL6.2/03-remove-attr_is_visible.patch [new file with mode: 0644]
backports/2.6.32-EL6.2/04-ib-core-Add-RHEL6.2-backports.patch [new file with mode: 0644]
backports/2.6.32-EL6.2/05-ipoib-Add-RHEL6.2-backports.patch [new file with mode: 0644]
backports/2.6.32-EL6.2/06-mlx4_en-Add-RHEL6.2-backports.patch [new file with mode: 0644]
backports/2.6.32-EL6.2/07-mlx4_ib-Add-RHEL6.2-backports.patch [new file with mode: 0644]
backports/2.6.32-EL6.2/08-rds-Add-RHEL6.2-backports.patch [new file with mode: 0644]

diff --git a/backports/2.6.32-EL6.2/01-pinned_to_locked_vm_to_3_1.patch b/backports/2.6.32-EL6.2/01-pinned_to_locked_vm_to_3_1.patch
new file mode 100644 (file)
index 0000000..5875c2b
--- /dev/null
@@ -0,0 +1,84 @@
+Index: compat-rdma/drivers/infiniband/core/umem.c
+===================================================================
+--- compat-rdma.orig/drivers/infiniband/core/umem.c
++++ compat-rdma/drivers/infiniband/core/umem.c
+@@ -137,7 +137,7 @@ struct ib_umem *ib_umem_get(struct ib_uc
+       down_write(&current->mm->mmap_sem);
+-      locked     = npages + current->mm->pinned_vm;
++      locked     = npages + current->mm->locked_vm;
+       lock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT;
+       if ((locked > lock_limit) && !capable(CAP_IPC_LOCK)) {
+@@ -207,7 +207,7 @@ out:
+               __ib_umem_release(context->device, umem, 0);
+               kfree(umem);
+       } else
+-              current->mm->pinned_vm = locked;
++              current->mm->locked_vm = locked;
+       up_write(&current->mm->mmap_sem);
+       if (vma_list)
+@@ -223,7 +223,7 @@ static void ib_umem_account(struct work_
+       struct ib_umem *umem = container_of(work, struct ib_umem, work);
+       down_write(&umem->mm->mmap_sem);
+-      umem->mm->pinned_vm -= umem->diff;
++      umem->mm->locked_vm -= umem->diff;
+       up_write(&umem->mm->mmap_sem);
+       mmput(umem->mm);
+       kfree(umem);
+Index: compat-rdma/drivers/infiniband/hw/ipath/ipath_user_pages.c
+===================================================================
+--- compat-rdma.orig/drivers/infiniband/hw/ipath/ipath_user_pages.c
++++ compat-rdma/drivers/infiniband/hw/ipath/ipath_user_pages.c
+@@ -79,7 +79,7 @@ static int __ipath_get_user_pages(unsign
+                       goto bail_release;
+       }
+-      current->mm->pinned_vm += num_pages;
++      current->mm->locked_vm += num_pages;
+       ret = 0;
+       goto bail;
+@@ -178,7 +178,7 @@ void ipath_release_user_pages(struct pag
+       __ipath_release_user_pages(p, num_pages, 1);
+-      current->mm->pinned_vm -= num_pages;
++      current->mm->locked_vm -= num_pages;
+       up_write(&current->mm->mmap_sem);
+ }
+@@ -195,7 +195,7 @@ static void user_pages_account(struct wo
+               container_of(_work, struct ipath_user_pages_work, work);
+       down_write(&work->mm->mmap_sem);
+-      work->mm->pinned_vm -= work->num_pages;
++      work->mm->locked_vm -= work->num_pages;
+       up_write(&work->mm->mmap_sem);
+       mmput(work->mm);
+       kfree(work);
+Index: compat-rdma/drivers/infiniband/hw/qib/qib_user_pages.c
+===================================================================
+--- compat-rdma.orig/drivers/infiniband/hw/qib/qib_user_pages.c
++++ compat-rdma/drivers/infiniband/hw/qib/qib_user_pages.c
+@@ -74,7 +74,7 @@ static int __qib_get_user_pages(unsigned
+                       goto bail_release;
+       }
+-      current->mm->pinned_vm += num_pages;
++      current->mm->locked_vm += num_pages;
+       ret = 0;
+       goto bail;
+@@ -151,7 +151,7 @@ void qib_release_user_pages(struct page
+       __qib_release_user_pages(p, num_pages, 1);
+       if (current->mm) {
+-              current->mm->pinned_vm -= num_pages;
++              current->mm->locked_vm -= num_pages;
+               up_write(&current->mm->mmap_sem);
+       }
+ }
diff --git a/backports/2.6.32-EL6.2/02-remove-SKB-paged-frag-API.patch b/backports/2.6.32-EL6.2/02-remove-SKB-paged-frag-API.patch
new file mode 100644 (file)
index 0000000..1c44fc4
--- /dev/null
@@ -0,0 +1,123 @@
+Index: compat-rdma/drivers/net/ethernet/mellanox/mlx4/en_rx.c
+===================================================================
+--- compat-rdma.orig/drivers/net/ethernet/mellanox/mlx4/en_rx.c        2012-01-09 16:15:04.000000000 +0200
++++ compat-rdma/drivers/net/ethernet/mellanox/mlx4/en_rx.c     2012-01-23 11:52:39.899175000 +0200
+@@ -44,7 +44,7 @@
+ static int mlx4_en_alloc_frag(struct mlx4_en_priv *priv,
+                             struct mlx4_en_rx_desc *rx_desc,
+-                            struct page_frag *skb_frags,
++                            struct skb_frag_struct *skb_frags,
+                             struct mlx4_en_rx_alloc *ring_alloc,
+                             int i)
+ {
+@@ -61,7 +61,7 @@ static int mlx4_en_alloc_frag(struct mlx
+                       return -ENOMEM;
+               skb_frags[i].page = page_alloc->page;
+-              skb_frags[i].offset = page_alloc->offset;
++              skb_frags[i].page_offset = page_alloc->offset;
+               page_alloc->page = page;
+               page_alloc->offset = frag_info->frag_align;
+       } else {
+@@ -69,11 +69,11 @@ static int mlx4_en_alloc_frag(struct mlx
+               get_page(page);
+               skb_frags[i].page = page;
+-              skb_frags[i].offset = page_alloc->offset;
++              skb_frags[i].page_offset = page_alloc->offset;
+               page_alloc->offset += frag_info->frag_stride;
+       }
+       dma = pci_map_single(mdev->pdev, page_address(skb_frags[i].page) +
+-                           skb_frags[i].offset, frag_info->frag_size,
++                           skb_frags[i].page_offset, frag_info->frag_size,
+                            PCI_DMA_FROMDEVICE);
+       rx_desc->data[i].addr = cpu_to_be64(dma);
+       return 0;
+@@ -157,8 +157,8 @@ static int mlx4_en_prepare_rx_desc(struc
+                                  struct mlx4_en_rx_ring *ring, int index)
+ {
+       struct mlx4_en_rx_desc *rx_desc = ring->buf + (index * ring->stride);
+-      struct page_frag *skb_frags = ring->rx_info +
+-                                    (index << priv->log_rx_info);
++      struct skb_frag_struct *skb_frags = ring->rx_info +
++                                          (index << priv->log_rx_info);
+       int i;
+       for (i = 0; i < priv->num_frags; i++)
+@@ -183,7 +183,7 @@ static void mlx4_en_free_rx_desc(struct
+                                int index)
+ {
+       struct mlx4_en_dev *mdev = priv->mdev;
+-      struct page_frag *skb_frags;
++      struct skb_frag_struct *skb_frags;
+       struct mlx4_en_rx_desc *rx_desc = ring->buf + (index << ring->log_stride);
+       dma_addr_t dma;
+       int nr;
+@@ -194,7 +194,7 @@ static void mlx4_en_free_rx_desc(struct
+               dma = be64_to_cpu(rx_desc->data[nr].addr);
+               en_dbg(DRV, priv, "Unmapping buffer at dma:0x%llx\n", (u64) dma);
+-              pci_unmap_single(mdev->pdev, dma, skb_frags[nr].size,
++              pci_unmap_single(mdev->pdev, dma, skb_frag_size(&skb_frags[nr]),
+                                PCI_DMA_FROMDEVICE);
+               put_page(skb_frags[nr].page);
+       }
+@@ -403,7 +403,7 @@ void mlx4_en_deactivate_rx_ring(struct m
+ /* Unmap a completed descriptor and free unused pages */
+ static int mlx4_en_complete_rx_desc(struct mlx4_en_priv *priv,
+                                   struct mlx4_en_rx_desc *rx_desc,
+-                                  struct page_frag *skb_frags,
++                                  struct skb_frag_struct *skb_frags,
+                                   struct sk_buff *skb,
+                                   struct mlx4_en_rx_alloc *page_alloc,
+                                   int length)
+@@ -421,9 +421,9 @@ static int mlx4_en_complete_rx_desc(stru
+                       break;
+               /* Save page reference in skb */
+-              __skb_frag_set_page(&skb_frags_rx[nr], skb_frags[nr].page);
+-              skb_frag_size_set(&skb_frags_rx[nr], skb_frags[nr].size);
+-              skb_frags_rx[nr].page_offset = skb_frags[nr].offset;
++              skb_frags_rx[nr].page = skb_frags[nr].page;
++              skb_frag_size_set(&skb_frags_rx[nr], skb_frag_size(&skb_frags[nr]));
++              skb_frags_rx[nr].page_offset = skb_frags[nr].page_offset;
+               skb->truesize += frag_info->frag_stride;
+               dma = be64_to_cpu(rx_desc->data[nr].addr);
+@@ -446,7 +446,7 @@ fail:
+        * the descriptor) of this packet; remaining fragments are reused... */
+       while (nr > 0) {
+               nr--;
+-              __skb_frag_unref(&skb_frags_rx[nr]);
++              put_page(skb_frags_rx[nr].page);
+       }
+       return 0;
+ }
+@@ -454,7 +454,7 @@ fail:
+ static struct sk_buff *mlx4_en_rx_skb(struct mlx4_en_priv *priv,
+                                     struct mlx4_en_rx_desc *rx_desc,
+-                                    struct page_frag *skb_frags,
++                                    struct skb_frag_struct *skb_frags,
+                                     struct mlx4_en_rx_alloc *page_alloc,
+                                     unsigned int length)
+ {
+@@ -475,7 +475,7 @@ static struct sk_buff *mlx4_en_rx_skb(st
+       /* Get pointer to first fragment so we could copy the headers into the
+        * (linear part of the) skb */
+-      va = page_address(skb_frags[0].page) + skb_frags[0].offset;
++      va = page_address(skb_frags[0].page) + skb_frags[0].page_offset;
+       if (length <= SMALL_PACKET_SIZE) {
+               /* We are copying all relevant data to the skb - temporarily
+@@ -533,7 +533,7 @@ int mlx4_en_process_rx_cq(struct net_dev
+       struct mlx4_en_priv *priv = netdev_priv(dev);
+       struct mlx4_cqe *cqe;
+       struct mlx4_en_rx_ring *ring = &priv->rx_ring[cq->ring];
+-      struct page_frag *skb_frags;
++      struct skb_frag_struct *skb_frags;
+       struct mlx4_en_rx_desc *rx_desc;
+       struct sk_buff *skb;
+       int index;
diff --git a/backports/2.6.32-EL6.2/03-remove-attr_is_visible.patch b/backports/2.6.32-EL6.2/03-remove-attr_is_visible.patch
new file mode 100644 (file)
index 0000000..c05ace7
--- /dev/null
@@ -0,0 +1,14 @@
+Index: compat-rdma/drivers/infiniband/ulp/iser/iscsi_iser.c
+===================================================================
+--- compat-rdma.orig/drivers/infiniband/ulp/iser/iscsi_iser.c
++++ compat-rdma/drivers/infiniband/ulp/iser/iscsi_iser.c
+@@ -719,7 +719,9 @@ static struct iscsi_transport iscsi_iser
+       .create_conn            = iscsi_iser_conn_create,
+       .bind_conn              = iscsi_iser_conn_bind,
+       .destroy_conn           = iscsi_iser_conn_destroy,
++#if (LINUX_VERSION_CODE > KERNEL_VERSION(3,2,0))
+       .attr_is_visible        = iser_attr_is_visible,
++#endif
+       .set_param              = iscsi_iser_set_param,
+       .get_conn_param         = iscsi_conn_get_param,
+       .get_ep_param           = iscsi_iser_get_ep_param,
diff --git a/backports/2.6.32-EL6.2/04-ib-core-Add-RHEL6.2-backports.patch b/backports/2.6.32-EL6.2/04-ib-core-Add-RHEL6.2-backports.patch
new file mode 100644 (file)
index 0000000..ae881d8
--- /dev/null
@@ -0,0 +1,332 @@
+From 9e60fe057cb38b467dfbac003175644519920cac Mon Sep 17 00:00:00 2001
+From: Vladimir Sokolovsky <vlad@mellanox.com>
+Date: Fri, 23 Mar 2012 21:21:06 +0200
+Subject: [PATCH] ib/core: Add RHEL6.2 backports
+
+Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.com>
+---
+ include/rdma/ib_addr.h                |    1 +
+ drivers/infiniband/core/addr.c        |   42 ++++++++++++++++----------------
+ drivers/infiniband/core/mad.c         |   19 ++++++++++++--
+ drivers/infiniband/core/netlink.c     |   10 ++++---
+ drivers/infiniband/core/sysfs.c       |    1 -
+ drivers/infiniband/core/ucm.c         |   13 ++++++----
+ drivers/infiniband/core/user_mad.c    |    9 ++++--
+ drivers/infiniband/core/uverbs_main.c |    9 ++++--
+ 8 files changed, 64 insertions(+), 40 deletions(-)
+
+diff --git a/include/rdma/ib_addr.h b/include/rdma/ib_addr.h
+index 639a449..a040c9c 100644
+--- a/include/rdma/ib_addr.h
++++ b/include/rdma/ib_addr.h
+@@ -40,6 +40,7 @@
+ #include <linux/netdevice.h>
+ #include <linux/socket.h>
+ #include <linux/if_vlan.h>
++#include <linux/rtnetlink.h>
+ #include <rdma/ib_verbs.h>
+ #include <rdma/ib_pack.h>
+
+diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c
+index e9cf51b..f72272c 100644
+--- a/drivers/infiniband/core/addr.c
++++ b/drivers/infiniband/core/addr.c
+@@ -186,22 +186,22 @@ static int addr4_resolve(struct sockaddr_in *src_in,
+       __be32 dst_ip = dst_in->sin_addr.s_addr;
+       struct rtable *rt;
+       struct neighbour *neigh;
+-      struct flowi4 fl4;
++      struct flowi fl;
+       int ret;
+-      memset(&fl4, 0, sizeof(fl4));
+-      fl4.daddr = dst_ip;
+-      fl4.saddr = src_ip;
+-      fl4.flowi4_oif = addr->bound_dev_if;
+-      rt = ip_route_output_key(&init_net, &fl4);
++      memset(&fl, 0, sizeof(fl));
++      fl.nl_u.ip4_u.daddr = dst_ip;
++      fl.nl_u.ip4_u.saddr = src_ip;
++      fl.oif = addr->bound_dev_if;
++      ret = ip_route_output_key(&init_net, &rt, &fl);
+       if (IS_ERR(rt)) {
+               ret = PTR_ERR(rt);
+               goto out;
+       }
+       src_in->sin_family = AF_INET;
+-      src_in->sin_addr.s_addr = fl4.saddr;
++      src_in->sin_addr.s_addr = src_ip;
+-      if (rt->dst.dev->flags & IFF_LOOPBACK) {
++      if (rt->idev->dev->flags & IFF_LOOPBACK) {
+               ret = rdma_translate_ip((struct sockaddr *) dst_in, addr);
+               if (!ret)
+                       memcpy(addr->dst_dev_addr, addr->src_dev_addr, MAX_ADDR_LEN);
+@@ -209,15 +209,15 @@ static int addr4_resolve(struct sockaddr_in *src_in,
+       }
+       /* If the device does ARP internally, return 'done' */
+-      if (rt->dst.dev->flags & IFF_NOARP) {
+-              ret = rdma_copy_addr(addr, rt->dst.dev, NULL);
++      if (rt->idev->dev->flags & IFF_NOARP) {
++              ret = rdma_copy_addr(addr, rt->idev->dev, NULL);
+               goto put;
+       }
+-      neigh = neigh_lookup(&arp_tbl, &rt->rt_gateway, rt->dst.dev);
++      neigh = neigh_lookup(&arp_tbl, &rt->rt_gateway, rt->idev->dev);
+       if (!neigh || !(neigh->nud_state & NUD_VALID)) {
+               rcu_read_lock();
+-              neigh_event_send(dst_get_neighbour(&rt->dst), NULL);
++              neigh_event_send(rt->u.dst.neighbour, NULL);
+               rcu_read_unlock();
+               ret = -ENODATA;
+               if (neigh)
+@@ -239,28 +239,28 @@ static int addr6_resolve(struct sockaddr_in6 *src_in,
+                        struct sockaddr_in6 *dst_in,
+                        struct rdma_dev_addr *addr)
+ {
+-      struct flowi6 fl6;
++      struct flowi fl;
+       struct neighbour *neigh;
+       struct dst_entry *dst;
+       int ret;
+-      memset(&fl6, 0, sizeof fl6);
+-      ipv6_addr_copy(&fl6.daddr, &dst_in->sin6_addr);
+-      ipv6_addr_copy(&fl6.saddr, &src_in->sin6_addr);
+-      fl6.flowi6_oif = addr->bound_dev_if;
++      memset(&fl, 0, sizeof fl);
++      ipv6_addr_copy(&fl.fl6_dst, &dst_in->sin6_addr);
++      ipv6_addr_copy(&fl.fl6_src, &src_in->sin6_addr);
++      fl.oif = addr->bound_dev_if;
+-      dst = ip6_route_output(&init_net, NULL, &fl6);
++      dst = ip6_route_output(&init_net, NULL, &fl);
+       if ((ret = dst->error))
+               goto put;
+-      if (ipv6_addr_any(&fl6.saddr)) {
++      if (ipv6_addr_any(&fl.fl6_src)) {
+               ret = ipv6_dev_get_saddr(&init_net, ip6_dst_idev(dst)->dev,
+-                                       &fl6.daddr, 0, &fl6.saddr);
++                                       &fl.fl6_dst, 0, &fl.fl6_src);
+               if (ret)
+                       goto put;
+               src_in->sin6_family = AF_INET6;
+-              ipv6_addr_copy(&src_in->sin6_addr, &fl6.saddr);
++              ipv6_addr_copy(&src_in->sin6_addr, &fl.fl6_src);
+       }
+       if (dst->dev->flags & IFF_LOOPBACK) {
+diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c
+index 2fe428b..a8a769d 100644
+--- a/drivers/infiniband/core/mad.c
++++ b/drivers/infiniband/core/mad.c
+@@ -1200,7 +1200,10 @@ static int method_in_use(struct ib_mad_mgmt_method_table **method,
+ {
+       int i;
+-      for_each_set_bit(i, mad_reg_req->method_mask, IB_MGMT_MAX_METHODS) {
++      for (i = find_first_bit(mad_reg_req->method_mask, IB_MGMT_MAX_METHODS);
++           i < IB_MGMT_MAX_METHODS;
++           i = find_next_bit(mad_reg_req->method_mask, IB_MGMT_MAX_METHODS,
++                             1+i)) {
+               if ((*method)->agent[i]) {
+                       printk(KERN_ERR PFX "Method %d already in use\n", i);
+                       return -EINVAL;
+@@ -1334,8 +1337,13 @@ static int add_nonoui_reg_req(struct ib_mad_reg_req *mad_reg_req,
+               goto error3;
+       /* Finally, add in methods being registered */
+-      for_each_set_bit(i, mad_reg_req->method_mask, IB_MGMT_MAX_METHODS)
++      for (i = find_first_bit(mad_reg_req->method_mask,
++                              IB_MGMT_MAX_METHODS);
++           i < IB_MGMT_MAX_METHODS;
++           i = find_next_bit(mad_reg_req->method_mask, IB_MGMT_MAX_METHODS,
++                             1+i)) {
+               (*method)->agent[i] = agent_priv;
++      }
+       return 0;
+@@ -1429,8 +1437,13 @@ check_in_use:
+               goto error4;
+       /* Finally, add in methods being registered */
+-      for_each_set_bit(i, mad_reg_req->method_mask, IB_MGMT_MAX_METHODS)
++      for (i = find_first_bit(mad_reg_req->method_mask,
++                              IB_MGMT_MAX_METHODS);
++           i < IB_MGMT_MAX_METHODS;
++           i = find_next_bit(mad_reg_req->method_mask, IB_MGMT_MAX_METHODS,
++                             1+i)) {
+               (*method)->agent[i] = agent_priv;
++      }
+       return 0;
+diff --git a/drivers/infiniband/core/netlink.c b/drivers/infiniband/core/netlink.c
+index d1c8196..3e62f8b 100644
+--- a/drivers/infiniband/core/netlink.c
++++ b/drivers/infiniband/core/netlink.c
+@@ -30,7 +30,9 @@
+  * SOFTWARE.
+  */
++#ifndef pr_fmt
+ #define pr_fmt(fmt) "%s:%s: " fmt, KBUILD_MODNAME, __func__
++#endif
+ #include <linux/export.h>
+ #include <net/netlink.h>
+@@ -67,7 +69,7 @@ int ibnl_add_client(int index, int nops,
+       list_for_each_entry(cur, &client_list, list) {
+               if (cur->index == index) {
+-                      pr_warn("Client for %d already exists\n", index);
++                      printk("Client for %d already exists\n", index);
+                       mutex_unlock(&ibnl_mutex);
+                       kfree(nl_client);
+                       return -EINVAL;
+@@ -95,7 +97,7 @@ int ibnl_remove_client(int index)
+                       return 0;
+               }
+       }
+-      pr_warn("Can't remove callback for client idx %d. Not found\n", index);
++      printk("Can't remove callback for client idx %d. Not found\n", index);
+       mutex_unlock(&ibnl_mutex);
+       return -EINVAL;
+@@ -149,7 +151,7 @@ static int ibnl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
+                               return -EINVAL;
+                       return netlink_dump_start(nls, skb, nlh,
+                                                 client->cb_table[op].dump,
+-                                                NULL, 0);
++                                                NULL);
+               }
+       }
+@@ -169,7 +171,7 @@ int __init ibnl_init(void)
+       nls = netlink_kernel_create(&init_net, NETLINK_RDMA, 0, ibnl_rcv,
+                                   NULL, THIS_MODULE);
+       if (!nls) {
+-              pr_warn("Failed to create netlink socket\n");
++              printk("Failed to create netlink socket\n");
+               return -ENOMEM;
+       }
+diff --git a/drivers/infiniband/core/sysfs.c b/drivers/infiniband/core/sysfs.c
+index c61bca3..2b4d2fc 100644
+--- a/drivers/infiniband/core/sysfs.c
++++ b/drivers/infiniband/core/sysfs.c
+@@ -495,7 +495,6 @@ alloc_group_attrs(ssize_t (*show)(struct ib_port *,
+               element->attr.attr.mode  = S_IRUGO;
+               element->attr.show       = show;
+               element->index           = i;
+-              sysfs_attr_init(&element->attr.attr);
+               tab_attr[i] = &element->attr.attr;
+       }
+diff --git a/drivers/infiniband/core/ucm.c b/drivers/infiniband/core/ucm.c
+index b8a0b4a..d249a44 100644
+--- a/drivers/infiniband/core/ucm.c
++++ b/drivers/infiniband/core/ucm.c
+@@ -1333,8 +1333,11 @@ static void ib_ucm_remove_one(struct ib_device *device)
+       device_unregister(&ucm_dev->dev);
+ }
+-static CLASS_ATTR_STRING(abi_version, S_IRUGO,
+-                       __stringify(IB_USER_CM_ABI_VERSION));
++static ssize_t show_abi_version(struct class *class, char *buf)
++{
++      return sprintf(buf, "%d\n", IB_USER_CM_ABI_VERSION);
++}
++static CLASS_ATTR(abi_version, S_IRUGO, show_abi_version, NULL);
+ static int __init ib_ucm_init(void)
+ {
+@@ -1347,7 +1350,7 @@ static int __init ib_ucm_init(void)
+               goto error1;
+       }
+-      ret = class_create_file(&cm_class, &class_attr_abi_version.attr);
++      ret = class_create_file(&cm_class, &class_attr_abi_version);
+       if (ret) {
+               printk(KERN_ERR "ucm: couldn't create abi_version attribute\n");
+               goto error2;
+@@ -1361,7 +1364,7 @@ static int __init ib_ucm_init(void)
+       return 0;
+ error3:
+-      class_remove_file(&cm_class, &class_attr_abi_version.attr);
++      class_remove_file(&cm_class, &class_attr_abi_version);
+ error2:
+       unregister_chrdev_region(IB_UCM_BASE_DEV, IB_UCM_MAX_DEVICES);
+ error1:
+@@ -1371,7 +1374,7 @@ error1:
+ static void __exit ib_ucm_cleanup(void)
+ {
+       ib_unregister_client(&ucm_client);
+-      class_remove_file(&cm_class, &class_attr_abi_version.attr);
++      class_remove_file(&cm_class, &class_attr_abi_version);
+       unregister_chrdev_region(IB_UCM_BASE_DEV, IB_UCM_MAX_DEVICES);
+       if (overflow_maj)
+               unregister_chrdev_region(overflow_maj, IB_UCM_MAX_DEVICES);
+diff --git a/drivers/infiniband/core/user_mad.c b/drivers/infiniband/core/user_mad.c
+index 07db229..2fc66f0 100644
+--- a/drivers/infiniband/core/user_mad.c
++++ b/drivers/infiniband/core/user_mad.c
+@@ -969,8 +969,11 @@ static ssize_t show_port(struct device *dev, struct device_attribute *attr,
+ }
+ static DEVICE_ATTR(port, S_IRUGO, show_port, NULL);
+-static CLASS_ATTR_STRING(abi_version, S_IRUGO,
+-                       __stringify(IB_USER_MAD_ABI_VERSION));
++static ssize_t show_abi_version(struct class *class, char *buf)
++{
++      return sprintf(buf, "%d\n", IB_USER_MAD_ABI_VERSION);
++}
++static CLASS_ATTR(abi_version, S_IRUGO, show_abi_version, NULL);
+ static dev_t overflow_maj;
+ static DECLARE_BITMAP(overflow_map, IB_UMAD_MAX_PORTS);
+@@ -1200,7 +1203,7 @@ static int __init ib_umad_init(void)
+       umad_class->devnode = umad_devnode;
+-      ret = class_create_file(umad_class, &class_attr_abi_version.attr);
++      ret = class_create_file(umad_class, &class_attr_abi_version);
+       if (ret) {
+               printk(KERN_ERR "user_mad: couldn't create abi_version attribute\n");
+               goto out_class;
+diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c
+index 8796367..9ce0700 100644
+--- a/drivers/infiniband/core/uverbs_main.c
++++ b/drivers/infiniband/core/uverbs_main.c
+@@ -715,8 +715,11 @@ static ssize_t show_dev_abi_version(struct device *device,
+ }
+ static DEVICE_ATTR(abi_version, S_IRUGO, show_dev_abi_version, NULL);
+-static CLASS_ATTR_STRING(abi_version, S_IRUGO,
+-                       __stringify(IB_USER_VERBS_ABI_VERSION));
++static ssize_t show_abi_version(struct class *class, char *buf)
++{
++      return sprintf(buf, "%d\n", IB_USER_VERBS_ABI_VERSION);
++}
++static CLASS_ATTR(abi_version, S_IRUGO, show_abi_version, NULL);
+ static dev_t overflow_maj;
+ static DECLARE_BITMAP(overflow_map, IB_UVERBS_MAX_DEVICES);
+@@ -873,7 +876,7 @@ static int __init ib_uverbs_init(void)
+       uverbs_class->devnode = uverbs_devnode;
+-      ret = class_create_file(uverbs_class, &class_attr_abi_version.attr);
++      ret = class_create_file(uverbs_class, &class_attr_abi_version);
+       if (ret) {
+               printk(KERN_ERR "user_verbs: couldn't create abi_version attribute\n");
+               goto out_class;
+-- 
+1.5.4.3
+
diff --git a/backports/2.6.32-EL6.2/05-ipoib-Add-RHEL6.2-backports.patch b/backports/2.6.32-EL6.2/05-ipoib-Add-RHEL6.2-backports.patch
new file mode 100644 (file)
index 0000000..406e7b8
--- /dev/null
@@ -0,0 +1,167 @@
+From d351f953e3bc99e834b820702d7e121e153ada70 Mon Sep 17 00:00:00 2001
+From: Vladimir Sokolovsky <vlad@mellanox.com>
+Date: Fri, 23 Mar 2012 21:30:36 +0200
+Subject: [PATCH] ipoib: Add RHEL6.2 backports
+
+Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.com>
+---
+ drivers/infiniband/ulp/ipoib/ipoib.h           |    1 +
+ drivers/infiniband/ulp/ipoib/ipoib_cm.c        |   17 +++++++++++++----
+ drivers/infiniband/ulp/ipoib/ipoib_main.c      |   17 ++---------------
+ drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   11 ++++++-----
+ 4 files changed, 22 insertions(+), 24 deletions(-)
+
+diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h
+index b3cc1e0..c89fb6c 100644
+--- a/drivers/infiniband/ulp/ipoib/ipoib.h
++++ b/drivers/infiniband/ulp/ipoib/ipoib.h
+@@ -91,6 +91,7 @@ enum {
+       IPOIB_STOP_REAPER         = 7,
+       IPOIB_FLAG_ADMIN_CM       = 9,
+       IPOIB_FLAG_UMCAST         = 10,
++      IPOIB_FLAG_CSUM           = 11,
+       IPOIB_MAX_BACKOFF_SECONDS = 16,
+diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+index 014504d..d9f2eaf 100644
+--- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
++++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+@@ -1097,12 +1097,13 @@ static int ipoib_cm_tx_init(struct ipoib_cm_tx *p, u32 qpn,
+       struct ipoib_dev_priv *priv = netdev_priv(p->dev);
+       int ret;
+-      p->tx_ring = vzalloc(ipoib_sendq_size * sizeof *p->tx_ring);
++      p->tx_ring = vmalloc(ipoib_sendq_size * sizeof *p->tx_ring);
+       if (!p->tx_ring) {
+               ipoib_warn(priv, "failed to allocate tx ring\n");
+               ret = -ENOMEM;
+               goto err_tx;
+       }
++      memset(p->tx_ring, 0, ipoib_sendq_size * sizeof *p->tx_ring);
+       p->qp = ipoib_cm_create_tx_qp(p->dev, p);
+       if (IS_ERR(p->qp)) {
+@@ -1378,7 +1379,7 @@ static void ipoib_cm_skb_reap(struct work_struct *work)
+                       icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu));
+ #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+               else if (skb->protocol == htons(ETH_P_IPV6))
+-                      icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
++                      icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, priv->dev);
+ #endif
+               dev_kfree_skb_any(skb);
+@@ -1465,7 +1466,11 @@ static ssize_t set_mode(struct device *d, struct device_attribute *attr,
+               set_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
+               ipoib_warn(priv, "enabling connected mode "
+                          "will cause multicast packet drops\n");
+-              netdev_update_features(dev);
++              dev->features &= ~(NETIF_F_IP_CSUM | NETIF_F_SG | NETIF_F_TSO);
++              if (ipoib_cm_max_mtu(dev) > priv->mcast_mtu)
++                      ipoib_warn(priv, "mtu > %d will cause multicast packet drops.\n",
++                                 priv->mcast_mtu);
++              dev_set_mtu(dev, ipoib_cm_max_mtu(dev));
+               rtnl_unlock();
+               priv->tx_wr.send_flags &= ~IB_SEND_IP_CSUM;
+@@ -1475,7 +1480,11 @@ static ssize_t set_mode(struct device *d, struct device_attribute *attr,
+       if (!strcmp(buf, "datagram\n")) {
+               clear_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
+-              netdev_update_features(dev);
++              if (test_bit(IPOIB_FLAG_CSUM, &priv->flags)) {
++                      dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG;
++                      if (priv->hca_caps & IB_DEVICE_UD_TSO)
++                              dev->features |= NETIF_F_TSO;
++              }
+               dev_set_mtu(dev, min(priv->mcast_mtu, dev->mtu));
+               rtnl_unlock();
+               ipoib_flush_paths(dev);
+diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
+index 83695b4..4f77a5a 100644
+--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
++++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
+@@ -171,16 +171,6 @@ static int ipoib_stop(struct net_device *dev)
+       return 0;
+ }
+-static u32 ipoib_fix_features(struct net_device *dev, u32 features)
+-{
+-      struct ipoib_dev_priv *priv = netdev_priv(dev);
+-
+-      if (test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags))
+-              features &= ~(NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO);
+-
+-      return features;
+-}
+-
+ static int ipoib_change_mtu(struct net_device *dev, int new_mtu)
+ {
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+@@ -999,7 +989,6 @@ static const struct net_device_ops ipoib_netdev_ops = {
+       .ndo_open                = ipoib_open,
+       .ndo_stop                = ipoib_stop,
+       .ndo_change_mtu          = ipoib_change_mtu,
+-      .ndo_fix_features        = ipoib_fix_features,
+       .ndo_start_xmit          = ipoib_start_xmit,
+       .ndo_tx_timeout          = ipoib_timeout,
+       .ndo_set_rx_mode         = ipoib_set_mcast_list,
+@@ -1184,13 +1173,11 @@ int ipoib_set_dev_features(struct ipoib_dev_priv *priv, struct ib_device *hca)
+       kfree(device_attr);
+       if (priv->hca_caps & IB_DEVICE_UD_IP_CSUM) {
+-              priv->dev->hw_features = NETIF_F_SG |
++              priv->dev->features = NETIF_F_SG |
+                       NETIF_F_IP_CSUM | NETIF_F_RXCSUM;
+               if (priv->hca_caps & IB_DEVICE_UD_TSO)
+-                      priv->dev->hw_features |= NETIF_F_TSO;
+-
+-              priv->dev->features |= priv->dev->hw_features;
++                      priv->dev->features |= NETIF_F_TSO;
+       }
+       return 0;
+diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+index 873bff9..411c544 100644
+--- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
++++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+@@ -269,7 +269,7 @@ static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast,
+               skb->dev = dev;
+               if (dst)
+-                      n = dst_get_neighbour_raw(dst);
++                      n = dst->neighbour;
+               if (!dst || !n) {
+                       /* put pseudoheader back on for next time */
+                       skb_push(skb, sizeof (struct ipoib_pseudoheader));
+@@ -796,7 +796,7 @@ void ipoib_mcast_restart_task(struct work_struct *work)
+       struct ipoib_dev_priv *priv =
+               container_of(work, struct ipoib_dev_priv, restart_task);
+       struct net_device *dev = priv->dev;
+-      struct netdev_hw_addr *ha;
++      struct dev_mc_list *mclist;
+       struct ipoib_mcast *mcast, *tmcast;
+       LIST_HEAD(remove_list);
+       unsigned long flags;
+@@ -821,13 +821,14 @@ void ipoib_mcast_restart_task(struct work_struct *work)
+               clear_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags);
+       /* Mark all of the entries that are found or don't exist */
+-      netdev_for_each_mc_addr(ha, dev) {
++      for (mclist = dev->mc_list; mclist; mclist = mclist->next) {
+               union ib_gid mgid;
+-              if (!ipoib_mcast_addr_is_valid(ha->addr, dev->broadcast))
++              if (!ipoib_mcast_addr_is_valid(mclist->dmi_addr,
++                                             dev->broadcast))
+                       continue;
+-              memcpy(mgid.raw, ha->addr + 4, sizeof mgid);
++              memcpy(mgid.raw, mclist->dmi_addr + 4, sizeof mgid);
+               mcast = __ipoib_mcast_find(dev, &mgid);
+               if (!mcast || test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) {
+-- 
+1.5.4.3
+
diff --git a/backports/2.6.32-EL6.2/06-mlx4_en-Add-RHEL6.2-backports.patch b/backports/2.6.32-EL6.2/06-mlx4_en-Add-RHEL6.2-backports.patch
new file mode 100644 (file)
index 0000000..c710ff7
--- /dev/null
@@ -0,0 +1,172 @@
+From ac7e5469789da2ef1aa24cf1f28c23a0d630a294 Mon Sep 17 00:00:00 2001
+From: Vladimir Sokolovsky <vlad@mellanox.com>
+Date: Fri, 23 Mar 2012 21:34:13 +0200
+Subject: [PATCH] mlx4_en: Add RHEL6.2 backports
+
+Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.com>
+---
+ drivers/net/ethernet/mellanox/mlx4/en_netdev.c |   71 ++++++++++++++----------
+ drivers/net/ethernet/mellanox/mlx4/mlx4_en.h   |    3 +-
+ 2 files changed, 42 insertions(+), 32 deletions(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+index 78d776b..776475d 100644
+--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
++++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+@@ -146,29 +146,40 @@ static void mlx4_en_do_set_mac(struct work_struct *work)
+ static void mlx4_en_clear_list(struct net_device *dev)
+ {
+       struct mlx4_en_priv *priv = netdev_priv(dev);
++      struct dev_mc_list *plist = priv->mc_list;
++      struct dev_mc_list *next;
+-      kfree(priv->mc_addrs);
+-      priv->mc_addrs_cnt = 0;
++      while (plist) {
++              next = plist->next;
++              kfree(plist);
++              plist = next;
++      }
++      priv->mc_list = NULL;
+ }
+ static void mlx4_en_cache_mclist(struct net_device *dev)
+ {
+       struct mlx4_en_priv *priv = netdev_priv(dev);
+-      struct netdev_hw_addr *ha;
+-      char *mc_addrs;
+-      int mc_addrs_cnt = netdev_mc_count(dev);
+-      int i;
+-
+-      mc_addrs = kmalloc(mc_addrs_cnt * ETH_ALEN, GFP_ATOMIC);
+-      if (!mc_addrs) {
+-              en_err(priv, "failed to allocate multicast list\n");
+-              return;
++      struct dev_mc_list *mclist;
++      struct dev_mc_list *tmp;
++      struct dev_mc_list *plist = NULL;
++
++      mlx4_en_clear_list(dev);
++      for (mclist = dev->mc_list; mclist; mclist = mclist->next) {
++              tmp = kmalloc(sizeof(struct dev_mc_list), GFP_ATOMIC);
++              if (!tmp) {
++                      en_err(priv, "failed to allocate multicast list\n");
++                      mlx4_en_clear_list(dev);
++                      return;
++              }
++              memcpy(tmp, mclist, sizeof(struct dev_mc_list));
++              tmp->next = NULL;
++              if (plist)
++                      plist->next = tmp;
++              else
++                      priv->mc_list = tmp;
++              plist = tmp;
+       }
+-      i = 0;
+-      netdev_for_each_mc_addr(ha, dev)
+-              memcpy(mc_addrs + i++ * ETH_ALEN, ha->addr, ETH_ALEN);
+-      priv->mc_addrs = mc_addrs;
+-      priv->mc_addrs_cnt = mc_addrs_cnt;
+ }
+@@ -188,6 +199,7 @@ static void mlx4_en_do_set_multicast(struct work_struct *work)
+                                                mcast_task);
+       struct mlx4_en_dev *mdev = priv->mdev;
+       struct net_device *dev = priv->dev;
++      struct dev_mc_list *mclist;
+       u64 mcast_addr = 0;
+       u8 mc_list[16] = {0};
+       int err;
+@@ -300,7 +312,6 @@ static void mlx4_en_do_set_multicast(struct work_struct *work)
+                       priv->flags |= MLX4_EN_FLAG_MC_PROMISC;
+               }
+       } else {
+-              int i;
+               /* Disable Multicast promisc */
+               if (priv->flags & MLX4_EN_FLAG_MC_PROMISC) {
+                       err = mlx4_multicast_promisc_remove(mdev->dev, priv->base_qpn,
+@@ -316,8 +327,8 @@ static void mlx4_en_do_set_multicast(struct work_struct *work)
+                       en_err(priv, "Failed disabling multicast filter\n");
+               /* Detach our qp from all the multicast addresses */
+-              for (i = 0; i < priv->mc_addrs_cnt; i++) {
+-                      memcpy(&mc_list[10], priv->mc_addrs + i * ETH_ALEN, ETH_ALEN);
++              for (mclist = priv->mc_list; mclist; mclist = mclist->next) {
++                      memcpy(&mc_list[10], mclist->dmi_addr, ETH_ALEN);
+                       mc_list[5] = priv->port;
+                       mlx4_multicast_detach(mdev->dev, &priv->rss_map.indir_qp,
+                                             mc_list, MLX4_PROT_ETH);
+@@ -331,13 +342,12 @@ static void mlx4_en_do_set_multicast(struct work_struct *work)
+               netif_tx_lock_bh(dev);
+               mlx4_en_cache_mclist(dev);
+               netif_tx_unlock_bh(dev);
+-              for (i = 0; i < priv->mc_addrs_cnt; i++) {
+-                      mcast_addr =
+-                            mlx4_en_mac_to_u64(priv->mc_addrs + i * ETH_ALEN);
+-                      memcpy(&mc_list[10], priv->mc_addrs + i * ETH_ALEN, ETH_ALEN);
++              for (mclist = priv->mc_list; mclist; mclist = mclist->next) {
++                      memcpy(&mc_list[10], mclist->dmi_addr, ETH_ALEN);
+                       mc_list[5] = priv->port;
+                       mlx4_multicast_attach(mdev->dev, &priv->rss_map.indir_qp,
+                                             mc_list, 0, MLX4_PROT_ETH);
++                      mcast_addr = mlx4_en_mac_to_u64(mclist->dmi_addr);
+                       mlx4_SET_MCAST_FLTR(mdev->dev, priv->port,
+                                           mcast_addr, 0, MLX4_MCAST_CONFIG);
+               }
+@@ -714,6 +724,7 @@ void mlx4_en_stop_port(struct net_device *dev)
+ {
+       struct mlx4_en_priv *priv = netdev_priv(dev);
+       struct mlx4_en_dev *mdev = priv->mdev;
++      struct dev_mc_list *mclist;
+       int i;
+       u8 mc_list[16] = {0};
+@@ -735,8 +746,8 @@ void mlx4_en_stop_port(struct net_device *dev)
+       mc_list[5] = priv->port;
+       mlx4_multicast_detach(mdev->dev, &priv->rss_map.indir_qp, mc_list,
+                             MLX4_PROT_ETH);
+-      for (i = 0; i < priv->mc_addrs_cnt; i++) {
+-              memcpy(&mc_list[10], priv->mc_addrs + i * ETH_ALEN, ETH_ALEN);
++      for (mclist = priv->mc_list; mclist; mclist = mclist->next) {
++              memcpy(&mc_list[10], mclist->dmi_addr, ETH_ALEN);
+               mc_list[5] = priv->port;
+               mlx4_multicast_detach(mdev->dev, &priv->rss_map.indir_qp,
+                                     mc_list, MLX4_PROT_ETH);
+@@ -1078,14 +1089,14 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
+       /*
+        * Set driver features
+        */
+-      dev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
++      dev->features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
+       if (mdev->LSO_support)
+-              dev->hw_features |= NETIF_F_TSO | NETIF_F_TSO6;
++              dev->features |= NETIF_F_TSO | NETIF_F_TSO6;
+-      dev->vlan_features = dev->hw_features;
++      dev->vlan_features = dev->features;
+-      dev->hw_features |= NETIF_F_RXCSUM | NETIF_F_RXHASH;
+-      dev->features = dev->hw_features | NETIF_F_HIGHDMA |
++      dev->features |= NETIF_F_RXCSUM | NETIF_F_RXHASH |
++                      NETIF_F_HIGHDMA |
+                       NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX |
+                       NETIF_F_HW_VLAN_FILTER;
+diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
+index 207b5ad..6b99109 100644
+--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
++++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
+@@ -485,8 +485,7 @@ struct mlx4_en_priv {
+       struct mlx4_en_perf_stats pstats;
+       struct mlx4_en_pkt_stats pkstats;
+       struct mlx4_en_port_stats port_stats;
+-      char *mc_addrs;
+-      int mc_addrs_cnt;
++      struct dev_mc_list *mc_list;
+       struct mlx4_en_stat_out_mbox hw_stats;
+       int vids[128];
+       bool wol;
+-- 
+1.5.4.3
+
diff --git a/backports/2.6.32-EL6.2/07-mlx4_ib-Add-RHEL6.2-backports.patch b/backports/2.6.32-EL6.2/07-mlx4_ib-Add-RHEL6.2-backports.patch
new file mode 100644 (file)
index 0000000..c445866
--- /dev/null
@@ -0,0 +1,35 @@
+From 06357ad55ed41358be53d656451721d7df6eac6e Mon Sep 17 00:00:00 2001
+From: Vladimir Sokolovsky <vlad@mellanox.com>
+Date: Fri, 23 Mar 2012 21:34:39 +0200
+Subject: [PATCH] mlx4_ib: Add RHEL6.2 backports
+
+Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.com>
+---
+ drivers/infiniband/hw/mlx4/main.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c
+index 18836cd..c12c292 100644
+--- a/drivers/infiniband/hw/mlx4/main.c
++++ b/drivers/infiniband/hw/mlx4/main.c
+@@ -698,7 +698,7 @@ int mlx4_ib_add_mc(struct mlx4_ib_dev *mdev, struct mlx4_ib_qp *mqp,
+       if (ndev) {
+               rdma_get_mcast_mac((struct in6_addr *)gid, mac);
+               rtnl_lock();
+-              dev_mc_add(mdev->iboe.netdevs[mqp->port - 1], mac);
++              dev_mc_add(mdev->iboe.netdevs[mqp->port - 1], mac, 6, 0);
+               ret = 1;
+               rtnl_unlock();
+               dev_put(ndev);
+@@ -771,7 +771,7 @@ static int mlx4_ib_mcg_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid)
+               rdma_get_mcast_mac((struct in6_addr *)gid, mac);
+               if (ndev) {
+                       rtnl_lock();
+-                      dev_mc_del(mdev->iboe.netdevs[ge->port - 1], mac);
++                      dev_mc_delete(mdev->iboe.netdevs[ge->port - 1], mac, 6, 0);
+                       rtnl_unlock();
+                       dev_put(ndev);
+               }
+-- 
+1.5.4.3
+
diff --git a/backports/2.6.32-EL6.2/08-rds-Add-RHEL6.2-backports.patch b/backports/2.6.32-EL6.2/08-rds-Add-RHEL6.2-backports.patch
new file mode 100644 (file)
index 0000000..cbdc675
--- /dev/null
@@ -0,0 +1,39 @@
+From 7fcb2f5260095d495a96f53642e593e023a9a9b6 Mon Sep 17 00:00:00 2001
+From: Vladimir Sokolovsky <vlad@mellanox.com>
+Date: Fri, 23 Mar 2012 21:36:27 +0200
+Subject: [PATCH] rds: Add RHEL6.2 backports
+
+Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.com>
+---
+ net/rds/tcp_listen.c |    9 +++++++++
+ 1 files changed, 9 insertions(+), 0 deletions(-)
+
+diff --git a/net/rds/tcp_listen.c b/net/rds/tcp_listen.c
+index 8b5cc4a..4c5ab88 100644
+--- a/net/rds/tcp_listen.c
++++ b/net/rds/tcp_listen.c
+@@ -67,12 +67,21 @@ static int rds_tcp_accept_one(struct socket *sock)
+       inet = inet_sk(new_sock->sk);
++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,32))
+       rdsdebug("accepted tcp %pI4:%u -> %pI4:%u\n",
+                &inet->inet_saddr, ntohs(inet->inet_sport),
+                &inet->inet_daddr, ntohs(inet->inet_dport));
+       conn = rds_conn_create(inet->inet_saddr, inet->inet_daddr,
+                              &rds_tcp_transport, GFP_KERNEL);
++#else
++      rdsdebug("accepted tcp %pI4:%u -> %pI4:%u\n",
++               &inet->saddr, ntohs(inet->sport),
++               &inet->daddr, ntohs(inet->dport));
++
++      conn = rds_conn_create(inet->saddr, inet->daddr,
++                             &rds_tcp_transport, GFP_KERNEL);
++#endif
+       if (IS_ERR(conn)) {
+               ret = PTR_ERR(conn);
+               goto out;
+-- 
+1.5.4.3
+