From nobody Thu Dec 18 20:21:59 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 94B641D79BB for ; Wed, 18 Dec 2024 13:34:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734528875; cv=none; b=bTxXhmU97r2ZiqvWRW8zDd3MTnOl5frwC4Vu/B5Yb20AoOeJyBTe2R6w4hto6nxR2X64e2ZNOgEUxPUR6ab6oYOEB3ETk6+8h+6XXFy1IBBjfr/cgdjriDzE6ESwaUcXL4M+RXG5iXyS4GyZVn7cdybcPRI9QCaBQWcg/p/TBWo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734528875; c=relaxed/simple; bh=u3ksI8X3LHlmnWlWNsr7oSVKMPEqKsRuUTAg+bTe+00=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=nhdEIB11LPS52jrJm1VqBSGCb7X3CaFvbKQUED+KpezVr9ysMCqbjxob3vJLtBAr/lTiX1foJOs10agyMLX4et6/vqjSaWqPbDE+zTa8A36G0Y4ebBZz3kJ37Xlmuy8JBUWpc3kBUJX+4wiHHDrZe/EU7pEHCFZchDImCfeCbDk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--pkaligineedi.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=MPxc0dho; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--pkaligineedi.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="MPxc0dho" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-21632eacb31so44351245ad.0 for ; Wed, 18 Dec 2024 05:34:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1734528872; x=1735133672; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=YwlRUX1jaF5zrf3pwivF6X+hM80Z5phrYRTqYk/3DoI=; b=MPxc0dhofPFnXcILg06kG+YRGWPh4xf2Jay20u120zc0dKqN9UxHQ7AMA81rLhgXmb ZVqMkn/rIzJH0nSIiQQ3z+EjssO0gXN7iV27NaPDEAJCFAuRmo/JRJqgBG9KLyoExo/J zfXhn4kVlf4usRO89FOZIN7PrUnA0Ef20z6MIkhYvZFnQ/OutucxOUuFF1ilYZXAxC34 lOzOXJIZHHK6HRghsVoS79wZ4NEyWdcvCla3Bi3YeSb4PjzpTZslTx3cvvuIbCnWzR0c Y0pOr28Q+UKFULWe+0RbB/OS42OZ9BYI/7vy6OIBWu27DNVF2zOg8iZpVEGPpDiH1wVJ X1Ug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734528872; x=1735133672; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=YwlRUX1jaF5zrf3pwivF6X+hM80Z5phrYRTqYk/3DoI=; b=humyTE8JPBGpX19Arq61UQmoBqQSxTp9gKtB+jMFEjlQLZzGgZ112pZSsJpTtRsme0 Ls/kRVf7FxR85EVoGXFjtwk5+HTzOvoNWMeEyjxzZXZvBCWppWrpRGZ8u+MmLv+n/NMJ Q0MEv20yLnu2VMnRbU9OGSROLCaWFcIvPXIBrCX6eImUfXcOsUOJFPbrh7b7xXLfd69e exzwwp+8m65Clp416KUrWB6JO4EPuU4LGi3Pecwo8xNicQl6xacy5grncn/gqQEFjKxv yzqn5pCaC1TgMvyRGzzWyxsDAeRReT9GdeleytNX6VaGgWiE1AAlKQ+8TQkDnCMS5gHH qf7g== X-Forwarded-Encrypted: i=1; AJvYcCVHJDPBoj8aPwY6cCNTjLtVEcnc0kFu5SeT3upxoHX6CZWwXrcd5xxPabDL05s4zslSbE5Tj1ZWCJjKzY4=@vger.kernel.org X-Gm-Message-State: AOJu0YwSJOz+CzQs8yT31jzABhuH2N6iFOxQzukPA+3F0kAwgANg9PQw Odzbm3lV64y/xoWJK3WCV5WGygYgkenf80km0BkLhB76Naqc6qicaDyxNPJH0TCtDJOlu2hIDNG D1I88eqc+3umHhuZLbl8gGEDRwQ== X-Google-Smtp-Source: AGHT+IGoZ3BfldQRegdOBvsvUntzPVMpURPuoWRCP2EtNiBtWfT4ejOfM4mqohMkYW+FU9E8z71bR23/h0c1KA2OAKc= X-Received: from pgid5.prod.google.com ([2002:a63:ed05:0:b0:7fd:5437:9912]) (user=pkaligineedi job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:dac6:b0:216:1ec6:9888 with SMTP id d9443c01a7336-218d72368afmr37261205ad.33.1734528871967; Wed, 18 Dec 2024 05:34:31 -0800 (PST) Date: Wed, 18 Dec 2024 05:34:14 -0800 In-Reply-To: <20241218133415.3759501-1-pkaligineedi@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20241218133415.3759501-1-pkaligineedi@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20241218133415.3759501-5-pkaligineedi@google.com> Subject: [PATCH net 4/5] gve: process XSK TX descriptors as part of RX NAPI From: Praveen Kaligineedi To: netdev@vger.kernel.org Cc: jeroendb@google.com, shailend@google.com, willemb@google.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, ast@kernel.org, daniel@iogearbox.net, hawk@kernel.org, john.fastabend@gmail.com, horms@kernel.org, hramamurthy@google.com, joshwash@google.com, ziweixiao@google.com, linux-kernel@vger.kernel.org, bpf@vger.kernel.org, stable@vger.kernel.org, Praveen Kaligineedi Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Joshua Washington When busy polling is enabled, xsk_sendmsg for AF_XDP zero copy marks the NAPI ID corresponding to the memory pool allocated for the socket. In GVE, this NAPI ID will never correspond to a NAPI ID of one of the dedicated XDP TX queues registered with the umem because XDP TX is not set up to share a NAPI with a corresponding RX queue. This patch moves XSK TX descriptor processing from the TX NAPI to the RX NAPI, and the gve_xsk_wakeup callback is updated to use the RX NAPI instead of the TX NAPI, accordingly. The branch on if the wakeup is for TX is removed, as the NAPI poll should be invoked whether the wakeup is for TX or for RX. Fixes: fd8e40321a12 ("gve: Add AF_XDP zero-copy support for GQI-QPL format") Cc: stable@vger.kernel.org Signed-off-by: Praveen Kaligineedi Signed-off-by: Joshua Washington Reviewed-by: Willem de Bruijn --- drivers/net/ethernet/google/gve/gve.h | 1 + drivers/net/ethernet/google/gve/gve_main.c | 8 +++++ drivers/net/ethernet/google/gve/gve_tx.c | 36 +++++++++++++--------- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/g= oogle/gve/gve.h index dd92949bb214..8167cc5fb0df 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -1140,6 +1140,7 @@ int gve_xdp_xmit_one(struct gve_priv *priv, struct gv= e_tx_ring *tx, void gve_xdp_tx_flush(struct gve_priv *priv, u32 xdp_qid); bool gve_tx_poll(struct gve_notify_block *block, int budget); bool gve_xdp_poll(struct gve_notify_block *block, int budget); +int gve_xsk_tx_poll(struct gve_notify_block *block, int budget); int gve_tx_alloc_rings_gqi(struct gve_priv *priv, struct gve_tx_alloc_rings_cfg *cfg); void gve_tx_free_rings_gqi(struct gve_priv *priv, diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ether= net/google/gve/gve_main.c index e4e8ff4f9f80..5cab7b88610f 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -333,6 +333,14 @@ int gve_napi_poll(struct napi_struct *napi, int budget) =20 if (block->rx) { work_done =3D gve_rx_poll(block, budget); + + /* Poll XSK TX as part of RX NAPI. Setup re-poll based on max of + * TX and RX work done. + */ + if (priv->xdp_prog) + work_done =3D max_t(int, work_done, + gve_xsk_tx_poll(block, budget)); + reschedule |=3D work_done =3D=3D budget; } =20 diff --git a/drivers/net/ethernet/google/gve/gve_tx.c b/drivers/net/etherne= t/google/gve/gve_tx.c index 852f8c7e39d2..4350ebd9c2bd 100644 --- a/drivers/net/ethernet/google/gve/gve_tx.c +++ b/drivers/net/ethernet/google/gve/gve_tx.c @@ -981,33 +981,41 @@ static int gve_xsk_tx(struct gve_priv *priv, struct g= ve_tx_ring *tx, return sent; } =20 +int gve_xsk_tx_poll(struct gve_notify_block *rx_block, int budget) +{ + struct gve_rx_ring *rx =3D rx_block->rx; + struct gve_priv *priv =3D rx->gve; + struct gve_tx_ring *tx; + int sent =3D 0; + + tx =3D &priv->tx[gve_xdp_tx_queue_id(priv, rx->q_num)]; + if (tx->xsk_pool) { + sent =3D gve_xsk_tx(priv, tx, budget); + + u64_stats_update_begin(&tx->statss); + tx->xdp_xsk_sent +=3D sent; + u64_stats_update_end(&tx->statss); + if (xsk_uses_need_wakeup(tx->xsk_pool)) + xsk_set_tx_need_wakeup(tx->xsk_pool); + } + + return sent; +} + bool gve_xdp_poll(struct gve_notify_block *block, int budget) { struct gve_priv *priv =3D block->priv; struct gve_tx_ring *tx =3D block->tx; u32 nic_done; - bool repoll; u32 to_do; =20 /* Find out how much work there is to be done */ nic_done =3D gve_tx_load_event_counter(priv, tx); to_do =3D min_t(u32, (nic_done - tx->done), budget); gve_clean_xdp_done(priv, tx, to_do); - repoll =3D nic_done !=3D tx->done; - - if (tx->xsk_pool) { - int sent =3D gve_xsk_tx(priv, tx, budget); - - u64_stats_update_begin(&tx->statss); - tx->xdp_xsk_sent +=3D sent; - u64_stats_update_end(&tx->statss); - repoll |=3D (sent =3D=3D budget); - if (xsk_uses_need_wakeup(tx->xsk_pool)) - xsk_set_tx_need_wakeup(tx->xsk_pool); - } =20 /* If we still have work we want to repoll */ - return repoll; + return nic_done !=3D tx->done; } =20 bool gve_tx_poll(struct gve_notify_block *block, int budget) --=20 2.47.1.613.gc27f4b7a9f-goog