2020-07-22 22:15:56

by Alexander Lobakin

[permalink] [raw]
Subject: [PATCH v2 net-next 00/15] qed, qede: improve chain API and add XDP_REDIRECT support

This series adds missing XDP_REDIRECT case handling in QLogic Everest
Ethernet driver with all necessary prerequisites and ops.
QEDE Tx relies heavily on chain API, so make sure it is in its best
at first.

v2 (from [1]):
- add missing includes to #003 to pass the build on Alpha;
- no functional changes.

[1] https://lore.kernel.org/netdev/[email protected]/

Alexander Lobakin (15):
qed: reformat "qed_chain.h" a bit
qed: reformat Makefile
qed: move chain methods to a separate file
qed: prevent possible double-frees of the chains
qed: sanitize PBL chains allocation
qed: move chain initialization inlines next to allocation functions
qed: simplify initialization of the chains with an external PBL
qed: simplify chain allocation with init params struct
qed: add support for different page sizes for chains
qed: optimize common chain accessors
qed: introduce qed_chain_get_elem_used{,u32}()
qede: reformat several structures in "qede.h"
qede: reformat net_device_ops declarations
qede: refactor XDP Tx processing
qede: add .ndo_xdp_xmit() and XDP_REDIRECT support

drivers/infiniband/hw/qedr/main.c | 20 +-
drivers/infiniband/hw/qedr/verbs.c | 97 ++---
drivers/net/ethernet/qlogic/qed/Makefile | 37 +-
drivers/net/ethernet/qlogic/qed/qed_chain.c | 369 ++++++++++++++++++
drivers/net/ethernet/qlogic/qed/qed_dev.c | 273 -------------
drivers/net/ethernet/qlogic/qed/qed_dev_api.h | 32 +-
drivers/net/ethernet/qlogic/qed/qed_iscsi.c | 39 +-
drivers/net/ethernet/qlogic/qed/qed_ll2.c | 44 ++-
.../net/ethernet/qlogic/qed/qed_sp_commands.c | 4 +-
drivers/net/ethernet/qlogic/qed/qed_spq.c | 90 +++--
drivers/net/ethernet/qlogic/qede/qede.h | 175 +++++----
drivers/net/ethernet/qlogic/qede/qede_fp.c | 174 ++++++---
drivers/net/ethernet/qlogic/qede/qede_main.c | 185 +++++----
include/linux/qed/qed_chain.h | 328 ++++++----------
include/linux/qed/qed_if.h | 9 +-
15 files changed, 1018 insertions(+), 858 deletions(-)
create mode 100644 drivers/net/ethernet/qlogic/qed/qed_chain.c

--

Netdev folks, could you please take the entire series through your tree
after the necessary acks and reviews? Patches 8-9 also touch qedr driver
under rdma tree, but these changes can't be separated as it would break
incremental buildability and bisecting.

--
2.25.1


2020-07-22 22:16:10

by Alexander Lobakin

[permalink] [raw]
Subject: [PATCH v2 net-next 13/15] qede: reformat net_device_ops declarations

Correct the indentation of net_device_ops declarations for fancier look.

Signed-off-by: Alexander Lobakin <[email protected]>
Signed-off-by: Igor Russkikh <[email protected]>
Signed-off-by: Michal Kalderon <[email protected]>
---
drivers/net/ethernet/qlogic/qede/qede_main.c | 122 +++++++++----------
1 file changed, 61 insertions(+), 61 deletions(-)

diff --git a/drivers/net/ethernet/qlogic/qede/qede_main.c b/drivers/net/ethernet/qlogic/qede/qede_main.c
index b5a95f165520..92bcdfa27961 100644
--- a/drivers/net/ethernet/qlogic/qede/qede_main.c
+++ b/drivers/net/ethernet/qlogic/qede/qede_main.c
@@ -639,79 +639,79 @@ qede_setup_tc_offload(struct net_device *dev, enum tc_setup_type type,
}

static const struct net_device_ops qede_netdev_ops = {
- .ndo_open = qede_open,
- .ndo_stop = qede_close,
- .ndo_start_xmit = qede_start_xmit,
- .ndo_select_queue = qede_select_queue,
- .ndo_set_rx_mode = qede_set_rx_mode,
- .ndo_set_mac_address = qede_set_mac_addr,
- .ndo_validate_addr = eth_validate_addr,
- .ndo_change_mtu = qede_change_mtu,
- .ndo_do_ioctl = qede_ioctl,
- .ndo_tx_timeout = qede_tx_timeout,
+ .ndo_open = qede_open,
+ .ndo_stop = qede_close,
+ .ndo_start_xmit = qede_start_xmit,
+ .ndo_select_queue = qede_select_queue,
+ .ndo_set_rx_mode = qede_set_rx_mode,
+ .ndo_set_mac_address = qede_set_mac_addr,
+ .ndo_validate_addr = eth_validate_addr,
+ .ndo_change_mtu = qede_change_mtu,
+ .ndo_do_ioctl = qede_ioctl,
+ .ndo_tx_timeout = qede_tx_timeout,
#ifdef CONFIG_QED_SRIOV
- .ndo_set_vf_mac = qede_set_vf_mac,
- .ndo_set_vf_vlan = qede_set_vf_vlan,
- .ndo_set_vf_trust = qede_set_vf_trust,
+ .ndo_set_vf_mac = qede_set_vf_mac,
+ .ndo_set_vf_vlan = qede_set_vf_vlan,
+ .ndo_set_vf_trust = qede_set_vf_trust,
#endif
- .ndo_vlan_rx_add_vid = qede_vlan_rx_add_vid,
- .ndo_vlan_rx_kill_vid = qede_vlan_rx_kill_vid,
- .ndo_fix_features = qede_fix_features,
- .ndo_set_features = qede_set_features,
- .ndo_get_stats64 = qede_get_stats64,
+ .ndo_vlan_rx_add_vid = qede_vlan_rx_add_vid,
+ .ndo_vlan_rx_kill_vid = qede_vlan_rx_kill_vid,
+ .ndo_fix_features = qede_fix_features,
+ .ndo_set_features = qede_set_features,
+ .ndo_get_stats64 = qede_get_stats64,
#ifdef CONFIG_QED_SRIOV
- .ndo_set_vf_link_state = qede_set_vf_link_state,
- .ndo_set_vf_spoofchk = qede_set_vf_spoofchk,
- .ndo_get_vf_config = qede_get_vf_config,
- .ndo_set_vf_rate = qede_set_vf_rate,
+ .ndo_set_vf_link_state = qede_set_vf_link_state,
+ .ndo_set_vf_spoofchk = qede_set_vf_spoofchk,
+ .ndo_get_vf_config = qede_get_vf_config,
+ .ndo_set_vf_rate = qede_set_vf_rate,
#endif
- .ndo_udp_tunnel_add = udp_tunnel_nic_add_port,
- .ndo_udp_tunnel_del = udp_tunnel_nic_del_port,
- .ndo_features_check = qede_features_check,
- .ndo_bpf = qede_xdp,
+ .ndo_udp_tunnel_add = udp_tunnel_nic_add_port,
+ .ndo_udp_tunnel_del = udp_tunnel_nic_del_port,
+ .ndo_features_check = qede_features_check,
+ .ndo_bpf = qede_xdp,
#ifdef CONFIG_RFS_ACCEL
- .ndo_rx_flow_steer = qede_rx_flow_steer,
+ .ndo_rx_flow_steer = qede_rx_flow_steer,
#endif
- .ndo_setup_tc = qede_setup_tc_offload,
+ .ndo_setup_tc = qede_setup_tc_offload,
};

static const struct net_device_ops qede_netdev_vf_ops = {
- .ndo_open = qede_open,
- .ndo_stop = qede_close,
- .ndo_start_xmit = qede_start_xmit,
- .ndo_select_queue = qede_select_queue,
- .ndo_set_rx_mode = qede_set_rx_mode,
- .ndo_set_mac_address = qede_set_mac_addr,
- .ndo_validate_addr = eth_validate_addr,
- .ndo_change_mtu = qede_change_mtu,
- .ndo_vlan_rx_add_vid = qede_vlan_rx_add_vid,
- .ndo_vlan_rx_kill_vid = qede_vlan_rx_kill_vid,
- .ndo_fix_features = qede_fix_features,
- .ndo_set_features = qede_set_features,
- .ndo_get_stats64 = qede_get_stats64,
- .ndo_udp_tunnel_add = udp_tunnel_nic_add_port,
- .ndo_udp_tunnel_del = udp_tunnel_nic_del_port,
- .ndo_features_check = qede_features_check,
+ .ndo_open = qede_open,
+ .ndo_stop = qede_close,
+ .ndo_start_xmit = qede_start_xmit,
+ .ndo_select_queue = qede_select_queue,
+ .ndo_set_rx_mode = qede_set_rx_mode,
+ .ndo_set_mac_address = qede_set_mac_addr,
+ .ndo_validate_addr = eth_validate_addr,
+ .ndo_change_mtu = qede_change_mtu,
+ .ndo_vlan_rx_add_vid = qede_vlan_rx_add_vid,
+ .ndo_vlan_rx_kill_vid = qede_vlan_rx_kill_vid,
+ .ndo_fix_features = qede_fix_features,
+ .ndo_set_features = qede_set_features,
+ .ndo_get_stats64 = qede_get_stats64,
+ .ndo_udp_tunnel_add = udp_tunnel_nic_add_port,
+ .ndo_udp_tunnel_del = udp_tunnel_nic_del_port,
+ .ndo_features_check = qede_features_check,
};

static const struct net_device_ops qede_netdev_vf_xdp_ops = {
- .ndo_open = qede_open,
- .ndo_stop = qede_close,
- .ndo_start_xmit = qede_start_xmit,
- .ndo_select_queue = qede_select_queue,
- .ndo_set_rx_mode = qede_set_rx_mode,
- .ndo_set_mac_address = qede_set_mac_addr,
- .ndo_validate_addr = eth_validate_addr,
- .ndo_change_mtu = qede_change_mtu,
- .ndo_vlan_rx_add_vid = qede_vlan_rx_add_vid,
- .ndo_vlan_rx_kill_vid = qede_vlan_rx_kill_vid,
- .ndo_fix_features = qede_fix_features,
- .ndo_set_features = qede_set_features,
- .ndo_get_stats64 = qede_get_stats64,
- .ndo_udp_tunnel_add = udp_tunnel_nic_add_port,
- .ndo_udp_tunnel_del = udp_tunnel_nic_del_port,
- .ndo_features_check = qede_features_check,
- .ndo_bpf = qede_xdp,
+ .ndo_open = qede_open,
+ .ndo_stop = qede_close,
+ .ndo_start_xmit = qede_start_xmit,
+ .ndo_select_queue = qede_select_queue,
+ .ndo_set_rx_mode = qede_set_rx_mode,
+ .ndo_set_mac_address = qede_set_mac_addr,
+ .ndo_validate_addr = eth_validate_addr,
+ .ndo_change_mtu = qede_change_mtu,
+ .ndo_vlan_rx_add_vid = qede_vlan_rx_add_vid,
+ .ndo_vlan_rx_kill_vid = qede_vlan_rx_kill_vid,
+ .ndo_fix_features = qede_fix_features,
+ .ndo_set_features = qede_set_features,
+ .ndo_get_stats64 = qede_get_stats64,
+ .ndo_udp_tunnel_add = udp_tunnel_nic_add_port,
+ .ndo_udp_tunnel_del = udp_tunnel_nic_del_port,
+ .ndo_features_check = qede_features_check,
+ .ndo_bpf = qede_xdp,
};

/* -------------------------------------------------------------------------
--
2.25.1

2020-07-22 22:16:10

by Alexander Lobakin

[permalink] [raw]
Subject: [PATCH v2 net-next 09/15] qed: add support for different page sizes for chains

Extend current infrastructure to store chain page size in a struct
and use it in all functions instead of fixed QED_CHAIN_PAGE_SIZE.
Its value remains the default one, but can be overridden in
qed_chain_init_params before chain allocation.

Signed-off-by: Alexander Lobakin <[email protected]>
Signed-off-by: Igor Russkikh <[email protected]>
Signed-off-by: Michal Kalderon <[email protected]>
---
drivers/infiniband/hw/qedr/verbs.c | 2 ++
drivers/net/ethernet/qlogic/qed/qed_chain.c | 28 +++++++++++++--------
include/linux/qed/qed_chain.h | 21 ++++++++++------
3 files changed, 33 insertions(+), 18 deletions(-)

diff --git a/drivers/infiniband/hw/qedr/verbs.c b/drivers/infiniband/hw/qedr/verbs.c
index 6737895a0d68..49b8a43e3fa2 100644
--- a/drivers/infiniband/hw/qedr/verbs.c
+++ b/drivers/infiniband/hw/qedr/verbs.c
@@ -1960,9 +1960,11 @@ qedr_iwarp_create_kernel_qp(struct qedr_dev *dev,

in_params->sq_num_pages = QED_CHAIN_PAGE_CNT(n_sq_elems,
QEDR_SQE_ELEMENT_SIZE,
+ QED_CHAIN_PAGE_SIZE,
QED_CHAIN_MODE_PBL);
in_params->rq_num_pages = QED_CHAIN_PAGE_CNT(n_rq_elems,
QEDR_RQE_ELEMENT_SIZE,
+ QED_CHAIN_PAGE_SIZE,
QED_CHAIN_MODE_PBL);

qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx,
diff --git a/drivers/net/ethernet/qlogic/qed/qed_chain.c b/drivers/net/ethernet/qlogic/qed/qed_chain.c
index a68ee4b3dbbc..f8efd36d66e0 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_chain.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_chain.c
@@ -18,8 +18,10 @@ static void qed_chain_init(struct qed_chain *chain,
chain->mode = params->mode;
chain->cnt_type = params->cnt_type;

- chain->elem_per_page = ELEMS_PER_PAGE(params->elem_size);
+ chain->elem_per_page = ELEMS_PER_PAGE(params->elem_size,
+ params->page_size);
chain->usable_per_page = USABLE_ELEMS_PER_PAGE(params->elem_size,
+ params->page_size,
params->mode);
chain->elem_unusable = UNUSABLE_ELEMS_PER_PAGE(params->elem_size,
params->mode);
@@ -28,6 +30,7 @@ static void qed_chain_init(struct qed_chain *chain,
chain->next_page_mask = chain->usable_per_page &
chain->elem_per_page_mask;

+ chain->page_size = params->page_size;
chain->page_cnt = page_cnt;
chain->capacity = chain->usable_per_page * page_cnt;
chain->size = chain->elem_per_page * page_cnt;
@@ -82,7 +85,7 @@ static void qed_chain_free_next_ptr(struct qed_dev *cdev,
virt_next = next->next_virt;
phys_next = HILO_DMA_REGPAIR(next->next_phys);

- dma_free_coherent(dev, QED_CHAIN_PAGE_SIZE, virt, phys);
+ dma_free_coherent(dev, chain->page_size, virt, phys);

virt = virt_next;
phys = phys_next;
@@ -95,7 +98,7 @@ static void qed_chain_free_single(struct qed_dev *cdev,
if (!chain->p_virt_addr)
return;

- dma_free_coherent(&cdev->pdev->dev, QED_CHAIN_PAGE_SIZE,
+ dma_free_coherent(&cdev->pdev->dev, chain->page_size,
chain->p_virt_addr, chain->p_phys_addr);
}

@@ -113,7 +116,7 @@ static void qed_chain_free_pbl(struct qed_dev *cdev, struct qed_chain *chain)
if (!entry->virt_addr)
break;

- dma_free_coherent(dev, QED_CHAIN_PAGE_SIZE, entry->virt_addr,
+ dma_free_coherent(dev, chain->page_size, entry->virt_addr,
entry->dma_map);
}

@@ -158,7 +161,7 @@ qed_chain_alloc_sanity_check(struct qed_dev *cdev,
{
u64 chain_size;

- chain_size = ELEMS_PER_PAGE(params->elem_size);
+ chain_size = ELEMS_PER_PAGE(params->elem_size, params->page_size);
chain_size *= page_cnt;

if (!chain_size)
@@ -201,7 +204,7 @@ static int qed_chain_alloc_next_ptr(struct qed_dev *cdev,
u32 i;

for (i = 0; i < chain->page_cnt; i++) {
- virt = dma_alloc_coherent(dev, QED_CHAIN_PAGE_SIZE, &phys,
+ virt = dma_alloc_coherent(dev, chain->page_size, &phys,
GFP_KERNEL);
if (!virt)
return -ENOMEM;
@@ -232,7 +235,7 @@ static int qed_chain_alloc_single(struct qed_dev *cdev,
dma_addr_t phys;
void *virt;

- virt = dma_alloc_coherent(&cdev->pdev->dev, QED_CHAIN_PAGE_SIZE,
+ virt = dma_alloc_coherent(&cdev->pdev->dev, chain->page_size,
&phys, GFP_KERNEL);
if (!virt)
return -ENOMEM;
@@ -282,7 +285,7 @@ static int qed_chain_alloc_pbl(struct qed_dev *cdev, struct qed_chain *chain)

alloc_pages:
for (i = 0; i < page_cnt; i++) {
- virt = dma_alloc_coherent(dev, QED_CHAIN_PAGE_SIZE, &phys,
+ virt = dma_alloc_coherent(dev, chain->page_size, &phys,
GFP_KERNEL);
if (!virt)
return -ENOMEM;
@@ -318,11 +321,15 @@ int qed_chain_alloc(struct qed_dev *cdev, struct qed_chain *chain,
u32 page_cnt;
int rc;

+ if (!params->page_size)
+ params->page_size = QED_CHAIN_PAGE_SIZE;
+
if (params->mode == QED_CHAIN_MODE_SINGLE)
page_cnt = 1;
else
page_cnt = QED_CHAIN_PAGE_CNT(params->num_elems,
params->elem_size,
+ params->page_size,
params->mode);

rc = qed_chain_alloc_sanity_check(cdev, params, page_cnt);
@@ -330,9 +337,10 @@ int qed_chain_alloc(struct qed_dev *cdev, struct qed_chain *chain,
DP_NOTICE(cdev,
"Cannot allocate a chain with the given arguments:\n");
DP_NOTICE(cdev,
- "[use_mode %d, mode %d, cnt_type %d, num_elems %d, elem_size %zu]\n",
+ "[use_mode %d, mode %d, cnt_type %d, num_elems %d, elem_size %zu, page_size %u]\n",
params->intended_use, params->mode, params->cnt_type,
- params->num_elems, params->elem_size);
+ params->num_elems, params->elem_size,
+ params->page_size);
return rc;
}

diff --git a/include/linux/qed/qed_chain.h b/include/linux/qed/qed_chain.h
index f5cfee0934e5..8a96c361cc19 100644
--- a/include/linux/qed/qed_chain.h
+++ b/include/linux/qed/qed_chain.h
@@ -11,6 +11,7 @@
#include <asm/byteorder.h>
#include <linux/kernel.h>
#include <linux/list.h>
+#include <linux/sizes.h>
#include <linux/slab.h>
#include <linux/qed/common_hsi.h>

@@ -120,6 +121,8 @@ struct qed_chain {
* but isn't involved in regular functionality.
*/

+ u32 page_size;
+
/* Base address of a pre-allocated buffer for pbl */
struct {
__le64 *table_virt;
@@ -147,6 +150,7 @@ struct qed_chain_init_params {
enum qed_chain_use_mode intended_use;
enum qed_chain_cnt_type cnt_type;

+ u32 page_size;
u32 num_elems;
size_t elem_size;

@@ -154,22 +158,23 @@ struct qed_chain_init_params {
dma_addr_t ext_pbl_phys;
};

-#define QED_CHAIN_PAGE_SIZE 0x1000
+#define QED_CHAIN_PAGE_SIZE SZ_4K

-#define ELEMS_PER_PAGE(elem_size) \
- (QED_CHAIN_PAGE_SIZE / (elem_size))
+#define ELEMS_PER_PAGE(elem_size, page_size) \
+ ((page_size) / (elem_size))

#define UNUSABLE_ELEMS_PER_PAGE(elem_size, mode) \
(((mode) == QED_CHAIN_MODE_NEXT_PTR) ? \
(u8)(1 + ((sizeof(struct qed_chain_next) - 1) / (elem_size))) : \
0)

-#define USABLE_ELEMS_PER_PAGE(elem_size, mode) \
- ((u32)(ELEMS_PER_PAGE(elem_size) - \
+#define USABLE_ELEMS_PER_PAGE(elem_size, page_size, mode) \
+ ((u32)(ELEMS_PER_PAGE((elem_size), (page_size)) - \
UNUSABLE_ELEMS_PER_PAGE((elem_size), (mode))))

-#define QED_CHAIN_PAGE_CNT(elem_cnt, elem_size, mode) \
- DIV_ROUND_UP((elem_cnt), USABLE_ELEMS_PER_PAGE((elem_size), (mode)))
+#define QED_CHAIN_PAGE_CNT(elem_cnt, elem_size, page_size, mode) \
+ DIV_ROUND_UP((elem_cnt), \
+ USABLE_ELEMS_PER_PAGE((elem_size), (page_size), (mode)))

#define is_chain_u16(p) \
((p)->cnt_type == QED_CHAIN_CNT_TYPE_U16)
@@ -604,7 +609,7 @@ static inline void qed_chain_pbl_zero_mem(struct qed_chain *p_chain)

for (i = 0; i < page_cnt; i++)
memset(p_chain->pbl.pp_addr_tbl[i].virt_addr, 0,
- QED_CHAIN_PAGE_SIZE);
+ p_chain->page_size);
}

#endif
--
2.25.1

2020-07-22 22:17:21

by Alexander Lobakin

[permalink] [raw]
Subject: [PATCH v2 net-next 01/15] qed: reformat "qed_chain.h" a bit

Reformat structs and macros definitions a bit prior to making functional
changes.

Signed-off-by: Alexander Lobakin <[email protected]>
Signed-off-by: Igor Russkikh <[email protected]>
Signed-off-by: Michal Kalderon <[email protected]>
---
include/linux/qed/qed_chain.h | 126 ++++++++++++++++++----------------
1 file changed, 66 insertions(+), 60 deletions(-)

diff --git a/include/linux/qed/qed_chain.h b/include/linux/qed/qed_chain.h
index 7071dc92b4e2..087073517c09 100644
--- a/include/linux/qed/qed_chain.h
+++ b/include/linux/qed/qed_chain.h
@@ -26,9 +26,9 @@ enum qed_chain_mode {
};

enum qed_chain_use_mode {
- QED_CHAIN_USE_TO_PRODUCE, /* Chain starts empty */
- QED_CHAIN_USE_TO_CONSUME, /* Chain starts full */
- QED_CHAIN_USE_TO_CONSUME_PRODUCE, /* Chain starts empty */
+ QED_CHAIN_USE_TO_PRODUCE, /* Chain starts empty */
+ QED_CHAIN_USE_TO_CONSUME, /* Chain starts full */
+ QED_CHAIN_USE_TO_CONSUME_PRODUCE, /* Chain starts empty */
};

enum qed_chain_cnt_type {
@@ -40,84 +40,86 @@ enum qed_chain_cnt_type {
};

struct qed_chain_next {
- struct regpair next_phys;
- void *next_virt;
+ struct regpair next_phys;
+ void *next_virt;
};

struct qed_chain_pbl_u16 {
- u16 prod_page_idx;
- u16 cons_page_idx;
+ u16 prod_page_idx;
+ u16 cons_page_idx;
};

struct qed_chain_pbl_u32 {
- u32 prod_page_idx;
- u32 cons_page_idx;
+ u32 prod_page_idx;
+ u32 cons_page_idx;
};

struct qed_chain_ext_pbl {
- dma_addr_t p_pbl_phys;
- void *p_pbl_virt;
+ dma_addr_t p_pbl_phys;
+ void *p_pbl_virt;
};

struct qed_chain_u16 {
/* Cyclic index of next element to produce/consme */
- u16 prod_idx;
- u16 cons_idx;
+ u16 prod_idx;
+ u16 cons_idx;
};

struct qed_chain_u32 {
/* Cyclic index of next element to produce/consme */
- u32 prod_idx;
- u32 cons_idx;
+ u32 prod_idx;
+ u32 cons_idx;
};

struct addr_tbl_entry {
- void *virt_addr;
- dma_addr_t dma_map;
+ void *virt_addr;
+ dma_addr_t dma_map;
};

struct qed_chain {
- /* fastpath portion of the chain - required for commands such
+ /* Fastpath portion of the chain - required for commands such
* as produce / consume.
*/
+
/* Point to next element to produce/consume */
- void *p_prod_elem;
- void *p_cons_elem;
+ void *p_prod_elem;
+ void *p_cons_elem;

/* Fastpath portions of the PBL [if exists] */
+
struct {
/* Table for keeping the virtual and physical addresses of the
* chain pages, respectively to the physical addresses
* in the pbl table.
*/
- struct addr_tbl_entry *pp_addr_tbl;
+ struct addr_tbl_entry *pp_addr_tbl;

union {
- struct qed_chain_pbl_u16 u16;
- struct qed_chain_pbl_u32 u32;
- } c;
- } pbl;
+ struct qed_chain_pbl_u16 u16;
+ struct qed_chain_pbl_u32 u32;
+ } c;
+ } pbl;

union {
- struct qed_chain_u16 chain16;
- struct qed_chain_u32 chain32;
- } u;
+ struct qed_chain_u16 chain16;
+ struct qed_chain_u32 chain32;
+ } u;

/* Capacity counts only usable elements */
- u32 capacity;
- u32 page_cnt;
+ u32 capacity;
+ u32 page_cnt;

- enum qed_chain_mode mode;
+ enum qed_chain_mode mode;

/* Elements information for fast calculations */
- u16 elem_per_page;
- u16 elem_per_page_mask;
- u16 elem_size;
- u16 next_page_mask;
- u16 usable_per_page;
- u8 elem_unusable;
+ u16 elem_per_page;
+ u16 elem_per_page_mask;
+ u16 elem_size;
+ u16 next_page_mask;
+ u16 usable_per_page;
+ u8 elem_unusable;

- u8 cnt_type;
+ u8 cnt_type;

/* Slowpath of the chain - required for initialization and destruction,
* but isn't involved in regular functionality.
@@ -125,43 +127,47 @@ struct qed_chain {

/* Base address of a pre-allocated buffer for pbl */
struct {
- dma_addr_t p_phys_table;
- void *p_virt_table;
- } pbl_sp;
+ dma_addr_t p_phys_table;
+ void *p_virt_table;
+ } pbl_sp;

/* Address of first page of the chain - the address is required
* for fastpath operation [consume/produce] but only for the SINGLE
* flavour which isn't considered fastpath [== SPQ].
*/
- void *p_virt_addr;
- dma_addr_t p_phys_addr;
+ void *p_virt_addr;
+ dma_addr_t p_phys_addr;

/* Total number of elements [for entire chain] */
- u32 size;
+ u32 size;

- u8 intended_use;
+ u8 intended_use;

- bool b_external_pbl;
+ bool b_external_pbl;
};

-#define QED_CHAIN_PBL_ENTRY_SIZE (8)
-#define QED_CHAIN_PAGE_SIZE (0x1000)
-#define ELEMS_PER_PAGE(elem_size) (QED_CHAIN_PAGE_SIZE / (elem_size))
+#define QED_CHAIN_PBL_ENTRY_SIZE 8
+#define QED_CHAIN_PAGE_SIZE 0x1000
+
+#define ELEMS_PER_PAGE(elem_size) \
+ (QED_CHAIN_PAGE_SIZE / (elem_size))

-#define UNUSABLE_ELEMS_PER_PAGE(elem_size, mode) \
- (((mode) == QED_CHAIN_MODE_NEXT_PTR) ? \
- (u8)(1 + ((sizeof(struct qed_chain_next) - 1) / \
- (elem_size))) : 0)
+#define UNUSABLE_ELEMS_PER_PAGE(elem_size, mode) \
+ (((mode) == QED_CHAIN_MODE_NEXT_PTR) ? \
+ (u8)(1 + ((sizeof(struct qed_chain_next) - 1) / (elem_size))) : \
+ 0)

-#define USABLE_ELEMS_PER_PAGE(elem_size, mode) \
- ((u32)(ELEMS_PER_PAGE(elem_size) - \
- UNUSABLE_ELEMS_PER_PAGE(elem_size, mode)))
+#define USABLE_ELEMS_PER_PAGE(elem_size, mode) \
+ ((u32)(ELEMS_PER_PAGE(elem_size) - \
+ UNUSABLE_ELEMS_PER_PAGE((elem_size), (mode))))

-#define QED_CHAIN_PAGE_CNT(elem_cnt, elem_size, mode) \
- DIV_ROUND_UP(elem_cnt, USABLE_ELEMS_PER_PAGE(elem_size, mode))
+#define QED_CHAIN_PAGE_CNT(elem_cnt, elem_size, mode) \
+ DIV_ROUND_UP((elem_cnt), USABLE_ELEMS_PER_PAGE((elem_size), (mode)))

-#define is_chain_u16(p) ((p)->cnt_type == QED_CHAIN_CNT_TYPE_U16)
-#define is_chain_u32(p) ((p)->cnt_type == QED_CHAIN_CNT_TYPE_U32)
+#define is_chain_u16(p) \
+ ((p)->cnt_type == QED_CHAIN_CNT_TYPE_U16)
+#define is_chain_u32(p) \
+ ((p)->cnt_type == QED_CHAIN_CNT_TYPE_U32)

/* Accessors */
static inline u16 qed_chain_get_prod_idx(struct qed_chain *p_chain)
--
2.25.1

2020-07-22 22:34:01

by Jason Gunthorpe

[permalink] [raw]
Subject: Re: [PATCH v2 net-next 01/15] qed: reformat "qed_chain.h" a bit

On Thu, Jul 23, 2020 at 01:10:31AM +0300, Alexander Lobakin wrote:
> Reformat structs and macros definitions a bit prior to making functional
> changes.
>
> Signed-off-by: Alexander Lobakin <[email protected]>
> Signed-off-by: Igor Russkikh <[email protected]>
> Signed-off-by: Michal Kalderon <[email protected]>
> include/linux/qed/qed_chain.h | 126 ++++++++++++++++++----------------
> 1 file changed, 66 insertions(+), 60 deletions(-)
>
> diff --git a/include/linux/qed/qed_chain.h b/include/linux/qed/qed_chain.h
> index 7071dc92b4e2..087073517c09 100644
> +++ b/include/linux/qed/qed_chain.h
> @@ -26,9 +26,9 @@ enum qed_chain_mode {
> };
>
> enum qed_chain_use_mode {
> - QED_CHAIN_USE_TO_PRODUCE, /* Chain starts empty */
> - QED_CHAIN_USE_TO_CONSUME, /* Chain starts full */
> - QED_CHAIN_USE_TO_CONSUME_PRODUCE, /* Chain starts empty */
> + QED_CHAIN_USE_TO_PRODUCE, /* Chain starts empty */
> + QED_CHAIN_USE_TO_CONSUME, /* Chain starts full */
> + QED_CHAIN_USE_TO_CONSUME_PRODUCE, /* Chain starts empty */
> };
>
> enum qed_chain_cnt_type {
> @@ -40,84 +40,86 @@ enum qed_chain_cnt_type {
> };
>
> struct qed_chain_next {
> - struct regpair next_phys;
> - void *next_virt;
> + struct regpair next_phys;
> + void *next_virt;
> };

I'm surprised this is considered an improvement??

I've been encouring people to go the other way, maintaining vertical alignment is
harmful to backporting..

Jason

2020-07-22 22:38:56

by Jason Gunthorpe

[permalink] [raw]
Subject: Re: [PATCH v2 net-next 00/15] qed, qede: improve chain API and add XDP_REDIRECT support

On Thu, Jul 23, 2020 at 01:10:30AM +0300, Alexander Lobakin wrote:
> Netdev folks, could you please take the entire series through your tree
> after the necessary acks and reviews? Patches 8-9 also touch qedr driver
> under rdma tree, but these changes can't be separated as it would break
> incremental buildability and bisecting.

There is nothing significant in the rdma changes, just be wary to not
submit patches to the rdma tree that would cause conflicts

Thanks
Jason

2020-07-23 01:20:01

by David Miller

[permalink] [raw]
Subject: Re: [PATCH v2 net-next 00/15] qed, qede: improve chain API and add XDP_REDIRECT support

From: Alexander Lobakin <[email protected]>
Date: Thu, 23 Jul 2020 01:10:30 +0300

> This series adds missing XDP_REDIRECT case handling in QLogic Everest
> Ethernet driver with all necessary prerequisites and ops.
> QEDE Tx relies heavily on chain API, so make sure it is in its best
> at first.
>
> v2 (from [1]):
> - add missing includes to #003 to pass the build on Alpha;
> - no functional changes.
>
> [1] https://lore.kernel.org/netdev/[email protected]/

Series applied, thank you.