Received: by 2002:a05:6a10:1d13:0:0:0:0 with SMTP id pp19csp3599727pxb; Mon, 30 Aug 2021 06:20:09 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxOdsIc+f1C8l74GaPJYXHDfoHEOYkgVKjWea8zHETk07Vk10R92764uNGcJMYGF/k6nvyl X-Received: by 2002:a92:d12:: with SMTP id 18mr15466797iln.287.1630329608774; Mon, 30 Aug 2021 06:20:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1630329608; cv=none; d=google.com; s=arc-20160816; b=cba3vOcHdC0/CmllSz9+dL6lECcnRWNsJ/x3ngsqFP9fAMJjw4XZv+CC+D7fd3fwRz 49rb2E6Nx+0KB41/BTn8NXcl1WXSJbfYb9fKA4Ojzaumaf6bp7A7qvD51CmBm3p/c0QX JNdWWb6Gm0+Il/3i1aXfBrP5JZN7mR7qmvD0ghkmYttZIXskNkKnHpLhswajDCODIeZE VRImqYHbm+GUFst9ewd7jCHCug42hOVXqsaM22hOFwhFmnbMf3VnVuEkP6o4MoiZf+Fg r2+omqw2ciQ+8NJGIfVo2gAhp4NG1tgdA5PBC1NymlZdXisr25WOS8Poqp1qtHr4uabv FWUg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=Cg6OXuQAhuta2iwUkLbIKCRedxbapFqye1RnoTP5ohA=; b=g2XX5g1Znvr+auodk5XK1eswKOrnqKX7JzfkWgC4YMFqLS9h2p+Me6VWWATDDktPKf uPVG10dWewvNqPJIBSNq4zE8VMSqjG/kRALAyTTDPsVdBRHhh64e0BtsFhLB8vbsyrK7 rajBaHkNpVtfufB7RgdZyUbpc8csHwo8C0pavUBpaugq/36IC1sfvwDQy/sive+3+0BD HRjWK3mrTtuTaskiVVSBAikuQ0aOU5MxW6YedQY6/3FR0Ng3WwlL9bWsb6LuRX2dlrKX q4CGXt1RRNVil0K5T/f0IU7yWJOZmspxmGSkNqOflRpUGYK2ar+2X5ImqyKJwQZVJW56 +ipg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b="N9B1/pv/"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y13si13797154ioq.14.2021.08.30.06.19.56; Mon, 30 Aug 2021 06:20:08 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b="N9B1/pv/"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236537AbhH3NTR (ORCPT + 99 others); Mon, 30 Aug 2021 09:19:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60322 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229446AbhH3NTQ (ORCPT ); Mon, 30 Aug 2021 09:19:16 -0400 Received: from mail-ot1-x331.google.com (mail-ot1-x331.google.com [IPv6:2607:f8b0:4864:20::331]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EF0E7C061575; Mon, 30 Aug 2021 06:18:22 -0700 (PDT) Received: by mail-ot1-x331.google.com with SMTP id a20-20020a0568300b9400b0051b8ca82dfcso18304581otv.3; Mon, 30 Aug 2021 06:18:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=Cg6OXuQAhuta2iwUkLbIKCRedxbapFqye1RnoTP5ohA=; b=N9B1/pv/i9JbL3a+a4DZJx7Y2OYapKAHuMaGHP3VKRMjue0t2zBn1XoCsHHduCUi35 uMFFN/PSLI4wU/0I5IwRidYhCfoNPgTMH+2wLfv06WLuYVQhrXzfO7tmKQNyfTPt2ncq AGqxrYHlAzlrXTZXb8uJGAt2CnBfOuQvmqe1ZA5KxRYOyLpFpSJgJ1+NEaIdZeMNrQdi vjSmR0EK0g+9bqKUszuR5X453phTDrg2iFaM3MfA/3j5VBT15mHHqvOi+BrFFcUq/av6 Lti4TSzBNRt3gYb0sssVnPZPNDyWvSNZgmktEg5kImyyb6TXo+atxLrHJW8H6pJM5Ba6 Na/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=Cg6OXuQAhuta2iwUkLbIKCRedxbapFqye1RnoTP5ohA=; b=t9ah4Ya266VXjX/cKwlwgE505LM332+6bverjfsxrkmA28RUu4zqM9FLCt68J2sAt8 X/udSMMOJSZmtnr2kih0zpGZvAqgTlNAtGKOY0p9h4bCyCzZO1ZCwWEIlK8+OrPPA4Yw WdTruM18iRYxfaf9bYvHqSK0l+0pN+5RSDXK8pnMZt7C2YvlKLlwCh1acjEiGqXi0ALv MTIiufiseX8IzwX4jMg7ab+G0Dzg8TgFUJMXIS9bxW/Q7xNwqTpjCgMGX0o+O9eugsrg Jm4V00DDJHJJuj0JzzkoWjol9i7GBKJkYigBhCv0+600upwlIsSWuy+GUC6mGYwANG72 S20w== X-Gm-Message-State: AOAM531pCUCESNo1SJctFG5s5APvZ3wjdlAD2J0TbO3N8jDLbinGPu/M HK5nl70yZq9NaQSVRxMYeN6p3HPqVDpvRdhAvUU3Vd6CbnXbmYO7 X-Received: by 2002:a9d:75d5:: with SMTP id c21mr19390335otl.118.1630329502175; Mon, 30 Aug 2021 06:18:22 -0700 (PDT) MIME-Version: 1.0 References: <20210830124638.35408-1-kerneljasonxing@gmail.com> In-Reply-To: <20210830124638.35408-1-kerneljasonxing@gmail.com> From: Jason Xing Date: Mon, 30 Aug 2021 21:17:46 +0800 Message-ID: Subject: Re: [PATCH v5] ixgbe: let the xdpdrv work with more than 64 cpus To: Jesse Brandeburg , "Nguyen, Anthony L" , David Miller , kuba@kernel.org, ast@kernel.org, daniel@iogearbox.net, hawk@kernel.org, john.fastabend@gmail.com, andrii@kernel.org, kafai@fb.com, songliubraving@fb.com, yhs@fb.com, kpsingh@kernel.org Cc: intel-wired-lan@lists.osuosl.org, netdev , LKML , bpf@vger.kernel.org, Jason Xing , Shujin Li Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Aug 30, 2021 at 8:49 PM wrote: > > From: Jason Xing > > Originally, ixgbe driver doesn't allow the mounting of xdpdrv if the > server is equipped with more than 64 cpus online. So it turns out that > the loading of xdpdrv causes the "NOMEM" failure. > > Actually, we can adjust the algorithm and then make it work through > mapping the current cpu to some xdp ring with the protect of @tx_lock. > > Here're some numbers before/after applying this patch with xdp-example > loaded on the eth0X: > > Before After > TCP_STREAM send-64 734.14 714.20 > TCP_STREAM send-128 1401.91 1395.05 > TCP_STREAM send-512 5311.67 5292.84 > TCP_STREAM send-1k 9277.40 9356.22 (not stable) > TCP_RR send-1 22559.75 21844.22 > TCP_RR send-128 23169.54 22725.13 > TCP_RR send-512 21670.91 21412.56 > Sorry, I need to update the full result: As client with xdpdrv loaded (tx path): Before After TCP_STREAM send-64 734.14 714.20 TCP_STREAM send-128 1401.91 1395.05 TCP_STREAM send-512 5311.67 5292.84 TCP_STREAM send-1k 9277.40 9356.22 (not stable) TCP_RR send-1 22559.75 21844.22 TCP_RR send-128 23169.54 22725.13 TCP_RR send-512 21670.91 21412.56 As server with xdpdrv loaded (rx path): Before After TCP_STREAM send-64 1416.49 1383.12 TCP_STREAM send-128 3141.49 3055.50 TCP_STREAM send-512 9488.73 9487.44 TCP_STREAM send-1k 9491.17 9356.22 (not stable) TCP_RR send-1 23617.74 23601.60 Now, the numbers are complete:) > I tested many times with different parameters combined through netperf. > Though the result is not that accurate, I cannot see much influence on > this patch. The static key is places on the hot path, but it actually > shouldn't cause a huge regression theoretically. > > Fixes: 33fdc82f08 ("ixgbe: add support for XDP_TX action") > Co-developed-by: Shujin Li > Signed-off-by: Shujin Li > Signed-off-by: Jason Xing > --- > v5: > - Change back to nr_cpu_ids (Eric) > - Add the basic net performance data (Jason) > > v4: > - Update the wrong commit messages. (Jason) > > v3: > - Change nr_cpu_ids to num_online_cpus() (Maciej) > - Rename MAX_XDP_QUEUES to IXGBE_MAX_XDP_QS (Maciej) > - Rename ixgbe_determine_xdp_cpu() to ixgbe_determine_xdp_q_idx() (Maciej) > - Wrap ixgbe_xdp_ring_update_tail() with lock into one function (Maciej) > > v2: > - Adjust cpu id in ixgbe_xdp_xmit(). (Jesper) > - Add a fallback path. (Maciej) > - Adjust other parts related to xdp ring. > --- > drivers/net/ethernet/intel/ixgbe/ixgbe.h | 15 ++++- > drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c | 9 ++- > drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 64 ++++++++++++++++------ > .../net/ethernet/intel/ixgbe/ixgbe_txrx_common.h | 1 + > drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c | 9 +-- > 5 files changed, 73 insertions(+), 25 deletions(-) > > diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h > index a604552..5f7f181 100644 > --- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h > +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h > @@ -82,6 +82,8 @@ > #define IXGBE_2K_TOO_SMALL_WITH_PADDING \ > ((NET_SKB_PAD + IXGBE_RXBUFFER_1536) > SKB_WITH_OVERHEAD(IXGBE_RXBUFFER_2K)) > > +DECLARE_STATIC_KEY_FALSE(ixgbe_xdp_locking_key); > + > static inline int ixgbe_compute_pad(int rx_buf_len) > { > int page_size, pad_size; > @@ -351,6 +353,7 @@ struct ixgbe_ring { > }; > u16 rx_offset; > struct xdp_rxq_info xdp_rxq; > + spinlock_t tx_lock; /* used in XDP mode */ > struct xsk_buff_pool *xsk_pool; > u16 ring_idx; /* {rx,tx,xdp}_ring back reference idx */ > u16 rx_buf_len; > @@ -375,7 +378,7 @@ enum ixgbe_ring_f_enum { > #define IXGBE_MAX_FCOE_INDICES 8 > #define MAX_RX_QUEUES (IXGBE_MAX_FDIR_INDICES + 1) > #define MAX_TX_QUEUES (IXGBE_MAX_FDIR_INDICES + 1) > -#define MAX_XDP_QUEUES (IXGBE_MAX_FDIR_INDICES + 1) > +#define IXGBE_MAX_XDP_QS (IXGBE_MAX_FDIR_INDICES + 1) > #define IXGBE_MAX_L2A_QUEUES 4 > #define IXGBE_BAD_L2A_QUEUE 3 > #define IXGBE_MAX_MACVLANS 63 > @@ -629,7 +632,7 @@ struct ixgbe_adapter { > > /* XDP */ > int num_xdp_queues; > - struct ixgbe_ring *xdp_ring[MAX_XDP_QUEUES]; > + struct ixgbe_ring *xdp_ring[IXGBE_MAX_XDP_QS]; > unsigned long *af_xdp_zc_qps; /* tracks AF_XDP ZC enabled rings */ > > /* TX */ > @@ -772,6 +775,14 @@ struct ixgbe_adapter { > #endif /* CONFIG_IXGBE_IPSEC */ > }; > > +static inline int ixgbe_determine_xdp_q_idx(int cpu) > +{ > + if (static_key_enabled(&ixgbe_xdp_locking_key)) > + return cpu % IXGBE_MAX_XDP_QS; > + else > + return cpu; > +} > + > static inline u8 ixgbe_max_rss_indices(struct ixgbe_adapter *adapter) > { > switch (adapter->hw.mac.type) { > diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c > index 0218f6c..86b1116 100644 > --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c > +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c > @@ -299,7 +299,10 @@ static void ixgbe_cache_ring_register(struct ixgbe_adapter *adapter) > > static int ixgbe_xdp_queues(struct ixgbe_adapter *adapter) > { > - return adapter->xdp_prog ? nr_cpu_ids : 0; > + int queues; > + > + queues = min_t(int, IXGBE_MAX_XDP_QS, nr_cpu_ids); > + return adapter->xdp_prog ? queues : 0; > } > > #define IXGBE_RSS_64Q_MASK 0x3F > @@ -947,6 +950,7 @@ static int ixgbe_alloc_q_vector(struct ixgbe_adapter *adapter, > ring->count = adapter->tx_ring_count; > ring->queue_index = xdp_idx; > set_ring_xdp(ring); > + spin_lock_init(&ring->tx_lock); > > /* assign ring to adapter */ > WRITE_ONCE(adapter->xdp_ring[xdp_idx], ring); > @@ -1032,6 +1036,9 @@ static void ixgbe_free_q_vector(struct ixgbe_adapter *adapter, int v_idx) > adapter->q_vector[v_idx] = NULL; > __netif_napi_del(&q_vector->napi); > > + if (static_key_enabled(&ixgbe_xdp_locking_key)) > + static_branch_dec(&ixgbe_xdp_locking_key); > + > /* > * after a call to __netif_napi_del() napi may still be used and > * ixgbe_get_stats64() might access the rings on this vector, > diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c > index 14aea40..bec29f5 100644 > --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c > +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c > @@ -165,6 +165,9 @@ static int ixgbe_notify_dca(struct notifier_block *, unsigned long event, > MODULE_DESCRIPTION("Intel(R) 10 Gigabit PCI Express Network Driver"); > MODULE_LICENSE("GPL v2"); > > +DEFINE_STATIC_KEY_FALSE(ixgbe_xdp_locking_key); > +EXPORT_SYMBOL(ixgbe_xdp_locking_key); > + > static struct workqueue_struct *ixgbe_wq; > > static bool ixgbe_check_cfg_remove(struct ixgbe_hw *hw, struct pci_dev *pdev); > @@ -2422,13 +2425,10 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector, > xdp_do_flush_map(); > > if (xdp_xmit & IXGBE_XDP_TX) { > - struct ixgbe_ring *ring = adapter->xdp_ring[smp_processor_id()]; > + int index = ixgbe_determine_xdp_q_idx(smp_processor_id()); > + struct ixgbe_ring *ring = adapter->xdp_ring[index]; > > - /* Force memory writes to complete before letting h/w > - * know there are new descriptors to fetch. > - */ > - wmb(); > - writel(ring->next_to_use, ring->tail); > + ixgbe_xdp_ring_update_tail_locked(ring); > } > > u64_stats_update_begin(&rx_ring->syncp); > @@ -6320,7 +6320,7 @@ static int ixgbe_sw_init(struct ixgbe_adapter *adapter, > if (ixgbe_init_rss_key(adapter)) > return -ENOMEM; > > - adapter->af_xdp_zc_qps = bitmap_zalloc(MAX_XDP_QUEUES, GFP_KERNEL); > + adapter->af_xdp_zc_qps = bitmap_zalloc(IXGBE_MAX_XDP_QS, GFP_KERNEL); > if (!adapter->af_xdp_zc_qps) > return -ENOMEM; > > @@ -8539,21 +8539,32 @@ static u16 ixgbe_select_queue(struct net_device *dev, struct sk_buff *skb, > int ixgbe_xmit_xdp_ring(struct ixgbe_adapter *adapter, > struct xdp_frame *xdpf) > { > - struct ixgbe_ring *ring = adapter->xdp_ring[smp_processor_id()]; > struct ixgbe_tx_buffer *tx_buffer; > union ixgbe_adv_tx_desc *tx_desc; > + struct ixgbe_ring *ring; > u32 len, cmd_type; > dma_addr_t dma; > + int index, ret; > u16 i; > > len = xdpf->len; > > - if (unlikely(!ixgbe_desc_unused(ring))) > - return IXGBE_XDP_CONSUMED; > + index = ixgbe_determine_xdp_q_idx(smp_processor_id()); > + ring = adapter->xdp_ring[index]; > + > + if (static_branch_unlikely(&ixgbe_xdp_locking_key)) > + spin_lock(&ring->tx_lock); > + > + if (unlikely(!ixgbe_desc_unused(ring))) { > + ret = IXGBE_XDP_CONSUMED; > + goto out; > + } > > dma = dma_map_single(ring->dev, xdpf->data, len, DMA_TO_DEVICE); > - if (dma_mapping_error(ring->dev, dma)) > - return IXGBE_XDP_CONSUMED; > + if (dma_mapping_error(ring->dev, dma)) { > + ret = IXGBE_XDP_CONSUMED; > + goto out; > + } > > /* record the location of the first descriptor for this packet */ > tx_buffer = &ring->tx_buffer_info[ring->next_to_use]; > @@ -8590,7 +8601,11 @@ int ixgbe_xmit_xdp_ring(struct ixgbe_adapter *adapter, > tx_buffer->next_to_watch = tx_desc; > ring->next_to_use = i; > > - return IXGBE_XDP_TX; > + ret = IXGBE_XDP_TX; > +out: > + if (static_branch_unlikely(&ixgbe_xdp_locking_key)) > + spin_unlock(&ring->tx_lock); > + return ret; > } > > netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb, > @@ -10130,8 +10145,13 @@ static int ixgbe_xdp_setup(struct net_device *dev, struct bpf_prog *prog) > return -EINVAL; > } > > - if (nr_cpu_ids > MAX_XDP_QUEUES) > + /* if the number of cpus is much larger than the maximum of queues, > + * we should stop it and then return with NOMEM like before. > + */ > + if (nr_cpu_ids > IXGBE_MAX_XDP_QS * 2) > return -ENOMEM; > + else if (nr_cpu_ids > IXGBE_MAX_XDP_QS) > + static_branch_inc(&ixgbe_xdp_locking_key); > > old_prog = xchg(&adapter->xdp_prog, prog); > need_reset = (!!prog != !!old_prog); > @@ -10195,12 +10215,22 @@ void ixgbe_xdp_ring_update_tail(struct ixgbe_ring *ring) > writel(ring->next_to_use, ring->tail); > } > > +void ixgbe_xdp_ring_update_tail_locked(struct ixgbe_ring *ring) > +{ > + if (static_branch_unlikely(&ixgbe_xdp_locking_key)) > + spin_lock(&ring->tx_lock); > + ixgbe_xdp_ring_update_tail(ring); > + if (static_branch_unlikely(&ixgbe_xdp_locking_key)) > + spin_unlock(&ring->tx_lock); > +} > + > static int ixgbe_xdp_xmit(struct net_device *dev, int n, > struct xdp_frame **frames, u32 flags) > { > struct ixgbe_adapter *adapter = netdev_priv(dev); > struct ixgbe_ring *ring; > int nxmit = 0; > + int index; > int i; > > if (unlikely(test_bit(__IXGBE_DOWN, &adapter->state))) > @@ -10209,10 +10239,12 @@ static int ixgbe_xdp_xmit(struct net_device *dev, int n, > if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK)) > return -EINVAL; > > + index = ixgbe_determine_xdp_q_idx(smp_processor_id()); > + > /* During program transitions its possible adapter->xdp_prog is assigned > * but ring has not been configured yet. In this case simply abort xmit. > */ > - ring = adapter->xdp_prog ? adapter->xdp_ring[smp_processor_id()] : NULL; > + ring = adapter->xdp_prog ? adapter->xdp_ring[index] : NULL; > if (unlikely(!ring)) > return -ENXIO; > > @@ -10230,7 +10262,7 @@ static int ixgbe_xdp_xmit(struct net_device *dev, int n, > } > > if (unlikely(flags & XDP_XMIT_FLUSH)) > - ixgbe_xdp_ring_update_tail(ring); > + ixgbe_xdp_ring_update_tail_locked(ring); > > return nxmit; > } > diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_txrx_common.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_txrx_common.h > index 2aeec78..f6426d9 100644 > --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_txrx_common.h > +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_txrx_common.h > @@ -23,6 +23,7 @@ void ixgbe_process_skb_fields(struct ixgbe_ring *rx_ring, > void ixgbe_rx_skb(struct ixgbe_q_vector *q_vector, > struct sk_buff *skb); > void ixgbe_xdp_ring_update_tail(struct ixgbe_ring *ring); > +void ixgbe_xdp_ring_update_tail_locked(struct ixgbe_ring *ring); > void ixgbe_irq_rearm_queues(struct ixgbe_adapter *adapter, u64 qmask); > > void ixgbe_txrx_ring_disable(struct ixgbe_adapter *adapter, int ring); > diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c > index b1d22e4..82d00e4 100644 > --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c > +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c > @@ -334,13 +334,10 @@ int ixgbe_clean_rx_irq_zc(struct ixgbe_q_vector *q_vector, > xdp_do_flush_map(); > > if (xdp_xmit & IXGBE_XDP_TX) { > - struct ixgbe_ring *ring = adapter->xdp_ring[smp_processor_id()]; > + int index = ixgbe_determine_xdp_q_idx(smp_processor_id()); > + struct ixgbe_ring *ring = adapter->xdp_ring[index]; > > - /* Force memory writes to complete before letting h/w > - * know there are new descriptors to fetch. > - */ > - wmb(); > - writel(ring->next_to_use, ring->tail); > + ixgbe_xdp_ring_update_tail_locked(ring); > } > > u64_stats_update_begin(&rx_ring->syncp); > -- > 1.8.3.1 >