Archive-only list for patches
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: stable@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	patches@lists.linux.dev, Kuniyuki Iwashima <kuniyu@amazon.co.jp>,
	Daniel Borkmann <daniel@iogearbox.net>,
	Eric Dumazet <edumazet@google.com>,
	Martin KaFai Lau <kafai@fb.com>, Sasha Levin <sashal@kernel.org>
Subject: [PATCH 5.10 29/73] tcp: Add num_closed_socks to struct sock_reuseport.
Date: Fri, 28 Oct 2022 14:03:26 +0200	[thread overview]
Message-ID: <20221028120233.624608250@linuxfoundation.org> (raw)
In-Reply-To: <20221028120232.344548477@linuxfoundation.org>

From: Kuniyuki Iwashima <kuniyu@amazon.co.jp>

[ Upstream commit 5c040eaf5d1753aafe12989ca712175df0b9c436 ]

As noted in the following commit, a closed listener has to hold the
reference to the reuseport group for socket migration. This patch adds a
field (num_closed_socks) to struct sock_reuseport to manage closed sockets
within the same reuseport group. Moreover, this and the following commits
introduce some helper functions to split socks[] into two sections and keep
TCP_LISTEN and TCP_CLOSE sockets in each section. Like a double-ended
queue, we will place TCP_LISTEN sockets from the front and TCP_CLOSE
sockets from the end.

  TCP_LISTEN---------->       <-------TCP_CLOSE
  +---+---+  ---  +---+  ---  +---+  ---  +---+
  | 0 | 1 |  ...  | i |  ...  | j |  ...  | k |
  +---+---+  ---  +---+  ---  +---+  ---  +---+

  i = num_socks - 1
  j = max_socks - num_closed_socks
  k = max_socks - 1

This patch also extends reuseport_add_sock() and reuseport_grow() to
support num_closed_socks.

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.co.jp>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Acked-by: Martin KaFai Lau <kafai@fb.com>
Link: https://lore.kernel.org/bpf/20210612123224.12525-3-kuniyu@amazon.co.jp
Stable-dep-of: 69421bf98482 ("udp: Update reuse->has_conns under reuseport_lock.")
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 include/net/sock_reuseport.h |  5 ++-
 net/core/sock_reuseport.c    | 75 +++++++++++++++++++++++++++---------
 2 files changed, 60 insertions(+), 20 deletions(-)

diff --git a/include/net/sock_reuseport.h b/include/net/sock_reuseport.h
index 505f1e18e9bf..0e558ca7afbf 100644
--- a/include/net/sock_reuseport.h
+++ b/include/net/sock_reuseport.h
@@ -13,8 +13,9 @@ extern spinlock_t reuseport_lock;
 struct sock_reuseport {
 	struct rcu_head		rcu;
 
-	u16			max_socks;	/* length of socks */
-	u16			num_socks;	/* elements in socks */
+	u16			max_socks;		/* length of socks */
+	u16			num_socks;		/* elements in socks */
+	u16			num_closed_socks;	/* closed elements in socks */
 	/* The last synq overflow event timestamp of this
 	 * reuse->socks[] group.
 	 */
diff --git a/net/core/sock_reuseport.c b/net/core/sock_reuseport.c
index b065f0a103ed..f478c65a281b 100644
--- a/net/core/sock_reuseport.c
+++ b/net/core/sock_reuseport.c
@@ -18,6 +18,49 @@ DEFINE_SPINLOCK(reuseport_lock);
 
 static DEFINE_IDA(reuseport_ida);
 
+static int reuseport_sock_index(struct sock *sk,
+				const struct sock_reuseport *reuse,
+				bool closed)
+{
+	int left, right;
+
+	if (!closed) {
+		left = 0;
+		right = reuse->num_socks;
+	} else {
+		left = reuse->max_socks - reuse->num_closed_socks;
+		right = reuse->max_socks;
+	}
+
+	for (; left < right; left++)
+		if (reuse->socks[left] == sk)
+			return left;
+	return -1;
+}
+
+static void __reuseport_add_sock(struct sock *sk,
+				 struct sock_reuseport *reuse)
+{
+	reuse->socks[reuse->num_socks] = sk;
+	/* paired with smp_rmb() in reuseport_select_sock() */
+	smp_wmb();
+	reuse->num_socks++;
+}
+
+static bool __reuseport_detach_sock(struct sock *sk,
+				    struct sock_reuseport *reuse)
+{
+	int i = reuseport_sock_index(sk, reuse, false);
+
+	if (i == -1)
+		return false;
+
+	reuse->socks[i] = reuse->socks[reuse->num_socks - 1];
+	reuse->num_socks--;
+
+	return true;
+}
+
 static struct sock_reuseport *__reuseport_alloc(unsigned int max_socks)
 {
 	unsigned int size = sizeof(struct sock_reuseport) +
@@ -72,9 +115,9 @@ int reuseport_alloc(struct sock *sk, bool bind_inany)
 	}
 
 	reuse->reuseport_id = id;
+	reuse->bind_inany = bind_inany;
 	reuse->socks[0] = sk;
 	reuse->num_socks = 1;
-	reuse->bind_inany = bind_inany;
 	rcu_assign_pointer(sk->sk_reuseport_cb, reuse);
 
 out:
@@ -98,6 +141,7 @@ static struct sock_reuseport *reuseport_grow(struct sock_reuseport *reuse)
 		return NULL;
 
 	more_reuse->num_socks = reuse->num_socks;
+	more_reuse->num_closed_socks = reuse->num_closed_socks;
 	more_reuse->prog = reuse->prog;
 	more_reuse->reuseport_id = reuse->reuseport_id;
 	more_reuse->bind_inany = reuse->bind_inany;
@@ -105,9 +149,13 @@ static struct sock_reuseport *reuseport_grow(struct sock_reuseport *reuse)
 
 	memcpy(more_reuse->socks, reuse->socks,
 	       reuse->num_socks * sizeof(struct sock *));
+	memcpy(more_reuse->socks +
+	       (more_reuse->max_socks - more_reuse->num_closed_socks),
+	       reuse->socks + (reuse->max_socks - reuse->num_closed_socks),
+	       reuse->num_closed_socks * sizeof(struct sock *));
 	more_reuse->synq_overflow_ts = READ_ONCE(reuse->synq_overflow_ts);
 
-	for (i = 0; i < reuse->num_socks; ++i)
+	for (i = 0; i < reuse->max_socks; ++i)
 		rcu_assign_pointer(reuse->socks[i]->sk_reuseport_cb,
 				   more_reuse);
 
@@ -158,7 +206,7 @@ int reuseport_add_sock(struct sock *sk, struct sock *sk2, bool bind_inany)
 		return -EBUSY;
 	}
 
-	if (reuse->num_socks == reuse->max_socks) {
+	if (reuse->num_socks + reuse->num_closed_socks == reuse->max_socks) {
 		reuse = reuseport_grow(reuse);
 		if (!reuse) {
 			spin_unlock_bh(&reuseport_lock);
@@ -166,10 +214,7 @@ int reuseport_add_sock(struct sock *sk, struct sock *sk2, bool bind_inany)
 		}
 	}
 
-	reuse->socks[reuse->num_socks] = sk;
-	/* paired with smp_rmb() in reuseport_select_sock() */
-	smp_wmb();
-	reuse->num_socks++;
+	__reuseport_add_sock(sk, reuse);
 	rcu_assign_pointer(sk->sk_reuseport_cb, reuse);
 
 	spin_unlock_bh(&reuseport_lock);
@@ -183,7 +228,6 @@ EXPORT_SYMBOL(reuseport_add_sock);
 void reuseport_detach_sock(struct sock *sk)
 {
 	struct sock_reuseport *reuse;
-	int i;
 
 	spin_lock_bh(&reuseport_lock);
 	reuse = rcu_dereference_protected(sk->sk_reuseport_cb,
@@ -200,16 +244,11 @@ void reuseport_detach_sock(struct sock *sk)
 	bpf_sk_reuseport_detach(sk);
 
 	rcu_assign_pointer(sk->sk_reuseport_cb, NULL);
+	__reuseport_detach_sock(sk, reuse);
+
+	if (reuse->num_socks + reuse->num_closed_socks == 0)
+		call_rcu(&reuse->rcu, reuseport_free_rcu);
 
-	for (i = 0; i < reuse->num_socks; i++) {
-		if (reuse->socks[i] == sk) {
-			reuse->socks[i] = reuse->socks[reuse->num_socks - 1];
-			reuse->num_socks--;
-			if (reuse->num_socks == 0)
-				call_rcu(&reuse->rcu, reuseport_free_rcu);
-			break;
-		}
-	}
 	spin_unlock_bh(&reuseport_lock);
 }
 EXPORT_SYMBOL(reuseport_detach_sock);
@@ -274,7 +313,7 @@ struct sock *reuseport_select_sock(struct sock *sk,
 	prog = rcu_dereference(reuse->prog);
 	socks = READ_ONCE(reuse->num_socks);
 	if (likely(socks)) {
-		/* paired with smp_wmb() in reuseport_add_sock() */
+		/* paired with smp_wmb() in __reuseport_add_sock() */
 		smp_rmb();
 
 		if (!prog || !skb)
-- 
2.35.1




  parent reply	other threads:[~2022-10-28 12:05 UTC|newest]

Thread overview: 80+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-28 12:02 [PATCH 5.10 00/73] 5.10.152-rc1 review Greg Kroah-Hartman
2022-10-28 12:02 ` [PATCH 5.10 01/73] ocfs2: clear dinode links count in case of error Greg Kroah-Hartman
2022-10-28 12:02 ` [PATCH 5.10 02/73] ocfs2: fix BUG when iput after ocfs2_mknod fails Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 03/73] selinux: enable use of both GFP_KERNEL and GFP_ATOMIC in convert_context() Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 04/73] cpufreq: qcom: fix writes in read-only memory region Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 05/73] i2c: qcom-cci: Fix ordering of pm_runtime_xx and i2c_add_adapter Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 06/73] x86/microcode/AMD: Apply the patch early on every logical thread Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 07/73] hwmon/coretemp: Handle large core ID value Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 08/73] ata: ahci-imx: Fix MODULE_ALIAS Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 09/73] ata: ahci: Match EM_MAX_SLOTS with SATA_PMP_MAX_PORTS Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 10/73] cpufreq: qcom: fix memory leak in error path Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 11/73] kvm: Add support for arch compat vm ioctls Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 12/73] KVM: arm64: vgic: Fix exit condition in scan_its_table() Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 13/73] media: mceusb: set timeout to at least timeout provided Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 14/73] media: venus: dec: Handle the case where find_format fails Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 15/73] block: wbt: Remove unnecessary invoking of wbt_update_limits in wbt_init Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 16/73] blk-wbt: call rq_qos_add() after wb_normal is initialized Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 17/73] arm64: errata: Remove AES hwcap for COMPAT tasks Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 18/73] r8152: add PID for the Lenovo OneLink+ Dock Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 19/73] btrfs: fix processing of delayed data refs during backref walking Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 20/73] btrfs: fix processing of delayed tree block " Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 21/73] ACPI: extlog: Handle multiple records Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 22/73] tipc: Fix recognition of trial period Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 23/73] tipc: fix an information leak in tipc_topsrv_kern_subscr Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 24/73] i40e: Fix DMA mappings leak Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 25/73] HID: magicmouse: Do not set BTN_MOUSE on double report Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 26/73] sfc: Change VF mac via PF as first preference if available Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 27/73] net/atm: fix proc_mpc_write incorrect return value Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 28/73] net: phy: dp83867: Extend RX strap quirk for SGMII mode Greg Kroah-Hartman
2022-10-28 12:03 ` Greg Kroah-Hartman [this message]
2022-10-28 12:03 ` [PATCH 5.10 30/73] udp: Update reuse->has_conns under reuseport_lock Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 31/73] cifs: Fix xid leak in cifs_copy_file_range() Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 32/73] cifs: Fix xid leak in cifs_flock() Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 33/73] cifs: Fix xid leak in cifs_ses_add_channel() Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 34/73] net: hsr: avoid possible NULL deref in skb_clone() Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 35/73] ionic: catch NULL pointer issue on reconfig Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 36/73] nvme-hwmon: rework to avoid devm allocation Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 37/73] nvme-hwmon: Return error code when registration fails Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 38/73] nvme-hwmon: consistently ignore errors from nvme_hwmon_init Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 39/73] nvme-hwmon: kmalloc the NVME SMART log buffer Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 40/73] net: sched: cake: fix null pointer access issue when cake_init() fails Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 41/73] net: sched: delete duplicate cleanup of backlog and qlen Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 42/73] net: sched: sfb: fix null pointer access issue when sfb_init() fails Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 43/73] sfc: include vport_id in filter spec hash and equal() Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 44/73] net: hns: fix possible memory leak in hnae_ae_register() Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 45/73] net: sched: fix race condition in qdisc_graft() Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 46/73] net: phy: dp83822: disable MDI crossover status change interrupt Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 47/73] iommu/vt-d: Allow NVS regions in arch_rmrr_sanity_check() Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 48/73] iommu/vt-d: Clean up si_domain in the init_dmars() error path Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 49/73] drm/virtio: Use appropriate atomic state in virtio_gpu_plane_cleanup_fb() Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 50/73] dmaengine: mxs-dma: Remove the unused .id_table Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 51/73] dmaengine: mxs: use platform_driver_register Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 52/73] tracing: Simplify conditional compilation code in tracing_set_tracer() Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 53/73] tracing: Do not free snapshot if tracer is on cmdline Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 54/73] xen: assume XENFEAT_gnttab_map_avail_bits being set for pv guests Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 55/73] xen/gntdev: Accommodate VMA splitting Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 56/73] mmc: sdhci-tegra: Use actual clock rate for SW tuning correction Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 57/73] riscv: Add machine name to kernel boot log and stack dump output Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 58/73] riscv: always honor the CONFIG_CMDLINE_FORCE when parsing dtb Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 59/73] perf pmu: Validate raw event with sysfs exported format bits Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 60/73] perf: Skip and warn on unknown format configN attrs Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 61/73] fcntl: make F_GETOWN(EX) return 0 on dead owner task Greg Kroah-Hartman
2022-10-28 12:03 ` [PATCH 5.10 62/73] fcntl: fix potential deadlocks for &fown_struct.lock Greg Kroah-Hartman
2022-10-28 12:04 ` [PATCH 5.10 63/73] arm64: dts: qcom: sc7180-trogdor: Fixup modem memory region Greg Kroah-Hartman
2022-10-28 12:04 ` [PATCH 5.10 64/73] arm64: topology: move store_cpu_topology() to shared code Greg Kroah-Hartman
2022-10-28 12:04 ` [PATCH 5.10 65/73] riscv: topology: fix default topology reporting Greg Kroah-Hartman
2022-10-28 12:04 ` [PATCH 5.10 66/73] perf/x86/intel/pt: Relax address filter validation Greg Kroah-Hartman
2022-10-28 12:04 ` [PATCH 5.10 67/73] hv_netvsc: Fix race between VF offering and VF association message from host Greg Kroah-Hartman
2022-10-28 12:04 ` [PATCH 5.10 68/73] [PATCH v3] ACPI: video: Force backlight native for more TongFang devices Greg Kroah-Hartman
2022-10-28 12:04 ` [PATCH 5.10 69/73] x86/Kconfig: Drop check for -mabi=ms for CONFIG_EFI_STUB Greg Kroah-Hartman
2022-10-28 12:04 ` [PATCH 5.10 70/73] Makefile.debug: re-enable debug info for .S files Greg Kroah-Hartman
2022-10-28 12:04 ` [PATCH 5.10 71/73] mmc: core: Add SD card quirk for broken discard Greg Kroah-Hartman
2022-10-28 12:04 ` [PATCH 5.10 72/73] blk-wbt: fix that rwb->wc is always set to 1 in wbt_init() Greg Kroah-Hartman
2022-10-28 12:04 ` [PATCH 5.10 73/73] mm: /proc/pid/smaps_rollup: fix no vmas null-deref Greg Kroah-Hartman
2022-10-28 13:55 ` [PATCH 5.10 00/73] 5.10.152-rc1 review Rudi Heitbaum
2022-10-28 17:14 ` Pavel Machek
2022-10-28 19:44 ` Sudip Mukherjee (Codethink)
2022-10-28 20:55 ` Florian Fainelli
2022-10-29  3:35 ` Guenter Roeck
2022-10-29  6:55 ` Naresh Kamboju

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20221028120233.624608250@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=daniel@iogearbox.net \
    --cc=edumazet@google.com \
    --cc=kafai@fb.com \
    --cc=kuniyu@amazon.co.jp \
    --cc=patches@lists.linux.dev \
    --cc=sashal@kernel.org \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox