From nobody Thu Dec 18 20:21:59 2025 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (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 72DDA1BEF80 for ; Wed, 18 Dec 2024 13:34:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734528871; cv=none; b=irNpIKT16skTR0aGdlpqgfKjcOevb0zpDe/q1rj2+TZ53cz8p0R2xrZaKPhmFjkmCmg1myIgxUR6AzlDyQnBmKiszsrI50Zd+Qqgv9nLLdfp/zmw7z6VlRHPamEagr9uwM/0KpTxVPDNB+OoYHrjKVpCjB9kWo6HBV4zp3LrAA4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734528871; c=relaxed/simple; bh=CvjpZzap2JTZv3aoX0brnCAcyXx3Af2l9Bmavz1WSA4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=lAZwx7PTdl4i3/DaH4Y8o+apkXfK1yoCX7pl1XzCDZmcM6rTrhGp1coAWRJ/oeFvSo7uUAsEiRVHqvyouxC55r4kz2Xbrt5JbR/MYbzQ2toYFitUnRui/5TN9HJwW/1w5RWS7KmInM/YPQyFpSZqmtjtxJYT6Wxlmcl63Tw+bG8= 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=0/JaCxdu; arc=none smtp.client-ip=209.85.210.201 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="0/JaCxdu" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-728f1c4b95aso5077104b3a.0 for ; Wed, 18 Dec 2024 05:34:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1734528869; x=1735133669; 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=NRgIGaGDm4cvXXtjC5u8gCurbHYhRvv9RGqvrTy9ue8=; b=0/JaCxduaU21L5RaQx1ihJQkMX1AE95D59KPUyoGVH8hJltOXiXJqNS3vX4009WxH7 rjpAASdQXLKI/+jO1QdHUfThNL8htyOBJzRrXOoN8z13/4tprvTc1bF+j5iAerBkM/9C vDuF04wu1F32nO8QvX/5a6TnWttMCrImbvkysgqaj8VF9dM7SdZVy8EatBls/34C/KTi LOCh/CRcBkWUuYrGSuLCdwgT5ImdZYYv3b98OHWzvq6hpkgjZ3vrDkjD0EFDEoC9h+Ov f2WchjMngQRtdwc457HC6V/svmX+Vqay5lFNygRpNw4Pg+O9VNyKDEQbx8ODPbox863J 7SzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734528869; x=1735133669; 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=NRgIGaGDm4cvXXtjC5u8gCurbHYhRvv9RGqvrTy9ue8=; b=g7346nCSDE/urQb8RbHUVizFfv4I92qJBdW3DIaVPim8mGgJWtvh0jD+OjrVado002 Mmn9YbBSCHhZ6VZWxKxFyDKHV9FQJYguZhpMDUsol7PTn1NVNjNY1hVNpHfXseTktCoo j3snoc+SXTZJrd1dfvslmrPEM5f3tpZZ4HcwvhETemy/FB+01lsKkbwq+bfrwtU/5s74 sm0IDKPM+7AH2C3pNQh1ukoK7eykXUGsCLC7F0GiYv306mn06d3Qmi9gVtnrAB7lKGX/ oDHf2Rh2KDiHZfZOiwyXM8yLL/eJ/QW9YSj7QelbjmFLn8cl1mZII/Rk0HKrBWb7J/HB 55fw== X-Forwarded-Encrypted: i=1; AJvYcCUg0swU8/eEAWn7hJnUHfSDScNSuc0ktcHNHqO/G+Wtr1Hyn1dBuA4FpKab7hnh4PIyKLXpkV6/zI2KizE=@vger.kernel.org X-Gm-Message-State: AOJu0YxUS4hXHOv42cMif8Y48cs/2N+0Dvy5BOaS+F4SjAM1X3GogT+F bXTsr+7gdhaNHx3FbLt02KJ2ScGH7pkveRT4X2GcYIkYCUX3xnBGDDZcyAvkzWvRMGk27oBdeOi MLr9gHwIJQVQomN3T0nvSDsqXfQ== X-Google-Smtp-Source: AGHT+IELVRUurFW8tfDDC0iUwFPiFsqYStc2zOYCPV3iXlkA6nU0se344US+p9bexkbh23hUu3k2oyF3UnV/97X3x9c= X-Received: from pgeu9.prod.google.com ([2002:a63:a909:0:b0:7ff:d6:4f28]) (user=pkaligineedi job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:1013:b0:1e1:e2d9:307 with SMTP id adf61e73a8af0-1e5b487e6e8mr4675360637.33.1734528868845; Wed, 18 Dec 2024 05:34:28 -0800 (PST) Date: Wed, 18 Dec 2024 05:34:12 -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-3-pkaligineedi@google.com> Subject: [PATCH net 2/5] gve: guard XDP xmit NDO on existence of xdp queues 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 In GVE, dedicated XDP queues only exist when an XDP program is installed and the interface is up. As such, the NDO XDP XMIT callback should return early if either of these conditions are false. In the case of no loaded XDP program, priv->num_xdp_queues=3D0 which can cause a divide-by-zero error, and in the case of interface down, num_xdp_queues remains untouched to persist XDP queue count for the next interface up, but the TX pointer itself would be NULL. The XDP xmit callback also needs to synchronize with a device transitioning from open to close. This synchronization will happen via the GVE_PRIV_FLAGS_NAPI_ENABLED bit along with a synchronize_net() call, which waits for any RCU critical sections at call-time to complete. Fixes: 39a7f4aa3e4a ("gve: Add XDP REDIRECT support for GQI-QPL format") Cc: stable@vger.kernel.org Signed-off-by: Joshua Washington Signed-off-by: Praveen Kaligineedi Reviewed-by: Praveen Kaligineedi Reviewed-by: Shailend Chand Reviewed-by: Willem de Bruijn --- drivers/net/ethernet/google/gve/gve_main.c | 3 +++ drivers/net/ethernet/google/gve/gve_tx.c | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ether= net/google/gve/gve_main.c index e171ca248f9a..5d7b0cc59959 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -1899,6 +1899,9 @@ static void gve_turndown(struct gve_priv *priv) =20 gve_clear_napi_enabled(priv); gve_clear_report_stats(priv); + + /* Make sure that all traffic is finished processing. */ + synchronize_net(); } =20 static void gve_turnup(struct gve_priv *priv) diff --git a/drivers/net/ethernet/google/gve/gve_tx.c b/drivers/net/etherne= t/google/gve/gve_tx.c index 83ad278ec91f..852f8c7e39d2 100644 --- a/drivers/net/ethernet/google/gve/gve_tx.c +++ b/drivers/net/ethernet/google/gve/gve_tx.c @@ -837,9 +837,12 @@ int gve_xdp_xmit(struct net_device *dev, int n, struct= xdp_frame **frames, struct gve_tx_ring *tx; int i, err =3D 0, qid; =20 - if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK)) + if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK) || !priv->xdp_prog) return -EINVAL; =20 + if (!gve_get_napi_enabled(priv)) + return -ENETDOWN; + qid =3D gve_xdp_tx_queue_id(priv, smp_processor_id() % priv->num_xdp_queues); =20 --=20 2.47.1.613.gc27f4b7a9f-goog