mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-26 11:28:28 +00:00
RDMA/nes: Replace LRO with GRO
GRO is simpler to use than the old inet_lro library, and is compatible with forwarding and bridging configurations. Compile-tested only. Signed-off-by: Ben Hutchings <ben@decadent.org.uk> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
parent
fc77dbd34c
commit
bfec53c6c8
@ -2,7 +2,6 @@ config INFINIBAND_NES
|
|||||||
tristate "NetEffect RNIC Driver"
|
tristate "NetEffect RNIC Driver"
|
||||||
depends on PCI && INET && INFINIBAND
|
depends on PCI && INET && INFINIBAND
|
||||||
select LIBCRC32C
|
select LIBCRC32C
|
||||||
select INET_LRO
|
|
||||||
---help---
|
---help---
|
||||||
This is the RDMA Network Interface Card (RNIC) driver for
|
This is the RDMA Network Interface Card (RNIC) driver for
|
||||||
NetEffect Ethernet Cluster Server Adapters.
|
NetEffect Ethernet Cluster Server Adapters.
|
||||||
|
@ -35,18 +35,11 @@
|
|||||||
#include <linux/moduleparam.h>
|
#include <linux/moduleparam.h>
|
||||||
#include <linux/netdevice.h>
|
#include <linux/netdevice.h>
|
||||||
#include <linux/etherdevice.h>
|
#include <linux/etherdevice.h>
|
||||||
#include <linux/ip.h>
|
|
||||||
#include <linux/tcp.h>
|
|
||||||
#include <linux/if_vlan.h>
|
#include <linux/if_vlan.h>
|
||||||
#include <linux/inet_lro.h>
|
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
|
||||||
#include "nes.h"
|
#include "nes.h"
|
||||||
|
|
||||||
static unsigned int nes_lro_max_aggr = NES_LRO_MAX_AGGR;
|
|
||||||
module_param(nes_lro_max_aggr, uint, 0444);
|
|
||||||
MODULE_PARM_DESC(nes_lro_max_aggr, "NIC LRO max packet aggregation");
|
|
||||||
|
|
||||||
static int wide_ppm_offset;
|
static int wide_ppm_offset;
|
||||||
module_param(wide_ppm_offset, int, 0644);
|
module_param(wide_ppm_offset, int, 0644);
|
||||||
MODULE_PARM_DESC(wide_ppm_offset, "Increase CX4 interface clock ppm offset, 0=100ppm (default), 1=300ppm");
|
MODULE_PARM_DESC(wide_ppm_offset, "Increase CX4 interface clock ppm offset, 0=100ppm (default), 1=300ppm");
|
||||||
@ -1642,25 +1635,6 @@ static void nes_rq_wqes_timeout(unsigned long parm)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int nes_lro_get_skb_hdr(struct sk_buff *skb, void **iphdr,
|
|
||||||
void **tcph, u64 *hdr_flags, void *priv)
|
|
||||||
{
|
|
||||||
unsigned int ip_len;
|
|
||||||
struct iphdr *iph;
|
|
||||||
skb_reset_network_header(skb);
|
|
||||||
iph = ip_hdr(skb);
|
|
||||||
if (iph->protocol != IPPROTO_TCP)
|
|
||||||
return -1;
|
|
||||||
ip_len = ip_hdrlen(skb);
|
|
||||||
skb_set_transport_header(skb, ip_len);
|
|
||||||
*tcph = tcp_hdr(skb);
|
|
||||||
|
|
||||||
*hdr_flags = LRO_IPV4 | LRO_TCP;
|
|
||||||
*iphdr = iph;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* nes_init_nic_qp
|
* nes_init_nic_qp
|
||||||
*/
|
*/
|
||||||
@ -1895,14 +1869,6 @@ int nes_init_nic_qp(struct nes_device *nesdev, struct net_device *netdev)
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
nesvnic->lro_mgr.max_aggr = nes_lro_max_aggr;
|
|
||||||
nesvnic->lro_mgr.max_desc = NES_MAX_LRO_DESCRIPTORS;
|
|
||||||
nesvnic->lro_mgr.lro_arr = nesvnic->lro_desc;
|
|
||||||
nesvnic->lro_mgr.get_skb_header = nes_lro_get_skb_hdr;
|
|
||||||
nesvnic->lro_mgr.features = LRO_F_NAPI | LRO_F_EXTRACT_VLAN_ID;
|
|
||||||
nesvnic->lro_mgr.dev = netdev;
|
|
||||||
nesvnic->lro_mgr.ip_summed = CHECKSUM_UNNECESSARY;
|
|
||||||
nesvnic->lro_mgr.ip_summed_aggr = CHECKSUM_UNNECESSARY;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2809,13 +2775,10 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq)
|
|||||||
u16 pkt_type;
|
u16 pkt_type;
|
||||||
u16 rqes_processed = 0;
|
u16 rqes_processed = 0;
|
||||||
u8 sq_cqes = 0;
|
u8 sq_cqes = 0;
|
||||||
u8 nes_use_lro = 0;
|
|
||||||
|
|
||||||
head = cq->cq_head;
|
head = cq->cq_head;
|
||||||
cq_size = cq->cq_size;
|
cq_size = cq->cq_size;
|
||||||
cq->cqes_pending = 1;
|
cq->cqes_pending = 1;
|
||||||
if (nesvnic->netdev->features & NETIF_F_LRO)
|
|
||||||
nes_use_lro = 1;
|
|
||||||
do {
|
do {
|
||||||
if (le32_to_cpu(cq->cq_vbase[head].cqe_words[NES_NIC_CQE_MISC_IDX]) &
|
if (le32_to_cpu(cq->cq_vbase[head].cqe_words[NES_NIC_CQE_MISC_IDX]) &
|
||||||
NES_NIC_CQE_VALID) {
|
NES_NIC_CQE_VALID) {
|
||||||
@ -2950,10 +2913,7 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq)
|
|||||||
|
|
||||||
__vlan_hwaccel_put_tag(rx_skb, htons(ETH_P_8021Q), vlan_tag);
|
__vlan_hwaccel_put_tag(rx_skb, htons(ETH_P_8021Q), vlan_tag);
|
||||||
}
|
}
|
||||||
if (nes_use_lro)
|
napi_gro_receive(&nesvnic->napi, rx_skb);
|
||||||
lro_receive_skb(&nesvnic->lro_mgr, rx_skb, NULL);
|
|
||||||
else
|
|
||||||
netif_receive_skb(rx_skb);
|
|
||||||
|
|
||||||
skip_rx_indicate0:
|
skip_rx_indicate0:
|
||||||
;
|
;
|
||||||
@ -2984,8 +2944,6 @@ skip_rx_indicate0:
|
|||||||
|
|
||||||
} while (1);
|
} while (1);
|
||||||
|
|
||||||
if (nes_use_lro)
|
|
||||||
lro_flush_all(&nesvnic->lro_mgr);
|
|
||||||
if (sq_cqes) {
|
if (sq_cqes) {
|
||||||
barrier();
|
barrier();
|
||||||
/* restart the queue if it had been stopped */
|
/* restart the queue if it had been stopped */
|
||||||
|
@ -33,8 +33,6 @@
|
|||||||
#ifndef __NES_HW_H
|
#ifndef __NES_HW_H
|
||||||
#define __NES_HW_H
|
#define __NES_HW_H
|
||||||
|
|
||||||
#include <linux/inet_lro.h>
|
|
||||||
|
|
||||||
#define NES_PHY_TYPE_CX4 1
|
#define NES_PHY_TYPE_CX4 1
|
||||||
#define NES_PHY_TYPE_1G 2
|
#define NES_PHY_TYPE_1G 2
|
||||||
#define NES_PHY_TYPE_ARGUS 4
|
#define NES_PHY_TYPE_ARGUS 4
|
||||||
@ -1049,8 +1047,6 @@ struct nes_hw_tune_timer {
|
|||||||
#define NES_TIMER_ENABLE_LIMIT 4
|
#define NES_TIMER_ENABLE_LIMIT 4
|
||||||
#define NES_MAX_LINK_INTERRUPTS 128
|
#define NES_MAX_LINK_INTERRUPTS 128
|
||||||
#define NES_MAX_LINK_CHECK 200
|
#define NES_MAX_LINK_CHECK 200
|
||||||
#define NES_MAX_LRO_DESCRIPTORS 32
|
|
||||||
#define NES_LRO_MAX_AGGR 64
|
|
||||||
|
|
||||||
struct nes_adapter {
|
struct nes_adapter {
|
||||||
u64 fw_ver;
|
u64 fw_ver;
|
||||||
@ -1263,9 +1259,6 @@ struct nes_vnic {
|
|||||||
u8 next_qp_nic_index;
|
u8 next_qp_nic_index;
|
||||||
u8 of_device_registered;
|
u8 of_device_registered;
|
||||||
u8 rdma_enabled;
|
u8 rdma_enabled;
|
||||||
u32 lro_max_aggr;
|
|
||||||
struct net_lro_mgr lro_mgr;
|
|
||||||
struct net_lro_desc lro_desc[NES_MAX_LRO_DESCRIPTORS];
|
|
||||||
struct timer_list event_timer;
|
struct timer_list event_timer;
|
||||||
enum ib_event_type delayed_event;
|
enum ib_event_type delayed_event;
|
||||||
enum ib_event_type last_dispatched_event;
|
enum ib_event_type last_dispatched_event;
|
||||||
|
@ -1085,9 +1085,6 @@ static const char nes_ethtool_stringset[][ETH_GSTRING_LEN] = {
|
|||||||
"Free 4Kpbls",
|
"Free 4Kpbls",
|
||||||
"Free 256pbls",
|
"Free 256pbls",
|
||||||
"Timer Inits",
|
"Timer Inits",
|
||||||
"LRO aggregated",
|
|
||||||
"LRO flushed",
|
|
||||||
"LRO no_desc",
|
|
||||||
"PAU CreateQPs",
|
"PAU CreateQPs",
|
||||||
"PAU DestroyQPs",
|
"PAU DestroyQPs",
|
||||||
};
|
};
|
||||||
@ -1302,9 +1299,6 @@ static void nes_netdev_get_ethtool_stats(struct net_device *netdev,
|
|||||||
target_stat_values[++index] = nesadapter->free_4kpbl;
|
target_stat_values[++index] = nesadapter->free_4kpbl;
|
||||||
target_stat_values[++index] = nesadapter->free_256pbl;
|
target_stat_values[++index] = nesadapter->free_256pbl;
|
||||||
target_stat_values[++index] = int_mod_timer_init;
|
target_stat_values[++index] = int_mod_timer_init;
|
||||||
target_stat_values[++index] = nesvnic->lro_mgr.stats.aggregated;
|
|
||||||
target_stat_values[++index] = nesvnic->lro_mgr.stats.flushed;
|
|
||||||
target_stat_values[++index] = nesvnic->lro_mgr.stats.no_desc;
|
|
||||||
target_stat_values[++index] = atomic_read(&pau_qps_created);
|
target_stat_values[++index] = atomic_read(&pau_qps_created);
|
||||||
target_stat_values[++index] = atomic_read(&pau_qps_destroyed);
|
target_stat_values[++index] = atomic_read(&pau_qps_destroyed);
|
||||||
}
|
}
|
||||||
@ -1709,7 +1703,6 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev,
|
|||||||
netdev->hw_features |= NETIF_F_TSO;
|
netdev->hw_features |= NETIF_F_TSO;
|
||||||
|
|
||||||
netdev->features = netdev->hw_features | NETIF_F_HIGHDMA | NETIF_F_HW_VLAN_CTAG_TX;
|
netdev->features = netdev->hw_features | NETIF_F_HIGHDMA | NETIF_F_HW_VLAN_CTAG_TX;
|
||||||
netdev->hw_features |= NETIF_F_LRO;
|
|
||||||
|
|
||||||
nes_debug(NES_DBG_INIT, "nesvnic = %p, reported features = 0x%lX, QPid = %d,"
|
nes_debug(NES_DBG_INIT, "nesvnic = %p, reported features = 0x%lX, QPid = %d,"
|
||||||
" nic_index = %d, logical_port = %d, mac_index = %d.\n",
|
" nic_index = %d, logical_port = %d, mac_index = %d.\n",
|
||||||
|
Loading…
Reference in New Issue
Block a user