From: Vladimir Sokolovsky Date: Mon, 27 Oct 2014 15:11:35 +0000 (+0200) Subject: Added backport patches X-Git-Tag: vofed-3.18~99 X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=1dd382f0b18474dc340d25d8b01ea61ce864a4fa;p=~emulex%2Ftmp%2Fcompat-rdma%2F.git Added backport patches Signed-off-by: Vladimir Sokolovsky --- diff --git a/patches/0001-BACKPORT-mlx5.patch b/patches/0001-BACKPORT-mlx5.patch new file mode 100644 index 0000000..b85a8cc --- /dev/null +++ b/patches/0001-BACKPORT-mlx5.patch @@ -0,0 +1,145 @@ +From: Vladimir Sokolovsky +Subject: [PATCH] BACKPORT: mlx5 + +Signed-off-by: Vladimir Sokolovsky +--- + drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 26 ++++++++++++++++++++++++ + drivers/net/ethernet/mellanox/mlx5/core/main.c | 17 +++++++++++++++ + include/linux/mlx5/driver.h | 5 ++++ + 3 files changed, 48 insertions(+), 0 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c +index xxxxxxx..xxxxxxx xxxxxx +--- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c +@@ -512,7 +512,11 @@ static void cmd_work_handler(struct work_struct *work) + lay->status_own = CMD_OWNER_HW; + set_signature(ent, !cmd->checksum_disabled); + dump_command(dev, ent, 1); ++#ifdef HAVE_KTIME_GET_NS + ent->ts1 = ktime_get_ns(); ++#else ++ ktime_get_ts(&ent->ts1); ++#endif + + /* ring doorbell after the descriptor is valid */ + wmb(); +@@ -602,6 +606,9 @@ static int mlx5_cmd_invoke(struct mlx5_core_dev *dev, struct mlx5_cmd_msg *in, + struct mlx5_cmd *cmd = &dev->cmd; + struct mlx5_cmd_work_ent *ent; + struct mlx5_cmd_stats *stats; ++#ifndef HAVE_KTIME_GET_NS ++ ktime_t t1, t2, delta; ++#endif + int err = 0; + s64 ds; + u16 op; +@@ -631,7 +638,14 @@ static int mlx5_cmd_invoke(struct mlx5_core_dev *dev, struct mlx5_cmd_msg *in, + if (err == -ETIMEDOUT) + goto out; + ++#ifdef HAVE_KTIME_GET_NS + ds = ent->ts2 - ent->ts1; ++#else ++ t1 = timespec_to_ktime(ent->ts1); ++ t2 = timespec_to_ktime(ent->ts2); ++ delta = ktime_sub(t2, t1); ++ ds = ktime_to_ns(delta); ++#endif + op = be16_to_cpu(((struct mlx5_inbox_hdr *)in->first.data)->opcode); + if (op < ARRAY_SIZE(cmd->stats)) { + stats = &cmd->stats[op]; +@@ -1095,6 +1109,7 @@ void mlx5_cmd_comp_handler(struct mlx5_core_dev *dev, unsigned long vector) + void *context; + int err; + int i; ++ ktime_t t1, t2, delta; + s64 ds; + struct mlx5_cmd_stats *stats; + unsigned long flags; +@@ -1108,7 +1123,11 @@ void mlx5_cmd_comp_handler(struct mlx5_core_dev *dev, unsigned long vector) + sem = &cmd->pages_sem; + else + sem = &cmd->sem; ++#ifdef HAVE_KTIME_GET_NS + ent->ts2 = ktime_get_ns(); ++#else ++ ktime_get_ts(&ent->ts2); ++#endif + memcpy(ent->out->first.data, ent->lay->out, sizeof(ent->lay->out)); + dump_command(dev, ent, 0); + if (!ent->ret) { +@@ -1122,7 +1141,14 @@ void mlx5_cmd_comp_handler(struct mlx5_core_dev *dev, unsigned long vector) + } + free_ent(cmd, ent->idx); + if (ent->callback) { ++#ifdef HAVE_KTIME_GET_NS + ds = ent->ts2 - ent->ts1; ++#else ++ t1 = timespec_to_ktime(ent->ts1); ++ t2 = timespec_to_ktime(ent->ts2); ++ delta = ktime_sub(t2, t1); ++ ds = ktime_to_ns(delta); ++#endif + if (ent->op < ARRAY_SIZE(cmd->stats)) { + stats = &cmd->stats[ent->op]; + spin_lock_irqsave(&stats->lock, flags); +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c +index xxxxxxx..xxxxxxx xxxxxx +--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c +@@ -210,6 +210,9 @@ static int mlx5_enable_msix(struct mlx5_core_dev *dev) + struct mlx5_eq_table *table = &dev->priv.eq_table; + int num_eqs = 1 << dev->caps.gen.log_max_eq; + int nvec; ++#ifndef HAVE_PCI_ENABLE_MSIX_RANGE ++ int err; ++#endif + int i; + + nvec = dev->caps.gen.num_ports * num_online_cpus() + MLX5_EQ_VEC_COMP_BASE; +@@ -224,12 +227,26 @@ static int mlx5_enable_msix(struct mlx5_core_dev *dev) + for (i = 0; i < nvec; i++) + table->msix_arr[i].entry = i; + ++#ifdef HAVE_PCI_ENABLE_MSIX_RANGE + nvec = pci_enable_msix_range(dev->pdev, table->msix_arr, + MLX5_EQ_VEC_COMP_BASE, nvec); + if (nvec < 0) + return nvec; + + table->num_comp_vectors = nvec - MLX5_EQ_VEC_COMP_BASE; ++#else ++retry: ++ table->num_comp_vectors = nvec - MLX5_EQ_VEC_COMP_BASE; ++ err = pci_enable_msix(dev->pdev, table->msix_arr, nvec); ++ if (err <= 0) { ++ return err; ++ } else if (err > 2) { ++ nvec = err; ++ goto retry; ++ } ++ ++ mlx5_core_dbg(dev, "received %d MSI vectors out of %d requested\n", err, nvec); ++#endif + + return 0; + } +diff --git a/include/linux/mlx5/driver.h b/include/linux/mlx5/driver.h +index xxxxxxx..xxxxxxx xxxxxx +--- a/include/linux/mlx5/driver.h ++++ b/include/linux/mlx5/driver.h +@@ -564,8 +564,13 @@ struct mlx5_cmd_work_ent { + int page_queue; + u8 status; + u8 token; ++#ifdef HAVE_KTIME_GET_NS + u64 ts1; + u64 ts2; ++#else ++ struct timespec ts1; ++ struct timespec ts2; ++#endif + u16 op; + }; + diff --git a/patches/0002-BACKPORT-NFSRDMA.patch b/patches/0002-BACKPORT-NFSRDMA.patch new file mode 100644 index 0000000..6e2687c --- /dev/null +++ b/patches/0002-BACKPORT-NFSRDMA.patch @@ -0,0 +1,22 @@ +From: Vladimir Sokolovsky +Subject: [PATCH] BACKPORT: NFSRDMA + +Signed-off-by: Vladimir Sokolovsky +--- + net/sunrpc/xprtrdma/svc_rdma_transport.c | 2 ++ + 1 files changed, 2 insertions(+), 0 deletions(-) + +diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c +index xxxxxxx..xxxxxxx xxxxxx +--- a/net/sunrpc/xprtrdma/svc_rdma_transport.c ++++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c +@@ -92,7 +92,9 @@ struct svc_xprt_class svc_rdma_class = { + .xcl_owner = THIS_MODULE, + .xcl_ops = &svc_rdma_ops, + .xcl_max_payload = RPCSVC_MAXPAYLOAD_RDMA, ++#ifdef HAVE_XCL_IDENT + .xcl_ident = XPRT_TRANSPORT_RDMA, ++#endif + }; + + struct svc_rdma_op_ctxt *svc_rdma_get_context(struct svcxprt_rdma *xprt) diff --git a/patches/0003-BACKPORT-mlx4-core-and-en.patch b/patches/0003-BACKPORT-mlx4-core-and-en.patch new file mode 100644 index 0000000..72e876c --- /dev/null +++ b/patches/0003-BACKPORT-mlx4-core-and-en.patch @@ -0,0 +1,652 @@ +From: Vladimir Sokolovsky +Subject: [PATCH] BACKPORT: mlx4 core and en + +Signed-off-by: Vladimir Sokolovsky +--- + drivers/net/ethernet/mellanox/mlx4/cmd.c | 6 +++ + drivers/net/ethernet/mellanox/mlx4/en_clock.c | 2 + + drivers/net/ethernet/mellanox/mlx4/en_cq.c | 5 ++ + drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 9 ++++- + drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 26 ++++++++++++ + drivers/net/ethernet/mellanox/mlx4/en_rx.c | 48 ++++++++++++++++++++++- + drivers/net/ethernet/mellanox/mlx4/en_tx.c | 35 ++++++++++++++++- + drivers/net/ethernet/mellanox/mlx4/eq.c | 10 +++++ + drivers/net/ethernet/mellanox/mlx4/main.c | 24 +++++++++++ + drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 4 ++ + 10 files changed, 165 insertions(+), 4 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c +index xxxxxxx..xxxxxxx xxxxxx +--- a/drivers/net/ethernet/mellanox/mlx4/cmd.c ++++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c +@@ -2545,15 +2545,20 @@ int mlx4_get_vf_config(struct mlx4_dev *dev, int port, int vf, struct ifla_vf_in + + ivf->vlan = s_info->default_vlan; + ivf->qos = s_info->default_qos; ++#ifdef HAVE_TX_RATE_LIMIT + ivf->max_tx_rate = s_info->tx_rate; + ivf->min_tx_rate = 0; ++#endif + ivf->spoofchk = s_info->spoofchk; ++#ifdef HAVE_LINKSTATE + ivf->linkstate = s_info->link_state; ++#endif + + return 0; + } + EXPORT_SYMBOL_GPL(mlx4_get_vf_config); + ++#ifdef HAVE_LINKSTATE + int mlx4_set_vf_link_state(struct mlx4_dev *dev, int port, int vf, int link_state) + { + struct mlx4_priv *priv = mlx4_priv(dev); +@@ -2601,6 +2606,7 @@ int mlx4_set_vf_link_state(struct mlx4_dev *dev, int port, int vf, int link_stat + return 0; + } + EXPORT_SYMBOL_GPL(mlx4_set_vf_link_state); ++#endif + + int mlx4_vf_smi_enabled(struct mlx4_dev *dev, int slave, int port) + { +diff --git a/drivers/net/ethernet/mellanox/mlx4/en_clock.c b/drivers/net/ethernet/mellanox/mlx4/en_clock.c +index xxxxxxx..xxxxxxx xxxxxx +--- a/drivers/net/ethernet/mellanox/mlx4/en_clock.c ++++ b/drivers/net/ethernet/mellanox/mlx4/en_clock.c +@@ -276,7 +276,9 @@ static const struct ptp_clock_info mlx4_en_ptp_clock_info = { + .n_alarm = 0, + .n_ext_ts = 0, + .n_per_out = 0, ++#ifdef HAVE_PTP_CLOCK_INFO_N_PINS + .n_pins = 0, ++#endif + .pps = 0, + .adjfreq = mlx4_en_phc_adjfreq, + .adjtime = mlx4_en_phc_adjtime, +diff --git a/drivers/net/ethernet/mellanox/mlx4/en_cq.c b/drivers/net/ethernet/mellanox/mlx4/en_cq.c +index xxxxxxx..xxxxxxx xxxxxx +--- a/drivers/net/ethernet/mellanox/mlx4/en_cq.c ++++ b/drivers/net/ethernet/mellanox/mlx4/en_cq.c +@@ -34,6 +34,7 @@ + #include + #include + #include ++#include + + #include "mlx4_en.h" + +@@ -176,7 +177,9 @@ int mlx4_en_activate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq, + mlx4_warn(mdev, "Failed setting affinity hint\n"); + + netif_napi_add(cq->dev, &cq->napi, mlx4_en_poll_rx_cq, 64); ++#ifdef HAVE_NAPI_HASH_ADD + napi_hash_add(&cq->napi); ++#endif + } + + napi_enable(&cq->napi); +@@ -205,8 +208,10 @@ void mlx4_en_deactivate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq) + { + napi_disable(&cq->napi); + if (!cq->is_tx) { ++#ifdef HAVE_NAPI_HASH_ADD + napi_hash_del(&cq->napi); + synchronize_rcu(); ++#endif + irq_set_affinity_hint(cq->mcq.irq, NULL); + } + netif_napi_del(&cq->napi); +diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c +index xxxxxxx..xxxxxxx xxxxxx +--- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c ++++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c +@@ -580,6 +580,7 @@ static void mlx4_en_get_ringparam(struct net_device *dev, + param->tx_pending = priv->tx_ring[0]->size; + } + ++#ifdef HAVE_GET_SET_RXFH + static u32 mlx4_en_get_rxfh_indir_size(struct net_device *dev) + { + struct mlx4_en_priv *priv = netdev_priv(dev); +@@ -650,6 +651,7 @@ static int mlx4_en_set_rxfh(struct net_device *dev, const u32 *ring_index, + mutex_unlock(&mdev->state_lock); + return err; + } ++#endif + + #define all_zeros_or_all_ones(field) \ + ((field) == 0 || (field) == (__force typeof(field))-1) +@@ -1267,6 +1269,7 @@ static u32 mlx4_en_get_priv_flags(struct net_device *dev) + return priv->pflags; + } + ++#ifdef HAVE_GET_SET_TUNABLE + static int mlx4_en_get_tunable(struct net_device *dev, + const struct ethtool_tunable *tuna, + void *data) +@@ -1308,7 +1311,7 @@ static int mlx4_en_set_tunable(struct net_device *dev, + + return ret; + } +- ++#endif + + const struct ethtool_ops mlx4_en_ethtool_ops = { + .get_drvinfo = mlx4_en_get_drvinfo, +@@ -1331,16 +1334,20 @@ const struct ethtool_ops mlx4_en_ethtool_ops = { + .set_ringparam = mlx4_en_set_ringparam, + .get_rxnfc = mlx4_en_get_rxnfc, + .set_rxnfc = mlx4_en_set_rxnfc, ++#ifdef HAVE_GET_SET_RXFH + .get_rxfh_indir_size = mlx4_en_get_rxfh_indir_size, + .get_rxfh = mlx4_en_get_rxfh, + .set_rxfh = mlx4_en_set_rxfh, ++#endif + .get_channels = mlx4_en_get_channels, + .set_channels = mlx4_en_set_channels, + .get_ts_info = mlx4_en_get_ts_info, + .set_priv_flags = mlx4_en_set_priv_flags, + .get_priv_flags = mlx4_en_get_priv_flags, ++#ifdef HAVE_GET_SET_TUNABLE + .get_tunable = mlx4_en_get_tunable, + .set_tunable = mlx4_en_set_tunable, ++#endif + }; + + +diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +index xxxxxxx..xxxxxxx xxxxxx +--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c ++++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +@@ -38,8 +38,12 @@ + #include + #include + #include ++#ifdef HAVE_SKB_MARK_NAPI_ID + #include ++#endif ++#ifdef CONFIG_MLX4_EN_VXLAN + #include ++#endif + + #include + #include +@@ -2107,7 +2111,11 @@ static int mlx4_en_change_mtu(struct net_device *dev, int new_mtu) + return 0; + } + ++#ifdef HAVE_SIOCGHWTSTAMP + static int mlx4_en_hwtstamp_set(struct net_device *dev, struct ifreq *ifr) ++#else ++static int mlx4_en_hwtstamp_ioctl(struct net_device *dev, struct ifreq *ifr) ++#endif + { + struct mlx4_en_priv *priv = netdev_priv(dev); + struct mlx4_en_dev *mdev = priv->mdev; +@@ -2166,6 +2174,7 @@ static int mlx4_en_hwtstamp_set(struct net_device *dev, struct ifreq *ifr) + sizeof(config)) ? -EFAULT : 0; + } + ++#ifdef HAVE_SIOCGHWTSTAMP + static int mlx4_en_hwtstamp_get(struct net_device *dev, struct ifreq *ifr) + { + struct mlx4_en_priv *priv = netdev_priv(dev); +@@ -2173,14 +2182,19 @@ static int mlx4_en_hwtstamp_get(struct net_device *dev, struct ifreq *ifr) + return copy_to_user(ifr->ifr_data, &priv->hwtstamp_config, + sizeof(priv->hwtstamp_config)) ? -EFAULT : 0; + } ++#endif + + static int mlx4_en_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) + { + switch (cmd) { + case SIOCSHWTSTAMP: ++#ifdef HAVE_SIOCGHWTSTAMP + return mlx4_en_hwtstamp_set(dev, ifr); + case SIOCGHWTSTAMP: + return mlx4_en_hwtstamp_get(dev, ifr); ++#else ++ return mlx4_en_hwtstamp_ioctl(dev, ifr); ++#endif + default: + return -EOPNOTSUPP; + } +@@ -2239,6 +2253,7 @@ static int mlx4_en_get_vf_config(struct net_device *dev, int vf, struct ifla_vf_ + return mlx4_get_vf_config(mdev->dev, en_priv->port, vf, ivf); + } + ++#ifdef HAVE_LINKSTATE + static int mlx4_en_set_vf_link_state(struct net_device *dev, int vf, int link_state) + { + struct mlx4_en_priv *en_priv = netdev_priv(dev); +@@ -2246,7 +2261,9 @@ static int mlx4_en_set_vf_link_state(struct net_device *dev, int vf, int link_st + + return mlx4_set_vf_link_state(mdev->dev, en_priv->port, vf, link_state); + } ++#endif + ++#ifdef HAVE_NETDEV_PHYS_PORT_ID + #define PORT_ID_BYTE_LEN 8 + static int mlx4_en_get_phys_port_id(struct net_device *dev, + struct netdev_phys_port_id *ppid) +@@ -2266,6 +2283,7 @@ static int mlx4_en_get_phys_port_id(struct net_device *dev, + } + return 0; + } ++#endif + + #ifdef CONFIG_MLX4_EN_VXLAN + static void mlx4_en_add_vxlan_offloads(struct work_struct *work) +@@ -2369,7 +2387,9 @@ static const struct net_device_ops mlx4_netdev_ops = { + #ifdef CONFIG_NET_RX_BUSY_POLL + .ndo_busy_poll = mlx4_en_low_latency_recv, + #endif ++#ifdef HAVE_NETDEV_PHYS_PORT_ID + .ndo_get_phys_port_id = mlx4_en_get_phys_port_id, ++#endif + #ifdef CONFIG_MLX4_EN_VXLAN + .ndo_add_vxlan_port = mlx4_en_add_vxlan_port, + .ndo_del_vxlan_port = mlx4_en_del_vxlan_port, +@@ -2392,7 +2412,9 @@ static const struct net_device_ops mlx4_netdev_ops_master = { + .ndo_set_vf_mac = mlx4_en_set_vf_mac, + .ndo_set_vf_vlan = mlx4_en_set_vf_vlan, + .ndo_set_vf_spoofchk = mlx4_en_set_vf_spoofchk, ++#ifdef HAVE_LINKSTATE + .ndo_set_vf_link_state = mlx4_en_set_vf_link_state, ++#endif + .ndo_get_vf_config = mlx4_en_get_vf_config, + #ifdef CONFIG_NET_POLL_CONTROLLER + .ndo_poll_controller = mlx4_en_netpoll, +@@ -2402,7 +2424,9 @@ static const struct net_device_ops mlx4_netdev_ops_master = { + #ifdef CONFIG_RFS_ACCEL + .ndo_rx_flow_steer = mlx4_en_filter_rfs, + #endif ++#ifdef HAVE_NETDEV_PHYS_PORT_ID + .ndo_get_phys_port_id = mlx4_en_get_phys_port_id, ++#endif + }; + + int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, +@@ -2423,7 +2447,9 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, + netif_set_real_num_rx_queues(dev, prof->rx_ring_num); + + SET_NETDEV_DEV(dev, &mdev->dev->pdev->dev); ++#ifdef HAVE_NET_DEVICE_DEV_PORT + dev->dev_port = port - 1; ++#endif + + /* + * Initialize driver private data +diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c +index xxxxxxx..xxxxxxx xxxxxx +--- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c ++++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c +@@ -30,8 +30,9 @@ + * SOFTWARE. + * + */ +- ++#ifdef HAVE_SKB_MARK_NAPI_ID + #include ++#endif + #include + #include + #include +@@ -588,7 +589,9 @@ static struct sk_buff *mlx4_en_rx_skb(struct mlx4_en_priv *priv, + skb_copy_to_linear_data(skb, va, length); + skb->tail += length; + } else { ++#ifdef HAVE_ETH_GET_HEADLEN + unsigned int pull_len; ++#endif + + /* Move relevant fragments to skb */ + used_frags = mlx4_en_complete_rx_desc(priv, rx_desc, frags, +@@ -599,7 +602,8 @@ static struct sk_buff *mlx4_en_rx_skb(struct mlx4_en_priv *priv, + } + skb_shinfo(skb)->nr_frags = used_frags; + +- pull_len = eth_get_headlen(va, SMALL_PACKET_SIZE); ++#ifdef HAVE_ETH_GET_HEADLEN ++ pull_len = eth_get_headlen(va, SMALLl_PACKET_SIZE); + /* Copy headers into the skb linear buffer */ + memcpy(skb->data, va, pull_len); + skb->tail += pull_len; +@@ -610,6 +614,17 @@ static struct sk_buff *mlx4_en_rx_skb(struct mlx4_en_priv *priv, + /* Adjust size of first fragment */ + skb_frag_size_sub(&skb_shinfo(skb)->frags[0], pull_len); + skb->data_len = length - pull_len; ++#else ++ memcpy(skb->data, va, HEADER_COPY_SIZE); ++ skb->tail += HEADER_COPY_SIZE; ++ ++ /* Skip headers in first fragment */ ++ skb_shinfo(skb)->frags[0].page_offset += HEADER_COPY_SIZE; ++ ++ /* Adjust size of first fragment */ ++ skb_frag_size_sub(&skb_shinfo(skb)->frags[0], HEADER_COPY_SIZE); ++ skb->data_len = length - HEADER_COPY_SIZE; ++#endif + } + return skb; + } +@@ -754,8 +769,12 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud + * - not an IP fragment + * - no LLS polling in progress + */ ++#ifdef HAVE_SKB_MARK_NAPI_ID + if (!mlx4_en_cq_busy_polling(cq) && + (dev->features & NETIF_F_GRO)) { ++#else ++ if (dev->features & NETIF_F_GRO) { ++#endif + struct sk_buff *gro_skb = napi_get_frags(&cq->napi); + if (!gro_skb) + goto next; +@@ -772,7 +791,11 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud + gro_skb->ip_summed = CHECKSUM_UNNECESSARY; + + if (l2_tunnel) ++#ifdef HAVE_SK_BUFF_CSUM_LEVEL + gro_skb->csum_level = 1; ++#else ++ gro_skb->encapsulation = 1; ++#endif + if ((cqe->vlan_my_qpn & + cpu_to_be32(MLX4_CQE_VLAN_PRESENT_MASK)) && + (dev->features & NETIF_F_HW_VLAN_CTAG_RX)) { +@@ -782,12 +805,18 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud + } + + if (dev->features & NETIF_F_RXHASH) ++#ifdef HAVE_SKB_SET_HASH + skb_set_hash(gro_skb, + be32_to_cpu(cqe->immed_rss_invalid), + PKT_HASH_TYPE_L3); ++#else ++ gro_skb->rxhash = be32_to_cpu(cqe->immed_rss_invalid); ++#endif + + skb_record_rx_queue(gro_skb, cq->ring); ++#ifdef HAVE_SKB_MARK_NAPI_ID + skb_mark_napi_id(gro_skb, &cq->napi); ++#endif + + if (ring->hwtstamp_rx_filter == HWTSTAMP_FILTER_ALL) { + timestamp = mlx4_en_get_cqe_ts(cqe); +@@ -826,13 +855,22 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud + skb->protocol = eth_type_trans(skb, dev); + skb_record_rx_queue(skb, cq->ring); + ++#ifdef HAVE_SK_BUFF_CSUM_LEVEL + if (l2_tunnel && ip_summed == CHECKSUM_UNNECESSARY) + skb->csum_level = 1; ++#else ++ if (l2_tunnel) ++ skb->encapsulation = 1; ++#endif + ++#ifdef HAVE_SKB_SET_HASH + if (dev->features & NETIF_F_RXHASH) + skb_set_hash(skb, + be32_to_cpu(cqe->immed_rss_invalid), + PKT_HASH_TYPE_L3); ++#else ++ skb->rxhash = be32_to_cpu(cqe->immed_rss_invalid); ++#endif + + if ((be32_to_cpu(cqe->vlan_my_qpn) & + MLX4_CQE_VLAN_PRESENT_MASK) && +@@ -845,7 +883,9 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud + timestamp); + } + ++#ifdef HAVE_SKB_MARK_NAPI_ID + skb_mark_napi_id(skb, &cq->napi); ++#endif + + if (!mlx4_en_cq_busy_polling(cq)) + napi_gro_receive(&cq->napi, skb); +@@ -893,12 +933,16 @@ int mlx4_en_poll_rx_cq(struct napi_struct *napi, int budget) + struct mlx4_en_priv *priv = netdev_priv(dev); + int done; + ++#ifdef HAVE_SKB_MARK_NAPI_ID + if (!mlx4_en_cq_lock_napi(cq)) + return budget; ++#endif + + done = mlx4_en_process_rx_cq(dev, cq, budget); + ++#ifdef HAVE_SKB_MARK_NAPI_ID + mlx4_en_cq_unlock_napi(cq); ++#endif + + /* If we used up all the quota - we're probably not done yet... */ + if (done == budget) { +diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c +index xxxxxxx..xxxxxxx xxxxxx +--- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c ++++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c +@@ -151,7 +151,11 @@ err_bounce: + kfree(ring->bounce_buf); + ring->bounce_buf = NULL; + err_info: ++#ifdef HAVE_KVFREE + kvfree(ring->tx_info); ++#else ++ vfree(ring->tx_info); ++#endif + ring->tx_info = NULL; + err_ring: + kfree(ring); +@@ -174,7 +178,11 @@ void mlx4_en_destroy_tx_ring(struct mlx4_en_priv *priv, + mlx4_free_hwq_res(mdev->dev, &ring->wqres, ring->buf_size); + kfree(ring->bounce_buf); + ring->bounce_buf = NULL; ++#ifdef HAVE_KVFREE + kvfree(ring->tx_info); ++#else ++ vfree(ring->tx_info); ++#endif + ring->tx_info = NULL; + kfree(ring); + *pring = NULL; +@@ -328,7 +336,11 @@ static u32 mlx4_en_free_tx_desc(struct mlx4_en_priv *priv, + } + } + } ++#ifdef HAVE_DEV_CONSUME_SKB_ANY + dev_consume_skb_any(skb); ++#else ++ dev_kfree_skb_any(skb); ++#endif + return tx_info->nr_txbb; + } + +@@ -392,7 +404,11 @@ static bool mlx4_en_process_tx_cq(struct net_device *dev, + if (!priv->port_up) + return true; + ++#ifdef HAVE_NETDEV_TXQ_BQL_PREFETCHW + netdev_txq_bql_complete_prefetchw(ring->tx_queue); ++#else ++ prefetchw(&ring->tx_queue->dql.limit); ++#endif + + index = cons_index & size_mask; + cqe = mlx4_en_get_cqe(buf, index, priv->cqe_size) + factor; +@@ -665,7 +681,11 @@ static void build_inline_wqe(struct mlx4_en_tx_desc *tx_desc, + } + + u16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb, ++#ifdef HAVE_SELECT_QUEUE_FALLBACK_T + void *accel_priv, select_queue_fallback_t fallback) ++#else ++ void *accel_priv) ++#endif + { + struct mlx4_en_priv *priv = netdev_priv(dev); + u16 rings_p_up = priv->num_tx_rings_p_up; +@@ -677,7 +697,11 @@ u16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb, + if (vlan_tx_tag_present(skb)) + up = vlan_tx_tag_get(skb) >> VLAN_PRIO_SHIFT; + ++#ifdef HAVE_SELECT_QUEUE_FALLBACK_T + return fallback(dev, skb) % rings_p_up + up * rings_p_up; ++#else ++ return __netdev_pick_tx(dev, skb) % rings_p_up + up * rings_p_up; ++#endif + } + + static void mlx4_bf_copy(void __iomem *dst, const void *src, +@@ -737,8 +761,11 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev) + if (vlan_tx_tag_present(skb)) + vlan_tag = vlan_tx_tag_get(skb); + +- ++#ifdef HAVE_NETDEV_TXQ_BQL_PREFETCHW + netdev_txq_bql_enqueue_prefetchw(ring->tx_queue); ++#else ++ prefetchw(&ring->tx_queue->dql); ++#endif + + /* Track current inflight packets for performance analysis */ + AVG_PERF_COUNTER(priv->pstats.inflight_avg, +@@ -914,7 +941,11 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev) + netif_tx_stop_queue(ring->tx_queue); + ring->queue_stopped++; + } ++#ifdef HAVE_SK_BUFF_XMIT_MORE + send_doorbell = !skb->xmit_more || netif_xmit_stopped(ring->tx_queue); ++#else ++ send_doorbell = 1; ++#endif + + real_size = (real_size / 16) & 0x3f; + +@@ -953,8 +984,10 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev) + wmb(); + iowrite32(ring->doorbell_qpn, + ring->bf.uar->map + MLX4_SEND_DOORBELL); ++#ifdef HAVE_SK_BUFF_XMIT_MORE + } else { + ring->xmit_more++; ++#endif + } + } + +diff --git a/drivers/net/ethernet/mellanox/mlx4/eq.c b/drivers/net/ethernet/mellanox/mlx4/eq.c +index xxxxxxx..xxxxxxx xxxxxx +--- a/drivers/net/ethernet/mellanox/mlx4/eq.c ++++ b/drivers/net/ethernet/mellanox/mlx4/eq.c +@@ -461,7 +461,9 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq) + int i; + enum slave_port_gen_event gen_event; + unsigned long flags; ++#ifdef HAVE_LINKSTATE + struct mlx4_vport_state *s_info; ++#endif + int eqe_size = dev->caps.eqe_size; + + while ((eqe = next_eqe_sw(eq, dev->caps.eqe_factor, eqe_size))) { +@@ -568,6 +570,7 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq) + continue; + mlx4_dbg(dev, "%s: Sending MLX4_PORT_CHANGE_SUBTYPE_DOWN to slave: %d, port:%d\n", + __func__, i, port); ++#ifdef HAVE_LINKSTATE + s_info = &priv->mfunc.master.vf_oper[slave].vport[port].state; + if (IFLA_VF_LINK_STATE_AUTO == s_info->link_state) { + eqe->event.port_change.port = +@@ -576,6 +579,9 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq) + | (mlx4_phys_to_slave_port(dev, i, port) << 28)); + mlx4_slave_event(dev, i, eqe); + } ++#else ++ mlx4_slave_event(dev, i, eqe); ++#endif + } else { /* IB port */ + set_and_calc_slave_port_state(dev, i, port, + MLX4_PORT_STATE_DEV_EVENT_PORT_DOWN, +@@ -601,6 +607,7 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq) + continue; + if (i == mlx4_master_func_num(dev)) + continue; ++#ifdef HAVE_LINKSTATE + s_info = &priv->mfunc.master.vf_oper[slave].vport[port].state; + if (IFLA_VF_LINK_STATE_AUTO == s_info->link_state) { + eqe->event.port_change.port = +@@ -609,6 +616,9 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq) + | (mlx4_phys_to_slave_port(dev, i, port) << 28)); + mlx4_slave_event(dev, i, eqe); + } ++#else ++ mlx4_slave_event(dev, i, eqe); ++#endif + } + else /* IB port */ + /* port-up event will be sent to a slave when the +diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c +index xxxxxxx..xxxxxxx xxxxxx +--- a/drivers/net/ethernet/mellanox/mlx4/main.c ++++ b/drivers/net/ethernet/mellanox/mlx4/main.c +@@ -2057,6 +2057,9 @@ static void mlx4_enable_msi_x(struct mlx4_dev *dev) + int nreq = min_t(int, dev->caps.num_ports * + min_t(int, num_online_cpus() + 1, + MAX_MSIX_P_PORT) + MSIX_LEGACY_SZ, MAX_MSIX); ++#ifndef HAVE_PCI_ENABLE_MSIX_RANGE ++ int err; ++#endif + int i; + + if (msi_x) { +@@ -2070,6 +2073,8 @@ static void mlx4_enable_msi_x(struct mlx4_dev *dev) + for (i = 0; i < nreq; ++i) + entries[i].entry = i; + ++ ++#ifdef HAVE_PCI_ENABLE_MSIX_RANGE + nreq = pci_enable_msix_range(dev->pdev, entries, 2, nreq); + + if (nreq < 0) { +@@ -2077,6 +2082,25 @@ static void mlx4_enable_msi_x(struct mlx4_dev *dev) + goto no_msi; + } else if (nreq < MSIX_LEGACY_SZ + + dev->caps.num_ports * MIN_MSIX_P_PORT) { ++#else ++ retry: ++ err = pci_enable_msix(dev->pdev, entries, nreq); ++ if (err) { ++ /* Try again if at least 2 vectors are available */ ++ if (err > 1) { ++ mlx4_info(dev, "Requested %d vectors, " ++ "but only %d MSI-X vectors available, " ++ "trying again\n", nreq, err); ++ nreq = err; ++ goto retry; ++ } ++ kfree(entries); ++ goto no_msi; ++ } ++ ++ if (nreq < ++ MSIX_LEGACY_SZ + dev->caps.num_ports * MIN_MSIX_P_PORT) { ++#endif + /*Working in legacy mode , all EQ's shared*/ + dev->caps.comp_pool = 0; + dev->caps.num_comp_vectors = nreq - 1; +diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +index xxxxxxx..xxxxxxx xxxxxx +--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h ++++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +@@ -764,7 +764,11 @@ int mlx4_en_arm_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq); + + void mlx4_en_tx_irq(struct mlx4_cq *mcq); + u16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb, ++#ifdef HAVE_SELECT_QUEUE_FALLBACK_T + void *accel_priv, select_queue_fallback_t fallback); ++#else ++ void *accel_priv); ++#endif + netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev); + + int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv, diff --git a/patches/0004-BACKPORT-mthca.patch b/patches/0004-BACKPORT-mthca.patch new file mode 100644 index 0000000..341b4b4 --- /dev/null +++ b/patches/0004-BACKPORT-mthca.patch @@ -0,0 +1,24 @@ +From: Alaa Hleihel +Subject: [PATCH] BACKPORT: mthca + +Signed-off-by: Alaa Hleihel +--- + drivers/infiniband/hw/mthca/mthca_main.c | 4 ++++ + 1 files changed, 4 insertions(+), 0 deletions(-) + +diff --git a/drivers/infiniband/hw/mthca/mthca_main.c b/drivers/infiniband/hw/mthca/mthca_main.c +index xxxxxxx..xxxxxxx xxxxxx +--- a/drivers/infiniband/hw/mthca/mthca_main.c ++++ b/drivers/infiniband/hw/mthca/mthca_main.c +@@ -858,7 +858,11 @@ static int mthca_enable_msi_x(struct mthca_dev *mdev) + entries[1].entry = 1; + entries[2].entry = 2; + ++#ifdef HAVE_PCI_ENABLE_MSI_EXACT + err = pci_enable_msix_exact(mdev->pdev, entries, ARRAY_SIZE(entries)); ++#else ++ err = pci_enable_msix(mdev->pdev, entries, ARRAY_SIZE(entries)); ++#endif + if (err) + return err; + diff --git a/patches/0005-BACKPORT-qib.patch b/patches/0005-BACKPORT-qib.patch new file mode 100644 index 0000000..869a7f9 --- /dev/null +++ b/patches/0005-BACKPORT-qib.patch @@ -0,0 +1,99 @@ +From: Alaa Hleihel +Subject: [PATCH] BACKPORT: qib + +Signed-off-by: Alaa Hleihel +--- + drivers/infiniband/hw/qib/qib_pcie.c | 43 ++++++++++++++++++++++++++++++++++ + 1 files changed, 43 insertions(+), 0 deletions(-) + +diff --git a/drivers/infiniband/hw/qib/qib_pcie.c b/drivers/infiniband/hw/qib/qib_pcie.c +index xxxxxxx..xxxxxxx xxxxxx +--- a/drivers/infiniband/hw/qib/qib_pcie.c ++++ b/drivers/infiniband/hw/qib/qib_pcie.c +@@ -197,26 +197,43 @@ static void qib_msix_setup(struct qib_devdata *dd, int pos, u32 *msixcnt, + struct qib_msix_entry *qib_msix_entry) + { + int ret; ++#ifdef HAVE_PCI_ENABLE_MSIX_RANGE + int nvec = *msixcnt; ++#else ++ u32 tabsize = 0; ++ u16 msix_flags; ++#endif + struct msix_entry *msix_entry; + int i; + ++#ifdef HAVE_PCI_ENABLE_MSIX_RANGE + ret = pci_msix_vec_count(dd->pcidev); + if (ret < 0) + goto do_intx; + + nvec = min(nvec, ret); ++#endif + + /* We can't pass qib_msix_entry array to qib_msix_setup + * so use a dummy msix_entry array and copy the allocated + * irq back to the qib_msix_entry array. */ ++#ifdef HAVE_PCI_ENABLE_MSIX_RANGE + msix_entry = kmalloc(nvec * sizeof(*msix_entry), GFP_KERNEL); + if (!msix_entry) + goto do_intx; + + for (i = 0; i < nvec; i++) ++#else ++ msix_entry = kmalloc(*msixcnt * sizeof(*msix_entry), GFP_KERNEL); ++ if (!msix_entry) { ++ ret = -ENOMEM; ++ goto do_intx; ++ } ++ for (i = 0; i < *msixcnt; i++) ++#endif + msix_entry[i] = qib_msix_entry[i].msix; + ++#ifdef HAVE_PCI_ENABLE_MSIX_RANGE + ret = pci_enable_msix_range(dd->pcidev, msix_entry, 1, nvec); + if (ret < 0) + goto free_msix_entry; +@@ -224,9 +241,29 @@ static void qib_msix_setup(struct qib_devdata *dd, int pos, u32 *msixcnt, + nvec = ret; + + for (i = 0; i < nvec; i++) ++#else ++ pci_read_config_word(dd->pcidev, pos + PCI_MSIX_FLAGS, &msix_flags); ++ tabsize = 1 + (msix_flags & PCI_MSIX_FLAGS_QSIZE); ++ if (tabsize > *msixcnt) ++ tabsize = *msixcnt; ++ ret = pci_enable_msix(dd->pcidev, msix_entry, tabsize); ++ if (ret > 0) { ++ tabsize = ret; ++ ret = pci_enable_msix(dd->pcidev, msix_entry, tabsize); ++ } ++do_intx: ++ if (ret) { ++ qib_dev_err(dd, ++ "pci_enable_msix %d vectors failed: %d, falling back to INTx\n", ++ tabsize, ret); ++ tabsize = 0; ++ } ++ for (i = 0; i < tabsize; i++) ++#endif + qib_msix_entry[i].msix = msix_entry[i]; + + kfree(msix_entry); ++#ifdef HAVE_PCI_ENABLE_MSIX_RANGE + *msixcnt = nvec; + return; + +@@ -238,6 +275,12 @@ do_intx: + "falling back to INTx\n", nvec, ret); + *msixcnt = 0; + qib_enable_intx(dd->pcidev); ++#else ++ *msixcnt = tabsize; ++ ++ if (ret) ++ qib_enable_intx(dd->pcidev); ++#endif + } + + /** diff --git a/patches/0006-BACKPORT-iser.patch b/patches/0006-BACKPORT-iser.patch new file mode 100644 index 0000000..3946066 --- /dev/null +++ b/patches/0006-BACKPORT-iser.patch @@ -0,0 +1,80 @@ +From: Alaa Hleihel +Subject: [PATCH] BACKPORT: iser + +Signed-off-by: Alaa Hleihel +--- + drivers/infiniband/ulp/iser/iscsi_iser.c | 6 ++++++ + drivers/infiniband/ulp/iser/iser_initiator.c | 6 ++++++ + 2 files changed, 12 insertions(+), 0 deletions(-) + +diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c b/drivers/infiniband/ulp/iser/iscsi_iser.c +index xxxxxxx..xxxxxxx xxxxxx +--- a/drivers/infiniband/ulp/iser/iscsi_iser.c ++++ b/drivers/infiniband/ulp/iser/iscsi_iser.c +@@ -348,6 +348,7 @@ static void iscsi_iser_cleanup_task(struct iscsi_task *task) + } + } + ++#ifdef HAVE_ISCSI_CHECK_PROTECTION + /** + * iscsi_iser_check_protection() - check protection information status of task. + * @task: iscsi task +@@ -372,6 +373,7 @@ iscsi_iser_check_protection(struct iscsi_task *task, sector_t *sector) + return iser_check_task_pi_status(iser_task, ISER_DIR_OUT, + sector); + } ++#endif + + /** + * iscsi_iser_conn_create() - create a new iscsi-iser connection +@@ -897,7 +899,9 @@ static umode_t iser_attr_is_visible(int param_type, int param) + case ISCSI_PARAM_TGT_RESET_TMO: + case ISCSI_PARAM_IFACE_NAME: + case ISCSI_PARAM_INITIATOR_NAME: ++#ifdef HAVE_ISCSI_PARAM_DISCOVERY_SESS + case ISCSI_PARAM_DISCOVERY_SESS: ++#endif + return S_IRUGO; + default: + return 0; +@@ -952,7 +956,9 @@ static struct iscsi_transport iscsi_iser_transport = { + .xmit_task = iscsi_iser_task_xmit, + .cleanup_task = iscsi_iser_cleanup_task, + .alloc_pdu = iscsi_iser_pdu_alloc, ++#ifdef HAVE_ISCSI_CHECK_PROTECTION + .check_protection = iscsi_iser_check_protection, ++#endif + /* recovery */ + .session_recovery_timedout = iscsi_session_recovery_timedout, + +diff --git a/drivers/infiniband/ulp/iser/iser_initiator.c b/drivers/infiniband/ulp/iser/iser_initiator.c +index xxxxxxx..xxxxxxx xxxxxx +--- a/drivers/infiniband/ulp/iser/iser_initiator.c ++++ b/drivers/infiniband/ulp/iser/iser_initiator.c +@@ -342,7 +342,9 @@ static int iser_post_rx_bufs(struct iscsi_conn *conn, struct iscsi_hdr *req) + { + struct iser_conn *iser_conn = conn->dd_data; + struct ib_conn *ib_conn = &iser_conn->ib_conn; ++#ifdef HAVE_ISCSI_DISCOVERY_SESS + struct iscsi_session *session = conn->session; ++#endif + + iser_dbg("req op %x flags %x\n", req->opcode, req->flags); + /* check if this is the last login - going to full feature phase */ +@@ -355,12 +357,16 @@ static int iser_post_rx_bufs(struct iscsi_conn *conn, struct iscsi_hdr *req) + */ + WARN_ON(ib_conn->post_recv_buf_count != 1); + ++#ifdef HAVE_ISCSI_DISCOVERY_SESS + if (session->discovery_sess) { + iser_info("Discovery session, re-using login RX buffer\n"); + return 0; + } else + iser_info("Normal session, posting batch of RX %d buffers\n", + iser_conn->min_posted_rx); ++#else ++ iser_dbg("Initially post: %d\n", ISER_MIN_POSTED_RX); ++#endif + + /* Initial post receive buffers */ + if (iser_post_recvm(iser_conn, iser_conn->min_posted_rx)) diff --git a/patches/0007-BACKPORT-rds.patch b/patches/0007-BACKPORT-rds.patch new file mode 100644 index 0000000..2d4452d --- /dev/null +++ b/patches/0007-BACKPORT-rds.patch @@ -0,0 +1,38 @@ +From: Alaa Hleihel +Subject: [PATCH] BACKPORT: rds + +Signed-off-by: Alaa Hleihel +--- + net/rds/connection.c | 12 ++++++++++++ + 1 files changed, 12 insertions(+), 0 deletions(-) + +diff --git a/net/rds/connection.c b/net/rds/connection.c +index xxxxxxx..xxxxxxx xxxxxx +--- a/net/rds/connection.c ++++ b/net/rds/connection.c +@@ -51,6 +51,7 @@ static struct kmem_cache *rds_conn_slab; + + static struct hlist_head *rds_conn_bucket(__be32 laddr, __be32 faddr) + { ++#ifdef HAVE_NET_GET_RANDOM_ONCE + static u32 rds_hash_secret __read_mostly; + + unsigned long hash; +@@ -61,6 +62,17 @@ static struct hlist_head *rds_conn_bucket(__be32 laddr, __be32 faddr) + hash = __inet_ehashfn(be32_to_cpu(laddr), 0, + be32_to_cpu(faddr), 0, + rds_hash_secret); ++#else ++#ifdef HAVE_INET_EHASHFN ++ unsigned long hash = __inet_ehashfn(be32_to_cpu(laddr), 0, ++ be32_to_cpu(faddr), 0, ++ inet_ehash_secret); ++#else ++ unsigned long hash = inet_ehashfn(NULL, ++ be32_to_cpu(laddr), 0, ++ be32_to_cpu(faddr), 0); ++#endif ++#endif + return &rds_conn_hash[hash & RDS_CONNECTION_HASH_MASK]; + } + diff --git a/patches/0008-BACKPORT-ib-core.patch b/patches/0008-BACKPORT-ib-core.patch new file mode 100644 index 0000000..4cf6790 --- /dev/null +++ b/patches/0008-BACKPORT-ib-core.patch @@ -0,0 +1,36 @@ +From: Alaa Hleihel +Subject: [PATCH] BACKPORT: ib-core + +Signed-off-by: Alaa Hleihel +--- + drivers/infiniband/core/cma.c | 8 ++++++++ + 1 files changed, 8 insertions(+), 0 deletions(-) + +diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c +index xxxxxxx..xxxxxxx xxxxxx +--- a/drivers/infiniband/core/cma.c ++++ b/drivers/infiniband/core/cma.c +@@ -2329,7 +2329,11 @@ static int cma_alloc_any_port(struct idr *ps, struct rdma_id_private *id_priv) + int low, high, remaining; + unsigned int rover; + ++#ifdef HAVE_INET_GET_LOCAL_PORT_RANGE_3_PARAMS + inet_get_local_port_range(&init_net, &low, &high); ++#else ++ inet_get_local_port_range(&low, &high); ++#endif + remaining = (high - low) + 1; + rover = prandom_u32() % remaining + low; + retry: +@@ -3236,7 +3240,11 @@ static int cma_join_ib_multicast(struct rdma_id_private *id_priv, + id_priv->id.port_num, &rec, + comp_mask, GFP_KERNEL, + cma_ib_mc_handler, mc); ++#ifdef HAVE_PTR_ERR_OR_ZERO + return PTR_ERR_OR_ZERO(mc->multicast.ib); ++#else ++ return PTR_RET(mc->multicast.ib); ++#endif + } + + static void iboe_mcast_work_handler(struct work_struct *work) diff --git a/patches/0009-BACKPORT-ipoib.patch b/patches/0009-BACKPORT-ipoib.patch new file mode 100644 index 0000000..f6d3326 --- /dev/null +++ b/patches/0009-BACKPORT-ipoib.patch @@ -0,0 +1,24 @@ +From: Vladimir Sokolovsky +Subject: [PATCH] BACKPORT: ipoib + +Signed-off-by: Vladimir Sokolovsky +--- + drivers/infiniband/ulp/ipoib/ipoib_main.c | 4 ++++ + 1 files changed, 4 insertions(+), 0 deletions(-) + +diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c +index xxxxxxx..xxxxxxx xxxxxx +--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c ++++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c +@@ -1364,7 +1364,11 @@ void ipoib_setup(struct net_device *dev) + dev->tx_queue_len = ipoib_sendq_size * 2; + dev->features = (NETIF_F_VLAN_CHALLENGED | + NETIF_F_HIGHDMA); ++#ifdef HAVE_NETIF_KEEP_DST + netif_keep_dst(dev); ++#else ++ dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; ++#endif + + memcpy(dev->broadcast, ipv4_bcast_addr, INFINIBAND_ALEN); +