From: Vladimir Sokolovsky Date: Fri, 23 Mar 2012 20:47:51 +0000 (+0200) Subject: Add RHEL6.2 backports X-Git-Tag: vofed-3.5-x~96 X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=8afafc8024e50150c9e24c583160114adf7cd010;p=~emulex%2Ffor-vlad%2Fcompat-rdma.git Add RHEL6.2 backports Signed-off-by: Vladimir Sokolovsky --- 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 index 0000000..5875c2b --- /dev/null +++ b/backports/2.6.32-EL6.2/01-pinned_to_locked_vm_to_3_1.patch @@ -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(¤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); + } + } 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 index 0000000..1c44fc4 --- /dev/null +++ b/backports/2.6.32-EL6.2/02-remove-SKB-paged-frag-API.patch @@ -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 index 0000000..c05ace7 --- /dev/null +++ b/backports/2.6.32-EL6.2/03-remove-attr_is_visible.patch @@ -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 index 0000000..ae881d8 --- /dev/null +++ b/backports/2.6.32-EL6.2/04-ib-core-Add-RHEL6.2-backports.patch @@ -0,0 +1,332 @@ +From 9e60fe057cb38b467dfbac003175644519920cac Mon Sep 17 00:00:00 2001 +From: Vladimir Sokolovsky +Date: Fri, 23 Mar 2012 21:21:06 +0200 +Subject: [PATCH] ib/core: Add RHEL6.2 backports + +Signed-off-by: Vladimir Sokolovsky +--- + 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 + #include + #include ++#include + #include + #include + +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 + #include +@@ -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 index 0000000..406e7b8 --- /dev/null +++ b/backports/2.6.32-EL6.2/05-ipoib-Add-RHEL6.2-backports.patch @@ -0,0 +1,167 @@ +From d351f953e3bc99e834b820702d7e121e153ada70 Mon Sep 17 00:00:00 2001 +From: Vladimir Sokolovsky +Date: Fri, 23 Mar 2012 21:30:36 +0200 +Subject: [PATCH] ipoib: Add RHEL6.2 backports + +Signed-off-by: Vladimir Sokolovsky +--- + 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 index 0000000..c710ff7 --- /dev/null +++ b/backports/2.6.32-EL6.2/06-mlx4_en-Add-RHEL6.2-backports.patch @@ -0,0 +1,172 @@ +From ac7e5469789da2ef1aa24cf1f28c23a0d630a294 Mon Sep 17 00:00:00 2001 +From: Vladimir Sokolovsky +Date: Fri, 23 Mar 2012 21:34:13 +0200 +Subject: [PATCH] mlx4_en: Add RHEL6.2 backports + +Signed-off-by: Vladimir Sokolovsky +--- + 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 index 0000000..c445866 --- /dev/null +++ b/backports/2.6.32-EL6.2/07-mlx4_ib-Add-RHEL6.2-backports.patch @@ -0,0 +1,35 @@ +From 06357ad55ed41358be53d656451721d7df6eac6e Mon Sep 17 00:00:00 2001 +From: Vladimir Sokolovsky +Date: Fri, 23 Mar 2012 21:34:39 +0200 +Subject: [PATCH] mlx4_ib: Add RHEL6.2 backports + +Signed-off-by: Vladimir Sokolovsky +--- + 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 index 0000000..cbdc675 --- /dev/null +++ b/backports/2.6.32-EL6.2/08-rds-Add-RHEL6.2-backports.patch @@ -0,0 +1,39 @@ +From 7fcb2f5260095d495a96f53642e593e023a9a9b6 Mon Sep 17 00:00:00 2001 +From: Vladimir Sokolovsky +Date: Fri, 23 Mar 2012 21:36:27 +0200 +Subject: [PATCH] rds: Add RHEL6.2 backports + +Signed-off-by: Vladimir Sokolovsky +--- + 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 +