From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-dl2-f42.google.com (mail-dl2-f42.google.com [74.125.229.170]) (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 C9F87446BEA for ; Fri, 2 Oct 2026 07:46:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.229.170 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790927205; cv=none; b=NsVoHBzdJj739ftk5wV55yyKyWUqZFsoT1B28haX+0KCwkS+pVeTuadpu0ixUX/H1r+irHOaHZIzZRRlhGHSOyhNvF+AD3Spo9xEdgnqdW5ZFGALbXmM1XeB7cMkACB4jyyH5tG78I/SEl2LkUjG6Hu4GPpLB5lzzIkgpLy9e9c= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790927205; c=relaxed/simple; bh=Gi+4nfEvuXQGlo0g5mXVBj1pECSfFNUb6sc20UM6ULY=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=mM3zdQOABrYk1IL2kXQsbRGWNadSfgFJ3eH0ro+B/i9IbkpWhxTtwe0k48kdY62Sn0SWrAStYJIgeXh0WAjPpaZ0nMEy6VZFtPYVqulHEzAQS3C5iILqrCasPYhY/i6i6nj3LdL5o6U7k4v1UFs3/+ZhFrfC9zE1NJQrz8iOSAM= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=PcdGXZGR; arc=none smtp.client-ip=74.125.229.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="PcdGXZGR" Received: by mail-dl2-f42.google.com with SMTP id a92af1059eb24-144f47a9b57so6984583c88.2 for ; Fri, 02 Oct 2026 00:46:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790927202; x=1791532002; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=xcvM+ew7yM+UK9bAQwqe/0F9zFjnDuHgdGa2U9rD4LU=; b=PcdGXZGR3Y8SwYoY/KEEELjbUPqpAU64qQ1KnBqM7YopwR19pRB6oSEwrMLBl/KYMm MLNMOE2PPoMT/vxUTaEoDvy5nKKsQwSPiLslyusOkbLjpKz6cBglQ1/Wlx7mM09JAvJI 21vmmzoG6PF4uEdGHzsH2HYjs1jg3V5Inj1HdovXJpvPRLExOuUjBXWTKi+10L+ar2U4 EdkNUJKgFX8m6/vFaX3312L7uRZNvS0y3ZW73kkJ5WTwzhdh/uL37BWjC3etmVBPKfJb yehXVLO2+6pRDZovQGjtZFdnzuqUigzQor9BQk0KOqL4EuE9eMu7EjCi7/Ir1T/IvabB /NRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790927202; x=1791532002; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=xcvM+ew7yM+UK9bAQwqe/0F9zFjnDuHgdGa2U9rD4LU=; b=PDgsORDgjrqCIizQq/JSvUgFDkWpARFRM3qO+Ce58HWfJPJVtXJ8RFQCvsKDvnxWvC bT5f9QL88ihjVf78+dNtbsrJSlTfNe7tN84Jl9kb2RFoJmzWVRyMBd0hSHPQXuLSmp3i UpYqR85A+Dp4zvQ17rrPv1OTdwJzRljR+Pt14FUpMB+gw5kSb57Eadc0ubWaAJz6IMmy q1PNYl0TT7vb8lEIdg0vqs0SNldQu7bFHAz/HyE4b7jyKY2ZsoxMDiSIPEZEovLKbWqw EGE5KbDXEF32e3leyw7ZINPmpZ4iNV6kl1h2caqxixn25qc0HIoSjm85oFvu9/oFJllM J3jg== X-Forwarded-Encrypted: i=1; AKwUvBzN1dbh1k0C2/2oQben/epnMAe6/9K2Mm2NeCZxc8bG0jEsOitjKxAUvEhxeti+KVlMSGFTMH6nBN4gZYo=@vger.kernel.org X-Gm-Message-State: AFuF++kbcE34zRk3tnygbmdGgIJ325/kxRXWeOE7pvBsUXP1GbAydkr1 +cZ8b4A2LqbCZMvWZE+kgpWCxZr2CTaYKDUtp9KuTqVRwrjMZVZOdPTU X-Gm-Gg: AYBFou3173qX/E2j2/9yuOku1o5rHLsbWSGuf53imbX2fQGkQDk05dGeYxznq23kpGN 6ISFux/n5cy4UVM1lS1UygRXHu4sdmWedWyxVsXleFdcli2QTf192yYgLEunOmcgve9x8JEiMyG oIbEv9TA1h97qptT8dMP6t795L831SL0z7nG+mvzsNPVBBM49ob7RXuH+vmz2ArmmwNOATcEwh3 7bqTt17OZUZmFDcnSgXwmDAXtyQRXos+Pk2c+tz68Ngu6sxrzFmq0pdPspdWzgcd92ujJp4ms8K fGAra/P6iz6+ZAAKkfQduxfgBzHQzKvMULORwhcAgElEmLad/ikuXXNx4gXQiRA2XWKgcMXyGJh zJ/EVPuZ4QGY8M1qipI6m7+Q7rBuDy/+qQoxuOA96HNrFFZldm0B2+ES7ag2P85h1W1KShNRHqS R1Nstmz+2NnDhAXczSYl83wkHB/3FHPo/FaVke5pQyi9Hx6iTKHvKDDF0R7o6QYCHPa5GpG4u6O nt7Y1k= X-Received: by 2002:a05:701b:2096:10b0:143:2719:566e with SMTP id a92af1059eb24-14f5d3b9a1fmr1967596c88.42.1790927201379; Fri, 02 Oct 2026 00:46:41 -0700 (PDT) Received: from dbg-srv ([123.118.75.63]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-34f0672c2d1sm5871618eec.4.2026.10.02.00.46.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Oct 2026 00:46:40 -0700 (PDT) From: physicalmtea@gmail.com To: stefanha@redhat.com, sgarzare@redhat.com, mst@redhat.com Cc: jasowangio@gmail.com, eperezma@redhat.com, xuanzhuo@linux.alibaba.com, davem@davemloft.net, edumazet@kernel.org, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, virtualization@lists.linux.dev, kvm@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 3/5] vsock: reuse same-flow socket lookup in RX batches Date: Fri, 2 Oct 2026 07:45:49 +0000 Message-ID: <20261002074551.318789-4-physicalmtea@gmail.com> X-Mailer: git-send-email 2.53.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Jia Jia An RX lock batch still looks up the socket for every packet and takes a temporary lookup reference, even though the batch already holds a reference to the locked socket. Record the network namespace and packet address tuple when a batch starts. Reuse the batch socket for later STREAM/RW packets with the same tuple, and release the batch before looking up a different flow. The cached path still traces every packet, takes an skb owner reference, validates socket state, source and transport, updates credit, and runs the receive state machine. Only the socket table lookup and its temporary reference are skipped. Signed-off-by: Jia Jia --- include/linux/virtio_vsock.h | 3 ++ net/vmw_vsock/virtio_transport_common.c | 58 +++++++++++++++---------- 2 files changed, 37 insertions(+), 24 deletions(-) diff --git a/include/linux/virtio_vsock.h b/include/linux/virtio_vsock.h index 95ab1a75f..4369adc07 100644 --- a/include/linux/virtio_vsock.h +++ b/include/linux/virtio_vsock.h @@ -285,6 +285,9 @@ void virtio_transport_recv_pkt(struct virtio_transport *t, struct virtio_transport_rx_batch { struct sock *sk; + struct net *net; + struct sockaddr_vm src; + struct sockaddr_vm dst; }; void virtio_transport_recv_pkt_batch(struct virtio_transport *t, diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c index ad1e99689..d8c9c90c0 100644 --- a/net/vmw_vsock/virtio_transport_common.c +++ b/net/vmw_vsock/virtio_transport_common.c @@ -1965,6 +1965,7 @@ void virtio_transport_rx_batch_finish(struct virtio_transport_rx_batch *batch) struct sock *sk = batch->sk; batch->sk = NULL; + batch->net = NULL; if (!sk) return; @@ -1996,9 +1997,38 @@ void virtio_transport_recv_pkt_batch(struct virtio_transport *t, virtio_transport_recv_pkt_init_addrs(skb, &src, &dst); virtio_transport_trace_recv_pkt(skb, &src, &dst); + if (batch->sk) { + if (batch->net == net && + vsock_addr_equals_addr(&batch->src, &src) && + vsock_addr_equals_addr(&batch->dst, &dst) && + virtio_transport_recv_pkt_batchable(t, batch->sk)) { + sk = batch->sk; + if (!skb_set_owner_sk_safe(skb, sk)) { + WARN_ONCE(1, "receiving vsock socket has sk_refcnt == 0\n"); + virtio_transport_rx_batch_finish(batch); + kfree_skb(skb); + return; + } + + ctx = (struct virtio_transport_rx_pkt_ctx) { + .net = net, + .src = &src, + .dst = &dst, + .batchable = &batchable, + }; + free_pkt = virtio_transport_recv_pkt_locked(t, skb, sk, &ctx); + if (!batchable) + virtio_transport_rx_batch_finish(batch); + if (free_pkt) + kfree_skb(skb); + return; + } + + virtio_transport_rx_batch_finish(batch); + } + sk = virtio_transport_recv_pkt_find_socket(skb, &src, &dst, net); if (!sk) { - virtio_transport_rx_batch_finish(batch); (void)virtio_transport_reset_no_sock(t, skb, net); kfree_skb(skb); return; @@ -2006,33 +2036,10 @@ void virtio_transport_recv_pkt_batch(struct virtio_transport *t, if (!skb_set_owner_sk_safe(skb, sk)) { WARN_ONCE(1, "receiving vsock socket has sk_refcnt == 0\n"); - virtio_transport_rx_batch_finish(batch); kfree_skb(skb); return; } - if (batch->sk && batch->sk != sk) { - /* Never acquire a second socket lock. */ - virtio_transport_rx_batch_finish(batch); - } - - if (batch->sk == sk) { - /* Keep the batch reference; drop this packet's lookup reference. */ - sock_put(sk); - ctx = (struct virtio_transport_rx_pkt_ctx) { - .net = net, - .src = &src, - .dst = &dst, - .batchable = &batchable, - }; - free_pkt = virtio_transport_recv_pkt_locked(t, skb, sk, &ctx); - if (!batchable) - virtio_transport_rx_batch_finish(batch); - if (free_pkt) - kfree_skb(skb); - return; - } - lock_sock(sk); /* * Sockmap insertion takes the socket lock, but removal only holds @@ -2051,6 +2058,9 @@ void virtio_transport_recv_pkt_batch(struct virtio_transport *t, free_pkt = virtio_transport_recv_pkt_locked(t, skb, sk, &ctx); if (start_batch && batchable) { /* Keep the lookup reference until the batch is released. */ + batch->net = net; + batch->src = src; + batch->dst = dst; batch->sk = sk; return; } -- 2.53.0