Skip to content

Commit 1c6d2d8

Browse files
committed
vsock: unify table locks
The DGRAM patches introduce an additional vsock table lock, in addition to the original vsock_table_lock, to operate on the vsock dgram bound table. But the knowledge of whether the socket is dgram or not is not properly propagated, so there are code paths that can operate on one list while having a lock on the wrong one. As the gains of having two table locks are minimal, unify the table locks on the original one. This fixes a kernel bug like this one: [ 3.260602] list_del corruption. prev->next should be ffff0000823a3748, but was ffff000080c379c8. (prev=ffff80008151e828) [ 3.261075] ------------[ cut here ]------------ [ 3.261286] kernel BUG at lib/list_debug.c:62! [ 3.261382] Internal error: Oops - BUG: 00000000f2000800 [#1] SMP [ 3.261464] CPU: 2 UID: 0 PID: 222 Comm: vsock Not tainted 6.12.44 #3 [ 3.261658] Hardware name: linux,dummy-virt (DT) [ 3.261799] pstate: 61400005 (nZCv daif +PAN -UAO -TCO +DIT -SSBS BTYPE=--) [ 3.262017] pc : __list_del_entry_valid_or_report+0xa0/0xd8 [ 3.262210] lr : __list_del_entry_valid_or_report+0xa0/0xd8 [ 3.262314] sp : ffff800082cc3c80 [ 3.262349] x29: ffff800082cc3c80 x28: ffff000082c62100 x27: 0000000000000000 [ 3.262615] x26: 0000000000000000 x25: ffff80008151fa58 x24: 0000000000000000 [ 3.262818] x23: ffff0000823a3840 x22: ffff0000823a3748 x21: ffff80008151d878 [ 3.263021] x20: ffff80008151fa58 x19: ffff0000823a3440 x18: 000000000000000a [ 3.263224] x17: 20747562202c3834 x16: 3733613332383030 x15: 3030666666662065 [ 3.263428] x14: ffff8000813ec7f0 x13: 38666666663d7665 x12: 727028202e386339 [ 3.263644] x11: ffff8000813ec7f0 x10: 000000000002bfa8 x9 : 00000000000000c6 [ 3.263847] x8 : ffff8000814187f0 x7 : 80000000fffff800 x6 : ffff8000814187f0 [ 3.264052] x5 : 0000000000000000 x4 : 0000000000000000 x3 : 00000000fffff7ff [ 3.264200] x2 : ffff8000813ec720 x1 : ffff8000813ec720 x0 : 000000000000006d [ 3.264270] Call trace: [ 3.264295] __list_del_entry_valid_or_report+0xa0/0xd8 [ 3.264459] vsock_bind_common+0x2bc/0x2c0 [ 3.264577] __vsock_bind+0xa8/0x200 [ 3.264686] vsock_bind+0x44/0x70 [ 3.264793] __sys_bind+0x64/0xc4 [ 3.264950] __arm64_sys_bind+0x1c/0x38 [ 3.265061] invoke_syscall.constprop.0+0x40/0xf0 [ 3.265203] el0_svc_common.constprop.0+0x38/0xd8 [ 3.265344] do_el0_svc+0x1c/0x28 [ 3.265451] el0_svc+0x38/0x150 [ 3.265560] el0t_64_sync_handler+0x120/0x12c [ 3.265722] el0t_64_sync+0x194/0x198 [ 3.265834] Code: b00034c0 aa0403e2 912a0000 97ffd025 (d4210000) [ 3.266005] ---[ end trace 0000000000000000 ]--- Signed-off-by: Sergio Lopez <[email protected]>
1 parent 4a6259f commit 1c6d2d8

18 files changed

+34
-54
lines changed

patches-tee/0001-virtio-enable-DMA-API-if-memory-is-restricted.patch

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
From c6edd578fcd5b420fdf759af974c050b92258480 Mon Sep 17 00:00:00 2001
1+
From b9512be602b76ff5870c000c657591ab2c427089 Mon Sep 17 00:00:00 2001
22
From: Sergio Lopez <[email protected]>
33
Date: Fri, 10 Sep 2021 13:05:01 +0200
44
Subject: [PATCH 1/4] virtio: enable DMA API if memory is restricted

patches-tee/0002-x86-sev-write-AP-reset-vector.patch

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
From e5a573b2dc70b01eaddf7124cb436140bd524688 Mon Sep 17 00:00:00 2001
1+
From 9103e0957f95b6457120c551bc269b9044079ae5 Mon Sep 17 00:00:00 2001
22
From: Sergio Lopez <[email protected]>
33
Date: Thu, 20 Oct 2022 10:23:16 +0200
44
Subject: [PATCH 2/4] x86/sev: write AP reset vector

patches-tee/0003-Implement-driver-to-retrieve-secrets-from-cmdline.patch

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
From 1e770f38f17fd55914d219d488fda76810f9e721 Mon Sep 17 00:00:00 2001
1+
From b924b6ed30ef595f6bfa3f0f231125184541c20e Mon Sep 17 00:00:00 2001
22
From: Sergio Lopez <[email protected]>
33
Date: Wed, 3 Aug 2022 12:35:12 +0200
44
Subject: [PATCH 3/4] Implement driver to retrieve secrets from cmdline

patches-tee/0004-x86-sev-Avoid-using-native_cpuid.patch

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
From 0aacc70d72f0ca3b0eb91793b06651a72a4536ec Mon Sep 17 00:00:00 2001
1+
From 39bdaea7c82fb96155f41d9cf18bffa3ab35f507 Mon Sep 17 00:00:00 2001
22
From: Sergio Lopez <[email protected]>
33
Date: Wed, 5 Jun 2024 16:20:08 +0200
44
Subject: [PATCH 4/4] x86/sev: Avoid using native_cpuid

patches/0008-virtio-vsock-support-dgrams.patch

Lines changed: 17 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
From 8e01b14892ef313342b0e738b65f6486f07aab26 Mon Sep 17 00:00:00 2001
1+
From 6c72954d95d84fbe85766ffeb5ba9070f52d7dbe Mon Sep 17 00:00:00 2001
22
From: Bobby Eshleman <bobby.eshleman () bytedance ! com>
33
Date: Sat, 10 Jun 2023 00:58:33 +0000
44
Subject: [PATCH 08/21] virtio/vsock: support dgrams
@@ -29,11 +29,11 @@ Signed-off-by: Bobby Eshleman <[email protected]>
2929
include/linux/virtio_vsock.h | 5 +-
3030
include/net/af_vsock.h | 1 +
3131
include/uapi/linux/virtio_vsock.h | 1 +
32-
net/vmw_vsock/af_vsock.c | 62 +++++++--
32+
net/vmw_vsock/af_vsock.c | 48 +++++--
3333
net/vmw_vsock/virtio_transport.c | 23 +++-
3434
net/vmw_vsock/virtio_transport_common.c | 175 ++++++++++++++++++------
3535
net/vmw_vsock/vsock_loopback.c | 8 +-
36-
8 files changed, 242 insertions(+), 60 deletions(-)
36+
8 files changed, 229 insertions(+), 59 deletions(-)
3737

3838
diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c
3939
index 4659a74078bd..eb088aa1afc1 100644
@@ -157,7 +157,7 @@ index 9c25f267bbc0..27b4b2b8bf13 100644
157157

158158
enum virtio_vsock_op {
159159
diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
160-
index b0bdb9d1f816..6b5526047973 100644
160+
index b0bdb9d1f816..6418b8fa98c5 100644
161161
--- a/net/vmw_vsock/af_vsock.c
162162
+++ b/net/vmw_vsock/af_vsock.c
163163
@@ -118,6 +118,7 @@ static int __vsock_bind(struct sock *sk, struct sockaddr_vm *addr);
@@ -168,16 +168,15 @@ index b0bdb9d1f816..6b5526047973 100644
168168

169169
/* Protocol family. */
170170
struct proto vsock_proto = {
171-
@@ -185,6 +186,8 @@ struct list_head vsock_connected_table[VSOCK_HASH_SIZE];
171+
@@ -185,6 +186,7 @@ struct list_head vsock_connected_table[VSOCK_HASH_SIZE];
172172
EXPORT_SYMBOL_GPL(vsock_connected_table);
173173
DEFINE_SPINLOCK(vsock_table_lock);
174174
EXPORT_SYMBOL_GPL(vsock_table_lock);
175175
+static struct list_head vsock_dgram_bind_table[VSOCK_HASH_SIZE];
176-
+static DEFINE_SPINLOCK(vsock_dgram_table_lock);
177176

178177
/* Autobind this socket to the local address if necessary. */
179178
static int vsock_auto_bind(struct vsock_sock *vsk)
180-
@@ -207,6 +210,9 @@ static void vsock_init_tables(void)
179+
@@ -207,6 +209,9 @@ static void vsock_init_tables(void)
181180

182181
for (i = 0; i < ARRAY_SIZE(vsock_connected_table); i++)
183182
INIT_LIST_HEAD(&vsock_connected_table[i]);
@@ -187,7 +186,7 @@ index b0bdb9d1f816..6b5526047973 100644
187186
}
188187

189188
static void __vsock_insert_bound(struct list_head *list,
190-
@@ -235,8 +241,8 @@ static void __vsock_remove_connected(struct vsock_sock *vsk)
189+
@@ -235,8 +240,8 @@ static void __vsock_remove_connected(struct vsock_sock *vsk)
191190
sock_put(&vsk->sk);
192191
}
193192

@@ -198,7 +197,7 @@ index b0bdb9d1f816..6b5526047973 100644
198197
{
199198
struct vsock_sock *vsk;
200199

201-
@@ -253,6 +259,23 @@ struct sock *vsock_find_bound_socket_common(struct sockaddr_vm *addr,
200+
@@ -253,6 +258,23 @@ struct sock *vsock_find_bound_socket_common(struct sockaddr_vm *addr,
202201
return NULL;
203202
}
204203

@@ -207,13 +206,13 @@ index b0bdb9d1f816..6b5526047973 100644
207206
+{
208207
+ struct sock *sk;
209208
+
210-
+ spin_lock_bh(&vsock_dgram_table_lock);
209+
+ spin_lock_bh(&vsock_table_lock);
211210
+ sk = vsock_find_bound_socket_common(addr,
212211
+ &vsock_dgram_bind_table[VSOCK_HASH(addr)]);
213212
+ if (sk)
214213
+ sock_hold(sk);
215214
+
216-
+ spin_unlock_bh(&vsock_dgram_table_lock);
215+
+ spin_unlock_bh(&vsock_table_lock);
217216
+
218217
+ return sk;
219218
+}
@@ -222,38 +221,19 @@ index b0bdb9d1f816..6b5526047973 100644
222221
static struct sock *__vsock_find_bound_socket(struct sockaddr_vm *addr)
223222
{
224223
return vsock_find_bound_socket_common(addr, vsock_bound_sockets(addr));
225-
@@ -292,6 +315,14 @@ void vsock_insert_connected(struct vsock_sock *vsk)
226-
}
227-
EXPORT_SYMBOL_GPL(vsock_insert_connected);
228-
229-
+static void vsock_remove_dgram_bound(struct vsock_sock *vsk)
230-
+{
231-
+ spin_lock_bh(&vsock_dgram_table_lock);
232-
+ if (__vsock_in_bound_table(vsk))
233-
+ __vsock_remove_bound(vsk);
234-
+ spin_unlock_bh(&vsock_dgram_table_lock);
235-
+}
236-
+
237-
void vsock_remove_bound(struct vsock_sock *vsk)
238-
{
239-
spin_lock_bh(&vsock_table_lock);
240-
@@ -344,9 +375,12 @@ EXPORT_SYMBOL_GPL(vsock_find_connected_socket);
224+
@@ -344,9 +366,9 @@ EXPORT_SYMBOL_GPL(vsock_find_connected_socket);
241225
void vsock_remove_sock(struct vsock_sock *vsk)
242226
{
243227
/* Transport reassignment must not remove the binding. */
244228
- if (sock_flag(sk_vsock(vsk), SOCK_DEAD))
245-
- vsock_remove_bound(vsk);
246-
-
247229
+ if (sock_flag(sk_vsock(vsk), SOCK_DEAD)) {
248-
+ if (sock_type_connectible(sk_vsock(vsk)->sk_type))
249-
+ vsock_remove_bound(vsk);
250-
+ else
251-
+ vsock_remove_dgram_bound(vsk);
230+
vsock_remove_bound(vsk);
231+
-
252232
+ }
253233
vsock_remove_connected(vsk);
254234
}
255235
EXPORT_SYMBOL_GPL(vsock_remove_sock);
256-
@@ -772,11 +806,19 @@ static int __vsock_bind_connectible(struct vsock_sock *vsk,
236+
@@ -772,11 +794,19 @@ static int __vsock_bind_connectible(struct vsock_sock *vsk,
257237
return vsock_bind_common(vsk, addr, vsock_bind_table, VSOCK_HASH_SIZE + 1);
258238
}
259239

@@ -267,17 +247,17 @@ index b0bdb9d1f816..6b5526047973 100644
267247
+ if (!vsk->transport || !vsk->transport->dgram_bind) {
268248
+ int retval;
269249
+
270-
+ spin_lock_bh(&vsock_dgram_table_lock);
250+
+ spin_lock_bh(&vsock_table_lock);
271251
+ retval = vsock_bind_common(vsk, addr, vsock_dgram_bind_table,
272252
+ VSOCK_HASH_SIZE);
273-
+ spin_unlock_bh(&vsock_dgram_table_lock);
253+
+ spin_unlock_bh(&vsock_table_lock);
274254
+
275255
+ return retval;
276256
+ }
277257

278258
return vsk->transport->dgram_bind(vsk, addr);
279259
}
280-
@@ -807,7 +849,7 @@ static int __vsock_bind(struct sock *sk, struct sockaddr_vm *addr)
260+
@@ -807,7 +837,7 @@ static int __vsock_bind(struct sock *sk, struct sockaddr_vm *addr)
281261
break;
282262

283263
case SOCK_DGRAM:

patches/0009-Transparent-Socket-Impersonation-implementation.patch

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
From 6e363ca51a842106546205ea318a04e966e05348 Mon Sep 17 00:00:00 2001
1+
From 0b8e9adbefbdf73b25160e7fb5c47f3749136cca Mon Sep 17 00:00:00 2001
22
From: Sergio Lopez <[email protected]>
33
Date: Thu, 19 May 2022 22:38:26 +0200
44
Subject: [PATCH 09/21] Transparent Socket Impersonation implementation

patches/0010-tsi-allow-hijacking-sockets-tsi_hijack.patch

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
From 52d34f3715d37a0a20a0ab19adfc3cce14936ea5 Mon Sep 17 00:00:00 2001
1+
From e25f8d8cc856be6b342a20093a43eda95ce8fc35 Mon Sep 17 00:00:00 2001
22
From: Sergio Lopez <[email protected]>
33
Date: Thu, 19 May 2022 22:42:01 +0200
44
Subject: [PATCH 10/21] tsi: allow hijacking sockets (tsi_hijack)

patches/0011-arm64-cpufeature-Unify-SCOPE_LOCAL_CPU-early-late-be.patch

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
From ecf649ecac3697176040b7459080575cf6ddbade Mon Sep 17 00:00:00 2001
1+
From 771614b1f380963a7fec0fe2f5b2a3b265347782 Mon Sep 17 00:00:00 2001
22
From: Asahi Lina <[email protected]>
33
Date: Wed, 25 Sep 2024 16:35:34 +0200
44
Subject: [PATCH 11/21] arm64: cpufeature: Unify SCOPE_LOCAL_CPU early & late

patches/0012-prctl-Introduce-PR_-SET-GET-_MEM_MODEL.patch

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
From 2052ac9ba265a1dbc4b46aa3444ca29319dd7f19 Mon Sep 17 00:00:00 2001
1+
From 3cc2e827a5a15eaf154c6e081d4a69c0d8c07e87 Mon Sep 17 00:00:00 2001
22
From: Hector Martin <[email protected]>
33
Date: Thu, 11 Apr 2024 09:51:20 +0900
44
Subject: [PATCH 12/21] prctl: Introduce PR_{SET,GET}_MEM_MODEL

patches/0013-arm64-Implement-PR_-GET-SET-_MEM_MODEL-for-always-TS.patch

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
From 8d60b85d1b4605a68212be4500777addbcd61bb4 Mon Sep 17 00:00:00 2001
1+
From 0cacaf7a382f24704d9483e76c0aa6e5a145d628 Mon Sep 17 00:00:00 2001
22
From: Hector Martin <[email protected]>
33
Date: Thu, 11 Apr 2024 09:51:21 +0900
44
Subject: [PATCH 13/21] arm64: Implement PR_{GET,SET}_MEM_MODEL for always-TSO

0 commit comments

Comments
 (0)