Skip to content

Commit 43bc981

Browse files
dtatuleaNipaLocal
authored andcommitted
net/mlx5e: SHAMPO, Fix header formulas for higher MTUs and 64K pages
The MLX5E_SHAMPO_WQ_HEADER_PER_PAGE and MLX5E_SHAMPO_LOG_MAX_HEADER_ENTRY_SIZE macros are used directly in several places under the assumption that there will always be more headers per WQE than headers per page. However, this assumption doesn't hold for 64K page sizes and higher MTUs (> 4K). This can be first observed during header page allocation: ksm_entries will become 0 during alignment to MLX5E_SHAMPO_WQ_HEADER_PER_PAGE. This patch introduces 2 additional members to the mlx5e_shampo_hd struct which are meant to be used instead of the macrose mentioned above. When the number of headers per WQE goes below MLX5E_SHAMPO_WQ_HEADER_PER_PAGE, clamp the number of headers per page and expand the header size accordingly so that the headers for one WQE cover a full page. All the formulas are adapted to use these two new members. Fixes: 945ca43 ("net/mlx5e: SHAMPO, Drop info array") Signed-off-by: Dragos Tatulea <[email protected]> Signed-off-by: Tariq Toukan <[email protected]> Signed-off-by: NipaLocal <nipa@local>
1 parent 8d5a094 commit 43bc981

File tree

3 files changed

+41
-19
lines changed

3 files changed

+41
-19
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,10 @@ struct mlx5e_dma_info {
634634
struct mlx5e_shampo_hd {
635635
struct mlx5e_frag_page *pages;
636636
u32 hd_per_wq;
637+
u32 hd_per_page;
637638
u16 hd_per_wqe;
639+
u8 log_hd_per_page;
640+
u8 log_hd_entry_size;
638641
unsigned long *bitmap;
639642
u16 pi;
640643
u16 ci;

drivers/net/ethernet/mellanox/mlx5/core/en_main.c

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -791,8 +791,9 @@ static int mlx5_rq_shampo_alloc(struct mlx5_core_dev *mdev,
791791
int node)
792792
{
793793
void *wqc = MLX5_ADDR_OF(rqc, rqp->rqc, wq);
794+
u8 log_hd_per_page, log_hd_entry_size;
795+
u16 hd_per_wq, hd_per_wqe;
794796
u32 hd_pool_size;
795-
u16 hd_per_wq;
796797
int wq_size;
797798
int err;
798799

@@ -815,11 +816,24 @@ static int mlx5_rq_shampo_alloc(struct mlx5_core_dev *mdev,
815816
if (err)
816817
goto err_umr_mkey;
817818

818-
rq->mpwqe.shampo->hd_per_wqe =
819-
mlx5e_shampo_hd_per_wqe(mdev, params, rqp);
819+
hd_per_wqe = mlx5e_shampo_hd_per_wqe(mdev, params, rqp);
820820
wq_size = BIT(MLX5_GET(wq, wqc, log_wq_sz));
821-
hd_pool_size = (rq->mpwqe.shampo->hd_per_wqe * wq_size) /
822-
MLX5E_SHAMPO_WQ_HEADER_PER_PAGE;
821+
822+
BUILD_BUG_ON(MLX5E_SHAMPO_LOG_MAX_HEADER_ENTRY_SIZE > PAGE_SHIFT);
823+
if (hd_per_wqe >= MLX5E_SHAMPO_WQ_HEADER_PER_PAGE) {
824+
log_hd_per_page = MLX5E_SHAMPO_LOG_WQ_HEADER_PER_PAGE;
825+
log_hd_entry_size = MLX5E_SHAMPO_LOG_MAX_HEADER_ENTRY_SIZE;
826+
} else {
827+
log_hd_per_page = order_base_2(hd_per_wqe);
828+
log_hd_entry_size = order_base_2(PAGE_SIZE / hd_per_wqe);
829+
}
830+
831+
rq->mpwqe.shampo->hd_per_wqe = hd_per_wqe;
832+
rq->mpwqe.shampo->hd_per_page = BIT(log_hd_per_page);
833+
rq->mpwqe.shampo->log_hd_per_page = log_hd_per_page;
834+
rq->mpwqe.shampo->log_hd_entry_size = log_hd_entry_size;
835+
836+
hd_pool_size = (hd_per_wqe * wq_size) >> log_hd_per_page;
823837

824838
if (netif_rxq_has_unreadable_mp(rq->netdev, rq->ix)) {
825839
/* Separate page pool for shampo headers */

drivers/net/ethernet/mellanox/mlx5/core/en_rx.c

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -648,17 +648,20 @@ static void build_ksm_umr(struct mlx5e_icosq *sq, struct mlx5e_umr_wqe *umr_wqe,
648648
umr_wqe->hdr.uctrl.mkey_mask = cpu_to_be64(MLX5_MKEY_MASK_FREE);
649649
}
650650

651-
static struct mlx5e_frag_page *mlx5e_shampo_hd_to_frag_page(struct mlx5e_rq *rq, int header_index)
651+
static struct mlx5e_frag_page *mlx5e_shampo_hd_to_frag_page(struct mlx5e_rq *rq,
652+
int header_index)
652653
{
653-
BUILD_BUG_ON(MLX5E_SHAMPO_LOG_MAX_HEADER_ENTRY_SIZE > PAGE_SHIFT);
654+
struct mlx5e_shampo_hd *shampo = rq->mpwqe.shampo;
654655

655-
return &rq->mpwqe.shampo->pages[header_index >> MLX5E_SHAMPO_LOG_WQ_HEADER_PER_PAGE];
656+
return &shampo->pages[header_index >> shampo->log_hd_per_page];
656657
}
657658

658-
static u64 mlx5e_shampo_hd_offset(int header_index)
659+
static u64 mlx5e_shampo_hd_offset(struct mlx5e_rq *rq, int header_index)
659660
{
660-
return (header_index & (MLX5E_SHAMPO_WQ_HEADER_PER_PAGE - 1)) <<
661-
MLX5E_SHAMPO_LOG_MAX_HEADER_ENTRY_SIZE;
661+
struct mlx5e_shampo_hd *shampo = rq->mpwqe.shampo;
662+
u32 hd_per_page = shampo->hd_per_page;
663+
664+
return (header_index & (hd_per_page - 1)) << shampo->log_hd_entry_size;
662665
}
663666

664667
static void mlx5e_free_rx_shampo_hd_entry(struct mlx5e_rq *rq, u16 header_index);
@@ -684,7 +687,7 @@ static int mlx5e_build_shampo_hd_umr(struct mlx5e_rq *rq,
684687
u64 addr;
685688

686689
frag_page = mlx5e_shampo_hd_to_frag_page(rq, index);
687-
header_offset = mlx5e_shampo_hd_offset(index);
690+
header_offset = mlx5e_shampo_hd_offset(rq, index);
688691
if (!header_offset) {
689692
err = mlx5e_page_alloc_fragmented(rq->hd_page_pool,
690693
frag_page);
@@ -714,7 +717,7 @@ static int mlx5e_build_shampo_hd_umr(struct mlx5e_rq *rq,
714717
err_unmap:
715718
while (--i >= 0) {
716719
--index;
717-
header_offset = mlx5e_shampo_hd_offset(index);
720+
header_offset = mlx5e_shampo_hd_offset(rq, index);
718721
if (!header_offset) {
719722
struct mlx5e_frag_page *frag_page = mlx5e_shampo_hd_to_frag_page(rq, index);
720723

@@ -738,7 +741,7 @@ static int mlx5e_alloc_rx_hd_mpwqe(struct mlx5e_rq *rq)
738741
ksm_entries = bitmap_find_window(shampo->bitmap,
739742
shampo->hd_per_wqe,
740743
shampo->hd_per_wq, shampo->pi);
741-
ksm_entries = ALIGN_DOWN(ksm_entries, MLX5E_SHAMPO_WQ_HEADER_PER_PAGE);
744+
ksm_entries = ALIGN_DOWN(ksm_entries, shampo->hd_per_page);
742745
if (!ksm_entries)
743746
return 0;
744747

@@ -856,7 +859,7 @@ mlx5e_free_rx_shampo_hd_entry(struct mlx5e_rq *rq, u16 header_index)
856859
{
857860
struct mlx5e_shampo_hd *shampo = rq->mpwqe.shampo;
858861

859-
if (((header_index + 1) & (MLX5E_SHAMPO_WQ_HEADER_PER_PAGE - 1)) == 0) {
862+
if (((header_index + 1) & (shampo->hd_per_page - 1)) == 0) {
860863
struct mlx5e_frag_page *frag_page = mlx5e_shampo_hd_to_frag_page(rq, header_index);
861864

862865
mlx5e_page_release_fragmented(rq->hd_page_pool, frag_page);
@@ -1223,9 +1226,10 @@ static unsigned int mlx5e_lro_update_hdr(struct sk_buff *skb,
12231226
static void *mlx5e_shampo_get_packet_hd(struct mlx5e_rq *rq, u16 header_index)
12241227
{
12251228
struct mlx5e_frag_page *frag_page = mlx5e_shampo_hd_to_frag_page(rq, header_index);
1226-
u16 head_offset = mlx5e_shampo_hd_offset(header_index) + rq->buff.headroom;
1229+
u16 head_offset = mlx5e_shampo_hd_offset(rq, header_index);
1230+
void *addr = netmem_address(frag_page->netmem);
12271231

1228-
return netmem_address(frag_page->netmem) + head_offset;
1232+
return addr + head_offset + rq->buff.headroom;
12291233
}
12301234

12311235
static void mlx5e_shampo_update_ipv4_udp_hdr(struct mlx5e_rq *rq, struct iphdr *ipv4)
@@ -2265,7 +2269,8 @@ mlx5e_skb_from_cqe_shampo(struct mlx5e_rq *rq, struct mlx5e_mpw_info *wi,
22652269
struct mlx5_cqe64 *cqe, u16 header_index)
22662270
{
22672271
struct mlx5e_frag_page *frag_page = mlx5e_shampo_hd_to_frag_page(rq, header_index);
2268-
u16 head_offset = mlx5e_shampo_hd_offset(header_index);
2272+
u16 head_offset = mlx5e_shampo_hd_offset(rq, header_index);
2273+
struct mlx5e_shampo_hd *shampo = rq->mpwqe.shampo;
22692274
u16 head_size = cqe->shampo.header_size;
22702275
u16 rx_headroom = rq->buff.headroom;
22712276
struct sk_buff *skb = NULL;
@@ -2281,7 +2286,7 @@ mlx5e_skb_from_cqe_shampo(struct mlx5e_rq *rq, struct mlx5e_mpw_info *wi,
22812286
data = hdr + rx_headroom;
22822287
frag_size = MLX5_SKB_FRAG_SZ(rx_headroom + head_size);
22832288

2284-
if (likely(frag_size <= BIT(MLX5E_SHAMPO_LOG_MAX_HEADER_ENTRY_SIZE))) {
2289+
if (likely(frag_size <= BIT(shampo->log_hd_entry_size))) {
22852290
/* build SKB around header */
22862291
dma_sync_single_range_for_cpu(rq->pdev, dma_addr, 0, frag_size, rq->buff.map_dir);
22872292
net_prefetchw(hdr);

0 commit comments

Comments
 (0)