--- /dev/null
+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(¤t->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(¤t->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(¤t->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(¤t->mm->mmap_sem);
+ }
+ }
--- /dev/null
+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;
--- /dev/null
+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,
--- /dev/null
+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
+
--- /dev/null
+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
+
--- /dev/null
+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
+
--- /dev/null
+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
+
--- /dev/null
+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
+