From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: stable@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
patches@lists.linux.dev,
Bobby Eshleman <bobby.eshleman@bytedance.com>,
Stefano Garzarella <sgarzare@redhat.com>,
"David S. Miller" <davem@davemloft.net>,
Sasha Levin <sashal@kernel.org>
Subject: [PATCH 6.1 359/379] virtio/vsock: replace virtio_vsock_pkt with sk_buff
Date: Wed, 15 Nov 2023 14:27:14 -0500 [thread overview]
Message-ID: <20231115192706.397251970@linuxfoundation.org> (raw)
In-Reply-To: <20231115192645.143643130@linuxfoundation.org>
6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bobby Eshleman <bobby.eshleman@bytedance.com>
[ Upstream commit 71dc9ec9ac7d3eee785cdc986c3daeb821381e20 ]
This commit changes virtio/vsock to use sk_buff instead of
virtio_vsock_pkt. Beyond better conforming to other net code, using
sk_buff allows vsock to use sk_buff-dependent features in the future
(such as sockmap) and improves throughput.
This patch introduces the following performance changes:
Tool: Uperf
Env: Phys Host + L1 Guest
Payload: 64k
Threads: 16
Test Runs: 10
Type: SOCK_STREAM
Before: commit b7bfaa761d760 ("Linux 6.2-rc3")
Before
------
g2h: 16.77Gb/s
h2g: 10.56Gb/s
After
-----
g2h: 21.04Gb/s
h2g: 10.76Gb/s
Signed-off-by: Bobby Eshleman <bobby.eshleman@bytedance.com>
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Stable-dep-of: 3a5cc90a4d17 ("vsock/virtio: remove socket from connected/bound list on shutdown")
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/vhost/vsock.c | 214 +++++-------
include/linux/virtio_vsock.h | 129 ++++++--
net/vmw_vsock/virtio_transport.c | 149 +++------
net/vmw_vsock/virtio_transport_common.c | 422 +++++++++++++-----------
net/vmw_vsock/vsock_loopback.c | 51 +--
5 files changed, 498 insertions(+), 467 deletions(-)
diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c
index a2b3743723639..1f3b89c885cca 100644
--- a/drivers/vhost/vsock.c
+++ b/drivers/vhost/vsock.c
@@ -51,8 +51,7 @@ struct vhost_vsock {
struct hlist_node hash;
struct vhost_work send_pkt_work;
- spinlock_t send_pkt_list_lock;
- struct list_head send_pkt_list; /* host->guest pending packets */
+ struct sk_buff_head send_pkt_queue; /* host->guest pending packets */
atomic_t queued_replies;
@@ -108,40 +107,31 @@ vhost_transport_do_send_pkt(struct vhost_vsock *vsock,
vhost_disable_notify(&vsock->dev, vq);
do {
- struct virtio_vsock_pkt *pkt;
+ struct virtio_vsock_hdr *hdr;
+ size_t iov_len, payload_len;
struct iov_iter iov_iter;
+ u32 flags_to_restore = 0;
+ struct sk_buff *skb;
unsigned out, in;
size_t nbytes;
- size_t iov_len, payload_len;
int head;
- u32 flags_to_restore = 0;
- spin_lock_bh(&vsock->send_pkt_list_lock);
- if (list_empty(&vsock->send_pkt_list)) {
- spin_unlock_bh(&vsock->send_pkt_list_lock);
+ skb = virtio_vsock_skb_dequeue(&vsock->send_pkt_queue);
+
+ if (!skb) {
vhost_enable_notify(&vsock->dev, vq);
break;
}
- pkt = list_first_entry(&vsock->send_pkt_list,
- struct virtio_vsock_pkt, list);
- list_del_init(&pkt->list);
- spin_unlock_bh(&vsock->send_pkt_list_lock);
-
head = vhost_get_vq_desc(vq, vq->iov, ARRAY_SIZE(vq->iov),
&out, &in, NULL, NULL);
if (head < 0) {
- spin_lock_bh(&vsock->send_pkt_list_lock);
- list_add(&pkt->list, &vsock->send_pkt_list);
- spin_unlock_bh(&vsock->send_pkt_list_lock);
+ virtio_vsock_skb_queue_head(&vsock->send_pkt_queue, skb);
break;
}
if (head == vq->num) {
- spin_lock_bh(&vsock->send_pkt_list_lock);
- list_add(&pkt->list, &vsock->send_pkt_list);
- spin_unlock_bh(&vsock->send_pkt_list_lock);
-
+ virtio_vsock_skb_queue_head(&vsock->send_pkt_queue, skb);
/* We cannot finish yet if more buffers snuck in while
* re-enabling notify.
*/
@@ -153,26 +143,27 @@ vhost_transport_do_send_pkt(struct vhost_vsock *vsock,
}
if (out) {
- virtio_transport_free_pkt(pkt);
+ kfree_skb(skb);
vq_err(vq, "Expected 0 output buffers, got %u\n", out);
break;
}
iov_len = iov_length(&vq->iov[out], in);
- if (iov_len < sizeof(pkt->hdr)) {
- virtio_transport_free_pkt(pkt);
+ if (iov_len < sizeof(*hdr)) {
+ kfree_skb(skb);
vq_err(vq, "Buffer len [%zu] too small\n", iov_len);
break;
}
iov_iter_init(&iov_iter, ITER_DEST, &vq->iov[out], in, iov_len);
- payload_len = pkt->len - pkt->off;
+ payload_len = skb->len;
+ hdr = virtio_vsock_hdr(skb);
/* If the packet is greater than the space available in the
* buffer, we split it using multiple buffers.
*/
- if (payload_len > iov_len - sizeof(pkt->hdr)) {
- payload_len = iov_len - sizeof(pkt->hdr);
+ if (payload_len > iov_len - sizeof(*hdr)) {
+ payload_len = iov_len - sizeof(*hdr);
/* As we are copying pieces of large packet's buffer to
* small rx buffers, headers of packets in rx queue are
@@ -185,31 +176,30 @@ vhost_transport_do_send_pkt(struct vhost_vsock *vsock,
* bits set. After initialized header will be copied to
* rx buffer, these required bits will be restored.
*/
- if (le32_to_cpu(pkt->hdr.flags) & VIRTIO_VSOCK_SEQ_EOM) {
- pkt->hdr.flags &= ~cpu_to_le32(VIRTIO_VSOCK_SEQ_EOM);
+ if (le32_to_cpu(hdr->flags) & VIRTIO_VSOCK_SEQ_EOM) {
+ hdr->flags &= ~cpu_to_le32(VIRTIO_VSOCK_SEQ_EOM);
flags_to_restore |= VIRTIO_VSOCK_SEQ_EOM;
- if (le32_to_cpu(pkt->hdr.flags) & VIRTIO_VSOCK_SEQ_EOR) {
- pkt->hdr.flags &= ~cpu_to_le32(VIRTIO_VSOCK_SEQ_EOR);
+ if (le32_to_cpu(hdr->flags) & VIRTIO_VSOCK_SEQ_EOR) {
+ hdr->flags &= ~cpu_to_le32(VIRTIO_VSOCK_SEQ_EOR);
flags_to_restore |= VIRTIO_VSOCK_SEQ_EOR;
}
}
}
/* Set the correct length in the header */
- pkt->hdr.len = cpu_to_le32(payload_len);
+ hdr->len = cpu_to_le32(payload_len);
- nbytes = copy_to_iter(&pkt->hdr, sizeof(pkt->hdr), &iov_iter);
- if (nbytes != sizeof(pkt->hdr)) {
- virtio_transport_free_pkt(pkt);
+ nbytes = copy_to_iter(hdr, sizeof(*hdr), &iov_iter);
+ if (nbytes != sizeof(*hdr)) {
+ kfree_skb(skb);
vq_err(vq, "Faulted on copying pkt hdr\n");
break;
}
- nbytes = copy_to_iter(pkt->buf + pkt->off, payload_len,
- &iov_iter);
+ nbytes = copy_to_iter(skb->data, payload_len, &iov_iter);
if (nbytes != payload_len) {
- virtio_transport_free_pkt(pkt);
+ kfree_skb(skb);
vq_err(vq, "Faulted on copying pkt buf\n");
break;
}
@@ -217,31 +207,28 @@ vhost_transport_do_send_pkt(struct vhost_vsock *vsock,
/* Deliver to monitoring devices all packets that we
* will transmit.
*/
- virtio_transport_deliver_tap_pkt(pkt);
+ virtio_transport_deliver_tap_pkt(skb);
- vhost_add_used(vq, head, sizeof(pkt->hdr) + payload_len);
+ vhost_add_used(vq, head, sizeof(*hdr) + payload_len);
added = true;
- pkt->off += payload_len;
+ skb_pull(skb, payload_len);
total_len += payload_len;
/* If we didn't send all the payload we can requeue the packet
* to send it with the next available buffer.
*/
- if (pkt->off < pkt->len) {
- pkt->hdr.flags |= cpu_to_le32(flags_to_restore);
+ if (skb->len > 0) {
+ hdr->flags |= cpu_to_le32(flags_to_restore);
- /* We are queueing the same virtio_vsock_pkt to handle
+ /* We are queueing the same skb to handle
* the remaining bytes, and we want to deliver it
* to monitoring devices in the next iteration.
*/
- pkt->tap_delivered = false;
-
- spin_lock_bh(&vsock->send_pkt_list_lock);
- list_add(&pkt->list, &vsock->send_pkt_list);
- spin_unlock_bh(&vsock->send_pkt_list_lock);
+ virtio_vsock_skb_clear_tap_delivered(skb);
+ virtio_vsock_skb_queue_head(&vsock->send_pkt_queue, skb);
} else {
- if (pkt->reply) {
+ if (virtio_vsock_skb_reply(skb)) {
int val;
val = atomic_dec_return(&vsock->queued_replies);
@@ -253,7 +240,7 @@ vhost_transport_do_send_pkt(struct vhost_vsock *vsock,
restart_tx = true;
}
- virtio_transport_free_pkt(pkt);
+ consume_skb(skb);
}
} while(likely(!vhost_exceeds_weight(vq, ++pkts, total_len)));
if (added)
@@ -278,28 +265,26 @@ static void vhost_transport_send_pkt_work(struct vhost_work *work)
}
static int
-vhost_transport_send_pkt(struct virtio_vsock_pkt *pkt)
+vhost_transport_send_pkt(struct sk_buff *skb)
{
+ struct virtio_vsock_hdr *hdr = virtio_vsock_hdr(skb);
struct vhost_vsock *vsock;
- int len = pkt->len;
+ int len = skb->len;
rcu_read_lock();
/* Find the vhost_vsock according to guest context id */
- vsock = vhost_vsock_get(le64_to_cpu(pkt->hdr.dst_cid));
+ vsock = vhost_vsock_get(le64_to_cpu(hdr->dst_cid));
if (!vsock) {
rcu_read_unlock();
- virtio_transport_free_pkt(pkt);
+ kfree_skb(skb);
return -ENODEV;
}
- if (pkt->reply)
+ if (virtio_vsock_skb_reply(skb))
atomic_inc(&vsock->queued_replies);
- spin_lock_bh(&vsock->send_pkt_list_lock);
- list_add_tail(&pkt->list, &vsock->send_pkt_list);
- spin_unlock_bh(&vsock->send_pkt_list_lock);
-
+ virtio_vsock_skb_queue_tail(&vsock->send_pkt_queue, skb);
vhost_work_queue(&vsock->dev, &vsock->send_pkt_work);
rcu_read_unlock();
@@ -310,10 +295,8 @@ static int
vhost_transport_cancel_pkt(struct vsock_sock *vsk)
{
struct vhost_vsock *vsock;
- struct virtio_vsock_pkt *pkt, *n;
int cnt = 0;
int ret = -ENODEV;
- LIST_HEAD(freeme);
rcu_read_lock();
@@ -322,20 +305,7 @@ vhost_transport_cancel_pkt(struct vsock_sock *vsk)
if (!vsock)
goto out;
- spin_lock_bh(&vsock->send_pkt_list_lock);
- list_for_each_entry_safe(pkt, n, &vsock->send_pkt_list, list) {
- if (pkt->vsk != vsk)
- continue;
- list_move(&pkt->list, &freeme);
- }
- spin_unlock_bh(&vsock->send_pkt_list_lock);
-
- list_for_each_entry_safe(pkt, n, &freeme, list) {
- if (pkt->reply)
- cnt++;
- list_del(&pkt->list);
- virtio_transport_free_pkt(pkt);
- }
+ cnt = virtio_transport_purge_skbs(vsk, &vsock->send_pkt_queue);
if (cnt) {
struct vhost_virtqueue *tx_vq = &vsock->vqs[VSOCK_VQ_TX];
@@ -352,12 +322,14 @@ vhost_transport_cancel_pkt(struct vsock_sock *vsk)
return ret;
}
-static struct virtio_vsock_pkt *
-vhost_vsock_alloc_pkt(struct vhost_virtqueue *vq,
+static struct sk_buff *
+vhost_vsock_alloc_skb(struct vhost_virtqueue *vq,
unsigned int out, unsigned int in)
{
- struct virtio_vsock_pkt *pkt;
+ struct virtio_vsock_hdr *hdr;
struct iov_iter iov_iter;
+ struct sk_buff *skb;
+ size_t payload_len;
size_t nbytes;
size_t len;
@@ -366,50 +338,48 @@ vhost_vsock_alloc_pkt(struct vhost_virtqueue *vq,
return NULL;
}
- pkt = kzalloc(sizeof(*pkt), GFP_KERNEL);
- if (!pkt)
+ len = iov_length(vq->iov, out);
+
+ /* len contains both payload and hdr */
+ skb = virtio_vsock_alloc_skb(len, GFP_KERNEL);
+ if (!skb)
return NULL;
- len = iov_length(vq->iov, out);
iov_iter_init(&iov_iter, ITER_SOURCE, vq->iov, out, len);
- nbytes = copy_from_iter(&pkt->hdr, sizeof(pkt->hdr), &iov_iter);
- if (nbytes != sizeof(pkt->hdr)) {
+ hdr = virtio_vsock_hdr(skb);
+ nbytes = copy_from_iter(hdr, sizeof(*hdr), &iov_iter);
+ if (nbytes != sizeof(*hdr)) {
vq_err(vq, "Expected %zu bytes for pkt->hdr, got %zu bytes\n",
- sizeof(pkt->hdr), nbytes);
- kfree(pkt);
+ sizeof(*hdr), nbytes);
+ kfree_skb(skb);
return NULL;
}
- pkt->len = le32_to_cpu(pkt->hdr.len);
+ payload_len = le32_to_cpu(hdr->len);
/* No payload */
- if (!pkt->len)
- return pkt;
+ if (!payload_len)
+ return skb;
- /* The pkt is too big */
- if (pkt->len > VIRTIO_VSOCK_MAX_PKT_BUF_SIZE) {
- kfree(pkt);
+ /* The pkt is too big or the length in the header is invalid */
+ if (payload_len > VIRTIO_VSOCK_MAX_PKT_BUF_SIZE ||
+ payload_len + sizeof(*hdr) > len) {
+ kfree_skb(skb);
return NULL;
}
- pkt->buf = kvmalloc(pkt->len, GFP_KERNEL);
- if (!pkt->buf) {
- kfree(pkt);
- return NULL;
- }
+ virtio_vsock_skb_rx_put(skb);
- pkt->buf_len = pkt->len;
-
- nbytes = copy_from_iter(pkt->buf, pkt->len, &iov_iter);
- if (nbytes != pkt->len) {
- vq_err(vq, "Expected %u byte payload, got %zu bytes\n",
- pkt->len, nbytes);
- virtio_transport_free_pkt(pkt);
+ nbytes = copy_from_iter(skb->data, payload_len, &iov_iter);
+ if (nbytes != payload_len) {
+ vq_err(vq, "Expected %zu byte payload, got %zu bytes\n",
+ payload_len, nbytes);
+ kfree_skb(skb);
return NULL;
}
- return pkt;
+ return skb;
}
/* Is there space left for replies to rx packets? */
@@ -496,9 +466,9 @@ static void vhost_vsock_handle_tx_kick(struct vhost_work *work)
poll.work);
struct vhost_vsock *vsock = container_of(vq->dev, struct vhost_vsock,
dev);
- struct virtio_vsock_pkt *pkt;
int head, pkts = 0, total_len = 0;
unsigned int out, in;
+ struct sk_buff *skb;
bool added = false;
mutex_lock(&vq->mutex);
@@ -511,6 +481,8 @@ static void vhost_vsock_handle_tx_kick(struct vhost_work *work)
vhost_disable_notify(&vsock->dev, vq);
do {
+ struct virtio_vsock_hdr *hdr;
+
if (!vhost_vsock_more_replies(vsock)) {
/* Stop tx until the device processes already
* pending replies. Leave tx virtqueue
@@ -532,24 +504,26 @@ static void vhost_vsock_handle_tx_kick(struct vhost_work *work)
break;
}
- pkt = vhost_vsock_alloc_pkt(vq, out, in);
- if (!pkt) {
+ skb = vhost_vsock_alloc_skb(vq, out, in);
+ if (!skb) {
vq_err(vq, "Faulted on pkt\n");
continue;
}
- total_len += sizeof(pkt->hdr) + pkt->len;
+ total_len += sizeof(*hdr) + skb->len;
/* Deliver to monitoring devices all received packets */
- virtio_transport_deliver_tap_pkt(pkt);
+ virtio_transport_deliver_tap_pkt(skb);
+
+ hdr = virtio_vsock_hdr(skb);
/* Only accept correctly addressed packets */
- if (le64_to_cpu(pkt->hdr.src_cid) == vsock->guest_cid &&
- le64_to_cpu(pkt->hdr.dst_cid) ==
+ if (le64_to_cpu(hdr->src_cid) == vsock->guest_cid &&
+ le64_to_cpu(hdr->dst_cid) ==
vhost_transport_get_local_cid())
- virtio_transport_recv_pkt(&vhost_transport, pkt);
+ virtio_transport_recv_pkt(&vhost_transport, skb);
else
- virtio_transport_free_pkt(pkt);
+ kfree_skb(skb);
vhost_add_used(vq, head, 0);
added = true;
@@ -693,8 +667,7 @@ static int vhost_vsock_dev_open(struct inode *inode, struct file *file)
VHOST_VSOCK_WEIGHT, true, NULL);
file->private_data = vsock;
- spin_lock_init(&vsock->send_pkt_list_lock);
- INIT_LIST_HEAD(&vsock->send_pkt_list);
+ skb_queue_head_init(&vsock->send_pkt_queue);
vhost_work_init(&vsock->send_pkt_work, vhost_transport_send_pkt_work);
return 0;
@@ -760,16 +733,7 @@ static int vhost_vsock_dev_release(struct inode *inode, struct file *file)
vhost_vsock_flush(vsock);
vhost_dev_stop(&vsock->dev);
- spin_lock_bh(&vsock->send_pkt_list_lock);
- while (!list_empty(&vsock->send_pkt_list)) {
- struct virtio_vsock_pkt *pkt;
-
- pkt = list_first_entry(&vsock->send_pkt_list,
- struct virtio_vsock_pkt, list);
- list_del_init(&pkt->list);
- virtio_transport_free_pkt(pkt);
- }
- spin_unlock_bh(&vsock->send_pkt_list_lock);
+ virtio_vsock_skb_queue_purge(&vsock->send_pkt_queue);
vhost_dev_cleanup(&vsock->dev);
kfree(vsock->dev.vqs);
diff --git a/include/linux/virtio_vsock.h b/include/linux/virtio_vsock.h
index 35d7eedb5e8e4..3f9c166113063 100644
--- a/include/linux/virtio_vsock.h
+++ b/include/linux/virtio_vsock.h
@@ -7,6 +7,109 @@
#include <net/sock.h>
#include <net/af_vsock.h>
+#define VIRTIO_VSOCK_SKB_HEADROOM (sizeof(struct virtio_vsock_hdr))
+
+struct virtio_vsock_skb_cb {
+ bool reply;
+ bool tap_delivered;
+};
+
+#define VIRTIO_VSOCK_SKB_CB(skb) ((struct virtio_vsock_skb_cb *)((skb)->cb))
+
+static inline struct virtio_vsock_hdr *virtio_vsock_hdr(struct sk_buff *skb)
+{
+ return (struct virtio_vsock_hdr *)skb->head;
+}
+
+static inline bool virtio_vsock_skb_reply(struct sk_buff *skb)
+{
+ return VIRTIO_VSOCK_SKB_CB(skb)->reply;
+}
+
+static inline void virtio_vsock_skb_set_reply(struct sk_buff *skb)
+{
+ VIRTIO_VSOCK_SKB_CB(skb)->reply = true;
+}
+
+static inline bool virtio_vsock_skb_tap_delivered(struct sk_buff *skb)
+{
+ return VIRTIO_VSOCK_SKB_CB(skb)->tap_delivered;
+}
+
+static inline void virtio_vsock_skb_set_tap_delivered(struct sk_buff *skb)
+{
+ VIRTIO_VSOCK_SKB_CB(skb)->tap_delivered = true;
+}
+
+static inline void virtio_vsock_skb_clear_tap_delivered(struct sk_buff *skb)
+{
+ VIRTIO_VSOCK_SKB_CB(skb)->tap_delivered = false;
+}
+
+static inline void virtio_vsock_skb_rx_put(struct sk_buff *skb)
+{
+ u32 len;
+
+ len = le32_to_cpu(virtio_vsock_hdr(skb)->len);
+
+ if (len > 0)
+ skb_put(skb, len);
+}
+
+static inline struct sk_buff *virtio_vsock_alloc_skb(unsigned int size, gfp_t mask)
+{
+ struct sk_buff *skb;
+
+ if (size < VIRTIO_VSOCK_SKB_HEADROOM)
+ return NULL;
+
+ skb = alloc_skb(size, mask);
+ if (!skb)
+ return NULL;
+
+ skb_reserve(skb, VIRTIO_VSOCK_SKB_HEADROOM);
+ return skb;
+}
+
+static inline void
+virtio_vsock_skb_queue_head(struct sk_buff_head *list, struct sk_buff *skb)
+{
+ spin_lock_bh(&list->lock);
+ __skb_queue_head(list, skb);
+ spin_unlock_bh(&list->lock);
+}
+
+static inline void
+virtio_vsock_skb_queue_tail(struct sk_buff_head *list, struct sk_buff *skb)
+{
+ spin_lock_bh(&list->lock);
+ __skb_queue_tail(list, skb);
+ spin_unlock_bh(&list->lock);
+}
+
+static inline struct sk_buff *virtio_vsock_skb_dequeue(struct sk_buff_head *list)
+{
+ struct sk_buff *skb;
+
+ spin_lock_bh(&list->lock);
+ skb = __skb_dequeue(list);
+ spin_unlock_bh(&list->lock);
+
+ return skb;
+}
+
+static inline void virtio_vsock_skb_queue_purge(struct sk_buff_head *list)
+{
+ spin_lock_bh(&list->lock);
+ __skb_queue_purge(list);
+ spin_unlock_bh(&list->lock);
+}
+
+static inline size_t virtio_vsock_skb_len(struct sk_buff *skb)
+{
+ return (size_t)(skb_end_pointer(skb) - skb->head);
+}
+
#define VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE (1024 * 4)
#define VIRTIO_VSOCK_MAX_BUF_SIZE 0xFFFFFFFFUL
#define VIRTIO_VSOCK_MAX_PKT_BUF_SIZE (1024 * 64)
@@ -35,23 +138,10 @@ struct virtio_vsock_sock {
u32 last_fwd_cnt;
u32 rx_bytes;
u32 buf_alloc;
- struct list_head rx_queue;
+ struct sk_buff_head rx_queue;
u32 msg_count;
};
-struct virtio_vsock_pkt {
- struct virtio_vsock_hdr hdr;
- struct list_head list;
- /* socket refcnt not held, only use for cancellation */
- struct vsock_sock *vsk;
- void *buf;
- u32 buf_len;
- u32 len;
- u32 off;
- bool reply;
- bool tap_delivered;
-};
-
struct virtio_vsock_pkt_info {
u32 remote_cid, remote_port;
struct vsock_sock *vsk;
@@ -68,7 +158,7 @@ struct virtio_transport {
struct vsock_transport transport;
/* Takes ownership of the packet */
- int (*send_pkt)(struct virtio_vsock_pkt *pkt);
+ int (*send_pkt)(struct sk_buff *skb);
};
ssize_t
@@ -149,11 +239,10 @@ virtio_transport_dgram_enqueue(struct vsock_sock *vsk,
void virtio_transport_destruct(struct vsock_sock *vsk);
void virtio_transport_recv_pkt(struct virtio_transport *t,
- struct virtio_vsock_pkt *pkt);
-void virtio_transport_free_pkt(struct virtio_vsock_pkt *pkt);
-void virtio_transport_inc_tx_pkt(struct virtio_vsock_sock *vvs, struct virtio_vsock_pkt *pkt);
+ struct sk_buff *skb);
+void virtio_transport_inc_tx_pkt(struct virtio_vsock_sock *vvs, struct sk_buff *skb);
u32 virtio_transport_get_credit(struct virtio_vsock_sock *vvs, u32 wanted);
void virtio_transport_put_credit(struct virtio_vsock_sock *vvs, u32 credit);
-void virtio_transport_deliver_tap_pkt(struct virtio_vsock_pkt *pkt);
-
+void virtio_transport_deliver_tap_pkt(struct sk_buff *skb);
+int virtio_transport_purge_skbs(void *vsk, struct sk_buff_head *list);
#endif /* _LINUX_VIRTIO_VSOCK_H */
diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c
index 460e7fbb42da3..16575ea836590 100644
--- a/net/vmw_vsock/virtio_transport.c
+++ b/net/vmw_vsock/virtio_transport.c
@@ -42,8 +42,7 @@ struct virtio_vsock {
bool tx_run;
struct work_struct send_pkt_work;
- spinlock_t send_pkt_list_lock;
- struct list_head send_pkt_list;
+ struct sk_buff_head send_pkt_queue;
atomic_t queued_replies;
@@ -101,41 +100,31 @@ virtio_transport_send_pkt_work(struct work_struct *work)
vq = vsock->vqs[VSOCK_VQ_TX];
for (;;) {
- struct virtio_vsock_pkt *pkt;
struct scatterlist hdr, buf, *sgs[2];
int ret, in_sg = 0, out_sg = 0;
+ struct sk_buff *skb;
bool reply;
- spin_lock_bh(&vsock->send_pkt_list_lock);
- if (list_empty(&vsock->send_pkt_list)) {
- spin_unlock_bh(&vsock->send_pkt_list_lock);
+ skb = virtio_vsock_skb_dequeue(&vsock->send_pkt_queue);
+ if (!skb)
break;
- }
-
- pkt = list_first_entry(&vsock->send_pkt_list,
- struct virtio_vsock_pkt, list);
- list_del_init(&pkt->list);
- spin_unlock_bh(&vsock->send_pkt_list_lock);
- virtio_transport_deliver_tap_pkt(pkt);
+ virtio_transport_deliver_tap_pkt(skb);
+ reply = virtio_vsock_skb_reply(skb);
- reply = pkt->reply;
-
- sg_init_one(&hdr, &pkt->hdr, sizeof(pkt->hdr));
+ sg_init_one(&hdr, virtio_vsock_hdr(skb), sizeof(*virtio_vsock_hdr(skb)));
sgs[out_sg++] = &hdr;
- if (pkt->buf) {
- sg_init_one(&buf, pkt->buf, pkt->len);
+ if (skb->len > 0) {
+ sg_init_one(&buf, skb->data, skb->len);
sgs[out_sg++] = &buf;
}
- ret = virtqueue_add_sgs(vq, sgs, out_sg, in_sg, pkt, GFP_KERNEL);
+ ret = virtqueue_add_sgs(vq, sgs, out_sg, in_sg, skb, GFP_KERNEL);
/* Usually this means that there is no more space available in
* the vq
*/
if (ret < 0) {
- spin_lock_bh(&vsock->send_pkt_list_lock);
- list_add(&pkt->list, &vsock->send_pkt_list);
- spin_unlock_bh(&vsock->send_pkt_list_lock);
+ virtio_vsock_skb_queue_head(&vsock->send_pkt_queue, skb);
break;
}
@@ -164,32 +153,32 @@ virtio_transport_send_pkt_work(struct work_struct *work)
}
static int
-virtio_transport_send_pkt(struct virtio_vsock_pkt *pkt)
+virtio_transport_send_pkt(struct sk_buff *skb)
{
+ struct virtio_vsock_hdr *hdr;
struct virtio_vsock *vsock;
- int len = pkt->len;
+ int len = skb->len;
+
+ hdr = virtio_vsock_hdr(skb);
rcu_read_lock();
vsock = rcu_dereference(the_virtio_vsock);
if (!vsock) {
- virtio_transport_free_pkt(pkt);
+ kfree_skb(skb);
len = -ENODEV;
goto out_rcu;
}
- if (le64_to_cpu(pkt->hdr.dst_cid) == vsock->guest_cid) {
- virtio_transport_free_pkt(pkt);
+ if (le64_to_cpu(hdr->dst_cid) == vsock->guest_cid) {
+ kfree_skb(skb);
len = -ENODEV;
goto out_rcu;
}
- if (pkt->reply)
+ if (virtio_vsock_skb_reply(skb))
atomic_inc(&vsock->queued_replies);
- spin_lock_bh(&vsock->send_pkt_list_lock);
- list_add_tail(&pkt->list, &vsock->send_pkt_list);
- spin_unlock_bh(&vsock->send_pkt_list_lock);
-
+ virtio_vsock_skb_queue_tail(&vsock->send_pkt_queue, skb);
queue_work(virtio_vsock_workqueue, &vsock->send_pkt_work);
out_rcu:
@@ -201,9 +190,7 @@ static int
virtio_transport_cancel_pkt(struct vsock_sock *vsk)
{
struct virtio_vsock *vsock;
- struct virtio_vsock_pkt *pkt, *n;
int cnt = 0, ret;
- LIST_HEAD(freeme);
rcu_read_lock();
vsock = rcu_dereference(the_virtio_vsock);
@@ -212,20 +199,7 @@ virtio_transport_cancel_pkt(struct vsock_sock *vsk)
goto out_rcu;
}
- spin_lock_bh(&vsock->send_pkt_list_lock);
- list_for_each_entry_safe(pkt, n, &vsock->send_pkt_list, list) {
- if (pkt->vsk != vsk)
- continue;
- list_move(&pkt->list, &freeme);
- }
- spin_unlock_bh(&vsock->send_pkt_list_lock);
-
- list_for_each_entry_safe(pkt, n, &freeme, list) {
- if (pkt->reply)
- cnt++;
- list_del(&pkt->list);
- virtio_transport_free_pkt(pkt);
- }
+ cnt = virtio_transport_purge_skbs(vsk, &vsock->send_pkt_queue);
if (cnt) {
struct virtqueue *rx_vq = vsock->vqs[VSOCK_VQ_RX];
@@ -246,38 +220,28 @@ virtio_transport_cancel_pkt(struct vsock_sock *vsk)
static void virtio_vsock_rx_fill(struct virtio_vsock *vsock)
{
- int buf_len = VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE;
- struct virtio_vsock_pkt *pkt;
- struct scatterlist hdr, buf, *sgs[2];
+ int total_len = VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE + VIRTIO_VSOCK_SKB_HEADROOM;
+ struct scatterlist pkt, *p;
struct virtqueue *vq;
+ struct sk_buff *skb;
int ret;
vq = vsock->vqs[VSOCK_VQ_RX];
do {
- pkt = kzalloc(sizeof(*pkt), GFP_KERNEL);
- if (!pkt)
+ skb = virtio_vsock_alloc_skb(total_len, GFP_KERNEL);
+ if (!skb)
break;
- pkt->buf = kmalloc(buf_len, GFP_KERNEL);
- if (!pkt->buf) {
- virtio_transport_free_pkt(pkt);
+ memset(skb->head, 0, VIRTIO_VSOCK_SKB_HEADROOM);
+ sg_init_one(&pkt, virtio_vsock_hdr(skb), total_len);
+ p = &pkt;
+ ret = virtqueue_add_sgs(vq, &p, 0, 1, skb, GFP_KERNEL);
+ if (ret < 0) {
+ kfree_skb(skb);
break;
}
- pkt->buf_len = buf_len;
- pkt->len = buf_len;
-
- sg_init_one(&hdr, &pkt->hdr, sizeof(pkt->hdr));
- sgs[0] = &hdr;
-
- sg_init_one(&buf, pkt->buf, buf_len);
- sgs[1] = &buf;
- ret = virtqueue_add_sgs(vq, sgs, 0, 2, pkt, GFP_KERNEL);
- if (ret) {
- virtio_transport_free_pkt(pkt);
- break;
- }
vsock->rx_buf_nr++;
} while (vq->num_free);
if (vsock->rx_buf_nr > vsock->rx_buf_max_nr)
@@ -299,12 +263,12 @@ static void virtio_transport_tx_work(struct work_struct *work)
goto out;
do {
- struct virtio_vsock_pkt *pkt;
+ struct sk_buff *skb;
unsigned int len;
virtqueue_disable_cb(vq);
- while ((pkt = virtqueue_get_buf(vq, &len)) != NULL) {
- virtio_transport_free_pkt(pkt);
+ while ((skb = virtqueue_get_buf(vq, &len)) != NULL) {
+ consume_skb(skb);
added = true;
}
} while (!virtqueue_enable_cb(vq));
@@ -529,7 +493,7 @@ static void virtio_transport_rx_work(struct work_struct *work)
do {
virtqueue_disable_cb(vq);
for (;;) {
- struct virtio_vsock_pkt *pkt;
+ struct sk_buff *skb;
unsigned int len;
if (!virtio_transport_more_replies(vsock)) {
@@ -540,23 +504,22 @@ static void virtio_transport_rx_work(struct work_struct *work)
goto out;
}
- pkt = virtqueue_get_buf(vq, &len);
- if (!pkt) {
+ skb = virtqueue_get_buf(vq, &len);
+ if (!skb)
break;
- }
vsock->rx_buf_nr--;
/* Drop short/long packets */
- if (unlikely(len < sizeof(pkt->hdr) ||
- len > sizeof(pkt->hdr) + pkt->len)) {
- virtio_transport_free_pkt(pkt);
+ if (unlikely(len < sizeof(struct virtio_vsock_hdr) ||
+ len > virtio_vsock_skb_len(skb))) {
+ kfree_skb(skb);
continue;
}
- pkt->len = len - sizeof(pkt->hdr);
- virtio_transport_deliver_tap_pkt(pkt);
- virtio_transport_recv_pkt(&virtio_transport, pkt);
+ virtio_vsock_skb_rx_put(skb);
+ virtio_transport_deliver_tap_pkt(skb);
+ virtio_transport_recv_pkt(&virtio_transport, skb);
}
} while (!virtqueue_enable_cb(vq));
@@ -624,7 +587,7 @@ static void virtio_vsock_vqs_start(struct virtio_vsock *vsock)
static void virtio_vsock_vqs_del(struct virtio_vsock *vsock)
{
struct virtio_device *vdev = vsock->vdev;
- struct virtio_vsock_pkt *pkt;
+ struct sk_buff *skb;
/* Reset all connected sockets when the VQs disappear */
vsock_for_each_connected_socket(&virtio_transport.transport,
@@ -651,23 +614,16 @@ static void virtio_vsock_vqs_del(struct virtio_vsock *vsock)
virtio_reset_device(vdev);
mutex_lock(&vsock->rx_lock);
- while ((pkt = virtqueue_detach_unused_buf(vsock->vqs[VSOCK_VQ_RX])))
- virtio_transport_free_pkt(pkt);
+ while ((skb = virtqueue_detach_unused_buf(vsock->vqs[VSOCK_VQ_RX])))
+ kfree_skb(skb);
mutex_unlock(&vsock->rx_lock);
mutex_lock(&vsock->tx_lock);
- while ((pkt = virtqueue_detach_unused_buf(vsock->vqs[VSOCK_VQ_TX])))
- virtio_transport_free_pkt(pkt);
+ while ((skb = virtqueue_detach_unused_buf(vsock->vqs[VSOCK_VQ_TX])))
+ kfree_skb(skb);
mutex_unlock(&vsock->tx_lock);
- spin_lock_bh(&vsock->send_pkt_list_lock);
- while (!list_empty(&vsock->send_pkt_list)) {
- pkt = list_first_entry(&vsock->send_pkt_list,
- struct virtio_vsock_pkt, list);
- list_del(&pkt->list);
- virtio_transport_free_pkt(pkt);
- }
- spin_unlock_bh(&vsock->send_pkt_list_lock);
+ virtio_vsock_skb_queue_purge(&vsock->send_pkt_queue);
/* Delete virtqueues and flush outstanding callbacks if any */
vdev->config->del_vqs(vdev);
@@ -704,8 +660,7 @@ static int virtio_vsock_probe(struct virtio_device *vdev)
mutex_init(&vsock->tx_lock);
mutex_init(&vsock->rx_lock);
mutex_init(&vsock->event_lock);
- spin_lock_init(&vsock->send_pkt_list_lock);
- INIT_LIST_HEAD(&vsock->send_pkt_list);
+ skb_queue_head_init(&vsock->send_pkt_queue);
INIT_WORK(&vsock->rx_work, virtio_transport_rx_work);
INIT_WORK(&vsock->tx_work, virtio_transport_tx_work);
INIT_WORK(&vsock->event_work, virtio_transport_event_work);
diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c
index a9980e9b93040..a1581c77cf84a 100644
--- a/net/vmw_vsock/virtio_transport_common.c
+++ b/net/vmw_vsock/virtio_transport_common.c
@@ -37,53 +37,56 @@ virtio_transport_get_ops(struct vsock_sock *vsk)
return container_of(t, struct virtio_transport, transport);
}
-static struct virtio_vsock_pkt *
-virtio_transport_alloc_pkt(struct virtio_vsock_pkt_info *info,
+/* Returns a new packet on success, otherwise returns NULL.
+ *
+ * If NULL is returned, errp is set to a negative errno.
+ */
+static struct sk_buff *
+virtio_transport_alloc_skb(struct virtio_vsock_pkt_info *info,
size_t len,
u32 src_cid,
u32 src_port,
u32 dst_cid,
u32 dst_port)
{
- struct virtio_vsock_pkt *pkt;
+ const size_t skb_len = VIRTIO_VSOCK_SKB_HEADROOM + len;
+ struct virtio_vsock_hdr *hdr;
+ struct sk_buff *skb;
+ void *payload;
int err;
- pkt = kzalloc(sizeof(*pkt), GFP_KERNEL);
- if (!pkt)
+ skb = virtio_vsock_alloc_skb(skb_len, GFP_KERNEL);
+ if (!skb)
return NULL;
- pkt->hdr.type = cpu_to_le16(info->type);
- pkt->hdr.op = cpu_to_le16(info->op);
- pkt->hdr.src_cid = cpu_to_le64(src_cid);
- pkt->hdr.dst_cid = cpu_to_le64(dst_cid);
- pkt->hdr.src_port = cpu_to_le32(src_port);
- pkt->hdr.dst_port = cpu_to_le32(dst_port);
- pkt->hdr.flags = cpu_to_le32(info->flags);
- pkt->len = len;
- pkt->hdr.len = cpu_to_le32(len);
- pkt->reply = info->reply;
- pkt->vsk = info->vsk;
+ hdr = virtio_vsock_hdr(skb);
+ hdr->type = cpu_to_le16(info->type);
+ hdr->op = cpu_to_le16(info->op);
+ hdr->src_cid = cpu_to_le64(src_cid);
+ hdr->dst_cid = cpu_to_le64(dst_cid);
+ hdr->src_port = cpu_to_le32(src_port);
+ hdr->dst_port = cpu_to_le32(dst_port);
+ hdr->flags = cpu_to_le32(info->flags);
+ hdr->len = cpu_to_le32(len);
if (info->msg && len > 0) {
- pkt->buf = kmalloc(len, GFP_KERNEL);
- if (!pkt->buf)
- goto out_pkt;
-
- pkt->buf_len = len;
-
- err = memcpy_from_msg(pkt->buf, info->msg, len);
+ payload = skb_put(skb, len);
+ err = memcpy_from_msg(payload, info->msg, len);
if (err)
goto out;
if (msg_data_left(info->msg) == 0 &&
info->type == VIRTIO_VSOCK_TYPE_SEQPACKET) {
- pkt->hdr.flags |= cpu_to_le32(VIRTIO_VSOCK_SEQ_EOM);
+ hdr->flags |= cpu_to_le32(VIRTIO_VSOCK_SEQ_EOM);
if (info->msg->msg_flags & MSG_EOR)
- pkt->hdr.flags |= cpu_to_le32(VIRTIO_VSOCK_SEQ_EOR);
+ hdr->flags |= cpu_to_le32(VIRTIO_VSOCK_SEQ_EOR);
}
}
+ if (info->reply)
+ virtio_vsock_skb_set_reply(skb);
+
trace_virtio_transport_alloc_pkt(src_cid, src_port,
dst_cid, dst_port,
len,
@@ -91,19 +94,18 @@ virtio_transport_alloc_pkt(struct virtio_vsock_pkt_info *info,
info->op,
info->flags);
- return pkt;
+ return skb;
out:
- kfree(pkt->buf);
-out_pkt:
- kfree(pkt);
+ kfree_skb(skb);
return NULL;
}
/* Packet capture */
static struct sk_buff *virtio_transport_build_skb(void *opaque)
{
- struct virtio_vsock_pkt *pkt = opaque;
+ struct virtio_vsock_hdr *pkt_hdr;
+ struct sk_buff *pkt = opaque;
struct af_vsockmon_hdr *hdr;
struct sk_buff *skb;
size_t payload_len;
@@ -113,10 +115,11 @@ static struct sk_buff *virtio_transport_build_skb(void *opaque)
* the payload length from the header and the buffer pointer taking
* care of the offset in the original packet.
*/
- payload_len = le32_to_cpu(pkt->hdr.len);
- payload_buf = pkt->buf + pkt->off;
+ pkt_hdr = virtio_vsock_hdr(pkt);
+ payload_len = pkt->len;
+ payload_buf = pkt->data;
- skb = alloc_skb(sizeof(*hdr) + sizeof(pkt->hdr) + payload_len,
+ skb = alloc_skb(sizeof(*hdr) + sizeof(*pkt_hdr) + payload_len,
GFP_ATOMIC);
if (!skb)
return NULL;
@@ -124,16 +127,16 @@ static struct sk_buff *virtio_transport_build_skb(void *opaque)
hdr = skb_put(skb, sizeof(*hdr));
/* pkt->hdr is little-endian so no need to byteswap here */
- hdr->src_cid = pkt->hdr.src_cid;
- hdr->src_port = pkt->hdr.src_port;
- hdr->dst_cid = pkt->hdr.dst_cid;
- hdr->dst_port = pkt->hdr.dst_port;
+ hdr->src_cid = pkt_hdr->src_cid;
+ hdr->src_port = pkt_hdr->src_port;
+ hdr->dst_cid = pkt_hdr->dst_cid;
+ hdr->dst_port = pkt_hdr->dst_port;
hdr->transport = cpu_to_le16(AF_VSOCK_TRANSPORT_VIRTIO);
- hdr->len = cpu_to_le16(sizeof(pkt->hdr));
+ hdr->len = cpu_to_le16(sizeof(*pkt_hdr));
memset(hdr->reserved, 0, sizeof(hdr->reserved));
- switch (le16_to_cpu(pkt->hdr.op)) {
+ switch (le16_to_cpu(pkt_hdr->op)) {
case VIRTIO_VSOCK_OP_REQUEST:
case VIRTIO_VSOCK_OP_RESPONSE:
hdr->op = cpu_to_le16(AF_VSOCK_OP_CONNECT);
@@ -154,7 +157,7 @@ static struct sk_buff *virtio_transport_build_skb(void *opaque)
break;
}
- skb_put_data(skb, &pkt->hdr, sizeof(pkt->hdr));
+ skb_put_data(skb, pkt_hdr, sizeof(*pkt_hdr));
if (payload_len) {
skb_put_data(skb, payload_buf, payload_len);
@@ -163,13 +166,13 @@ static struct sk_buff *virtio_transport_build_skb(void *opaque)
return skb;
}
-void virtio_transport_deliver_tap_pkt(struct virtio_vsock_pkt *pkt)
+void virtio_transport_deliver_tap_pkt(struct sk_buff *skb)
{
- if (pkt->tap_delivered)
+ if (virtio_vsock_skb_tap_delivered(skb))
return;
- vsock_deliver_tap(virtio_transport_build_skb, pkt);
- pkt->tap_delivered = true;
+ vsock_deliver_tap(virtio_transport_build_skb, skb);
+ virtio_vsock_skb_set_tap_delivered(skb);
}
EXPORT_SYMBOL_GPL(virtio_transport_deliver_tap_pkt);
@@ -192,8 +195,8 @@ static int virtio_transport_send_pkt_info(struct vsock_sock *vsk,
u32 src_cid, src_port, dst_cid, dst_port;
const struct virtio_transport *t_ops;
struct virtio_vsock_sock *vvs;
- struct virtio_vsock_pkt *pkt;
u32 pkt_len = info->pkt_len;
+ struct sk_buff *skb;
info->type = virtio_transport_get_type(sk_vsock(vsk));
@@ -224,42 +227,47 @@ static int virtio_transport_send_pkt_info(struct vsock_sock *vsk,
if (pkt_len == 0 && info->op == VIRTIO_VSOCK_OP_RW)
return pkt_len;
- pkt = virtio_transport_alloc_pkt(info, pkt_len,
+ skb = virtio_transport_alloc_skb(info, pkt_len,
src_cid, src_port,
dst_cid, dst_port);
- if (!pkt) {
+ if (!skb) {
virtio_transport_put_credit(vvs, pkt_len);
return -ENOMEM;
}
- virtio_transport_inc_tx_pkt(vvs, pkt);
+ virtio_transport_inc_tx_pkt(vvs, skb);
- return t_ops->send_pkt(pkt);
+ return t_ops->send_pkt(skb);
}
static bool virtio_transport_inc_rx_pkt(struct virtio_vsock_sock *vvs,
- struct virtio_vsock_pkt *pkt)
+ struct sk_buff *skb)
{
- if (vvs->rx_bytes + pkt->len > vvs->buf_alloc)
+ if (vvs->rx_bytes + skb->len > vvs->buf_alloc)
return false;
- vvs->rx_bytes += pkt->len;
+ vvs->rx_bytes += skb->len;
return true;
}
static void virtio_transport_dec_rx_pkt(struct virtio_vsock_sock *vvs,
- struct virtio_vsock_pkt *pkt)
+ struct sk_buff *skb)
{
- vvs->rx_bytes -= pkt->len;
- vvs->fwd_cnt += pkt->len;
+ int len;
+
+ len = skb_headroom(skb) - sizeof(struct virtio_vsock_hdr) - skb->len;
+ vvs->rx_bytes -= len;
+ vvs->fwd_cnt += len;
}
-void virtio_transport_inc_tx_pkt(struct virtio_vsock_sock *vvs, struct virtio_vsock_pkt *pkt)
+void virtio_transport_inc_tx_pkt(struct virtio_vsock_sock *vvs, struct sk_buff *skb)
{
+ struct virtio_vsock_hdr *hdr = virtio_vsock_hdr(skb);
+
spin_lock_bh(&vvs->rx_lock);
vvs->last_fwd_cnt = vvs->fwd_cnt;
- pkt->hdr.fwd_cnt = cpu_to_le32(vvs->fwd_cnt);
- pkt->hdr.buf_alloc = cpu_to_le32(vvs->buf_alloc);
+ hdr->fwd_cnt = cpu_to_le32(vvs->fwd_cnt);
+ hdr->buf_alloc = cpu_to_le32(vvs->buf_alloc);
spin_unlock_bh(&vvs->rx_lock);
}
EXPORT_SYMBOL_GPL(virtio_transport_inc_tx_pkt);
@@ -303,29 +311,29 @@ virtio_transport_stream_do_peek(struct vsock_sock *vsk,
size_t len)
{
struct virtio_vsock_sock *vvs = vsk->trans;
- struct virtio_vsock_pkt *pkt;
size_t bytes, total = 0, off;
+ struct sk_buff *skb, *tmp;
int err = -EFAULT;
spin_lock_bh(&vvs->rx_lock);
- list_for_each_entry(pkt, &vvs->rx_queue, list) {
- off = pkt->off;
+ skb_queue_walk_safe(&vvs->rx_queue, skb, tmp) {
+ off = 0;
if (total == len)
break;
- while (total < len && off < pkt->len) {
+ while (total < len && off < skb->len) {
bytes = len - total;
- if (bytes > pkt->len - off)
- bytes = pkt->len - off;
+ if (bytes > skb->len - off)
+ bytes = skb->len - off;
/* sk_lock is held by caller so no one else can dequeue.
* Unlock rx_lock since memcpy_to_msg() may sleep.
*/
spin_unlock_bh(&vvs->rx_lock);
- err = memcpy_to_msg(msg, pkt->buf + off, bytes);
+ err = memcpy_to_msg(msg, skb->data + off, bytes);
if (err)
goto out;
@@ -352,37 +360,38 @@ virtio_transport_stream_do_dequeue(struct vsock_sock *vsk,
size_t len)
{
struct virtio_vsock_sock *vvs = vsk->trans;
- struct virtio_vsock_pkt *pkt;
size_t bytes, total = 0;
- u32 free_space;
+ struct sk_buff *skb;
int err = -EFAULT;
+ u32 free_space;
spin_lock_bh(&vvs->rx_lock);
- while (total < len && !list_empty(&vvs->rx_queue)) {
- pkt = list_first_entry(&vvs->rx_queue,
- struct virtio_vsock_pkt, list);
+ while (total < len && !skb_queue_empty(&vvs->rx_queue)) {
+ skb = __skb_dequeue(&vvs->rx_queue);
bytes = len - total;
- if (bytes > pkt->len - pkt->off)
- bytes = pkt->len - pkt->off;
+ if (bytes > skb->len)
+ bytes = skb->len;
/* sk_lock is held by caller so no one else can dequeue.
* Unlock rx_lock since memcpy_to_msg() may sleep.
*/
spin_unlock_bh(&vvs->rx_lock);
- err = memcpy_to_msg(msg, pkt->buf + pkt->off, bytes);
+ err = memcpy_to_msg(msg, skb->data, bytes);
if (err)
goto out;
spin_lock_bh(&vvs->rx_lock);
total += bytes;
- pkt->off += bytes;
- if (pkt->off == pkt->len) {
- virtio_transport_dec_rx_pkt(vvs, pkt);
- list_del(&pkt->list);
- virtio_transport_free_pkt(pkt);
+ skb_pull(skb, bytes);
+
+ if (skb->len == 0) {
+ virtio_transport_dec_rx_pkt(vvs, skb);
+ consume_skb(skb);
+ } else {
+ __skb_queue_head(&vvs->rx_queue, skb);
}
}
@@ -414,10 +423,10 @@ static int virtio_transport_seqpacket_do_dequeue(struct vsock_sock *vsk,
int flags)
{
struct virtio_vsock_sock *vvs = vsk->trans;
- struct virtio_vsock_pkt *pkt;
int dequeued_len = 0;
size_t user_buf_len = msg_data_left(msg);
bool msg_ready = false;
+ struct sk_buff *skb;
spin_lock_bh(&vvs->rx_lock);
@@ -427,13 +436,18 @@ static int virtio_transport_seqpacket_do_dequeue(struct vsock_sock *vsk,
}
while (!msg_ready) {
- pkt = list_first_entry(&vvs->rx_queue, struct virtio_vsock_pkt, list);
+ struct virtio_vsock_hdr *hdr;
+
+ skb = __skb_dequeue(&vvs->rx_queue);
+ if (!skb)
+ break;
+ hdr = virtio_vsock_hdr(skb);
if (dequeued_len >= 0) {
size_t pkt_len;
size_t bytes_to_copy;
- pkt_len = (size_t)le32_to_cpu(pkt->hdr.len);
+ pkt_len = (size_t)le32_to_cpu(hdr->len);
bytes_to_copy = min(user_buf_len, pkt_len);
if (bytes_to_copy) {
@@ -444,7 +458,7 @@ static int virtio_transport_seqpacket_do_dequeue(struct vsock_sock *vsk,
*/
spin_unlock_bh(&vvs->rx_lock);
- err = memcpy_to_msg(msg, pkt->buf, bytes_to_copy);
+ err = memcpy_to_msg(msg, skb->data, bytes_to_copy);
if (err) {
/* Copy of message failed. Rest of
* fragments will be freed without copy.
@@ -452,6 +466,7 @@ static int virtio_transport_seqpacket_do_dequeue(struct vsock_sock *vsk,
dequeued_len = err;
} else {
user_buf_len -= bytes_to_copy;
+ skb_pull(skb, bytes_to_copy);
}
spin_lock_bh(&vvs->rx_lock);
@@ -461,17 +476,16 @@ static int virtio_transport_seqpacket_do_dequeue(struct vsock_sock *vsk,
dequeued_len += pkt_len;
}
- if (le32_to_cpu(pkt->hdr.flags) & VIRTIO_VSOCK_SEQ_EOM) {
+ if (le32_to_cpu(hdr->flags) & VIRTIO_VSOCK_SEQ_EOM) {
msg_ready = true;
vvs->msg_count--;
- if (le32_to_cpu(pkt->hdr.flags) & VIRTIO_VSOCK_SEQ_EOR)
+ if (le32_to_cpu(hdr->flags) & VIRTIO_VSOCK_SEQ_EOR)
msg->msg_flags |= MSG_EOR;
}
- virtio_transport_dec_rx_pkt(vvs, pkt);
- list_del(&pkt->list);
- virtio_transport_free_pkt(pkt);
+ virtio_transport_dec_rx_pkt(vvs, skb);
+ kfree_skb(skb);
}
spin_unlock_bh(&vvs->rx_lock);
@@ -609,7 +623,7 @@ int virtio_transport_do_socket_init(struct vsock_sock *vsk,
spin_lock_init(&vvs->rx_lock);
spin_lock_init(&vvs->tx_lock);
- INIT_LIST_HEAD(&vvs->rx_queue);
+ skb_queue_head_init(&vvs->rx_queue);
return 0;
}
@@ -806,16 +820,16 @@ void virtio_transport_destruct(struct vsock_sock *vsk)
EXPORT_SYMBOL_GPL(virtio_transport_destruct);
static int virtio_transport_reset(struct vsock_sock *vsk,
- struct virtio_vsock_pkt *pkt)
+ struct sk_buff *skb)
{
struct virtio_vsock_pkt_info info = {
.op = VIRTIO_VSOCK_OP_RST,
- .reply = !!pkt,
+ .reply = !!skb,
.vsk = vsk,
};
/* Send RST only if the original pkt is not a RST pkt */
- if (pkt && le16_to_cpu(pkt->hdr.op) == VIRTIO_VSOCK_OP_RST)
+ if (skb && le16_to_cpu(virtio_vsock_hdr(skb)->op) == VIRTIO_VSOCK_OP_RST)
return 0;
return virtio_transport_send_pkt_info(vsk, &info);
@@ -825,29 +839,30 @@ static int virtio_transport_reset(struct vsock_sock *vsk,
* attempt was made to connect to a socket that does not exist.
*/
static int virtio_transport_reset_no_sock(const struct virtio_transport *t,
- struct virtio_vsock_pkt *pkt)
+ struct sk_buff *skb)
{
- struct virtio_vsock_pkt *reply;
+ struct virtio_vsock_hdr *hdr = virtio_vsock_hdr(skb);
struct virtio_vsock_pkt_info info = {
.op = VIRTIO_VSOCK_OP_RST,
- .type = le16_to_cpu(pkt->hdr.type),
+ .type = le16_to_cpu(hdr->type),
.reply = true,
};
+ struct sk_buff *reply;
/* Send RST only if the original pkt is not a RST pkt */
- if (le16_to_cpu(pkt->hdr.op) == VIRTIO_VSOCK_OP_RST)
+ if (le16_to_cpu(hdr->op) == VIRTIO_VSOCK_OP_RST)
return 0;
- reply = virtio_transport_alloc_pkt(&info, 0,
- le64_to_cpu(pkt->hdr.dst_cid),
- le32_to_cpu(pkt->hdr.dst_port),
- le64_to_cpu(pkt->hdr.src_cid),
- le32_to_cpu(pkt->hdr.src_port));
+ reply = virtio_transport_alloc_skb(&info, 0,
+ le64_to_cpu(hdr->dst_cid),
+ le32_to_cpu(hdr->dst_port),
+ le64_to_cpu(hdr->src_cid),
+ le32_to_cpu(hdr->src_port));
if (!reply)
return -ENOMEM;
if (!t) {
- virtio_transport_free_pkt(reply);
+ kfree_skb(reply);
return -ENOTCONN;
}
@@ -858,16 +873,11 @@ static int virtio_transport_reset_no_sock(const struct virtio_transport *t,
static void virtio_transport_remove_sock(struct vsock_sock *vsk)
{
struct virtio_vsock_sock *vvs = vsk->trans;
- struct virtio_vsock_pkt *pkt, *tmp;
/* We don't need to take rx_lock, as the socket is closing and we are
* removing it.
*/
- list_for_each_entry_safe(pkt, tmp, &vvs->rx_queue, list) {
- list_del(&pkt->list);
- virtio_transport_free_pkt(pkt);
- }
-
+ __skb_queue_purge(&vvs->rx_queue);
vsock_remove_sock(vsk);
}
@@ -981,13 +991,14 @@ EXPORT_SYMBOL_GPL(virtio_transport_release);
static int
virtio_transport_recv_connecting(struct sock *sk,
- struct virtio_vsock_pkt *pkt)
+ struct sk_buff *skb)
{
+ struct virtio_vsock_hdr *hdr = virtio_vsock_hdr(skb);
struct vsock_sock *vsk = vsock_sk(sk);
- int err;
int skerr;
+ int err;
- switch (le16_to_cpu(pkt->hdr.op)) {
+ switch (le16_to_cpu(hdr->op)) {
case VIRTIO_VSOCK_OP_RESPONSE:
sk->sk_state = TCP_ESTABLISHED;
sk->sk_socket->state = SS_CONNECTED;
@@ -1008,7 +1019,7 @@ virtio_transport_recv_connecting(struct sock *sk,
return 0;
destroy:
- virtio_transport_reset(vsk, pkt);
+ virtio_transport_reset(vsk, skb);
sk->sk_state = TCP_CLOSE;
sk->sk_err = skerr;
sk_error_report(sk);
@@ -1017,34 +1028,37 @@ virtio_transport_recv_connecting(struct sock *sk,
static void
virtio_transport_recv_enqueue(struct vsock_sock *vsk,
- struct virtio_vsock_pkt *pkt)
+ struct sk_buff *skb)
{
struct virtio_vsock_sock *vvs = vsk->trans;
bool can_enqueue, free_pkt = false;
+ struct virtio_vsock_hdr *hdr;
+ u32 len;
- pkt->len = le32_to_cpu(pkt->hdr.len);
- pkt->off = 0;
+ hdr = virtio_vsock_hdr(skb);
+ len = le32_to_cpu(hdr->len);
spin_lock_bh(&vvs->rx_lock);
- can_enqueue = virtio_transport_inc_rx_pkt(vvs, pkt);
+ can_enqueue = virtio_transport_inc_rx_pkt(vvs, skb);
if (!can_enqueue) {
free_pkt = true;
goto out;
}
- if (le32_to_cpu(pkt->hdr.flags) & VIRTIO_VSOCK_SEQ_EOM)
+ if (le32_to_cpu(hdr->flags) & VIRTIO_VSOCK_SEQ_EOM)
vvs->msg_count++;
/* Try to copy small packets into the buffer of last packet queued,
* to avoid wasting memory queueing the entire buffer with a small
* payload.
*/
- if (pkt->len <= GOOD_COPY_LEN && !list_empty(&vvs->rx_queue)) {
- struct virtio_vsock_pkt *last_pkt;
+ if (len <= GOOD_COPY_LEN && !skb_queue_empty(&vvs->rx_queue)) {
+ struct virtio_vsock_hdr *last_hdr;
+ struct sk_buff *last_skb;
- last_pkt = list_last_entry(&vvs->rx_queue,
- struct virtio_vsock_pkt, list);
+ last_skb = skb_peek_tail(&vvs->rx_queue);
+ last_hdr = virtio_vsock_hdr(last_skb);
/* If there is space in the last packet queued, we copy the
* new packet in its buffer. We avoid this if the last packet
@@ -1052,35 +1066,35 @@ virtio_transport_recv_enqueue(struct vsock_sock *vsk,
* delimiter of SEQPACKET message, so 'pkt' is the first packet
* of a new message.
*/
- if ((pkt->len <= last_pkt->buf_len - last_pkt->len) &&
- !(le32_to_cpu(last_pkt->hdr.flags) & VIRTIO_VSOCK_SEQ_EOM)) {
- memcpy(last_pkt->buf + last_pkt->len, pkt->buf,
- pkt->len);
- last_pkt->len += pkt->len;
+ if (skb->len < skb_tailroom(last_skb) &&
+ !(le32_to_cpu(last_hdr->flags) & VIRTIO_VSOCK_SEQ_EOM)) {
+ memcpy(skb_put(last_skb, skb->len), skb->data, skb->len);
free_pkt = true;
- last_pkt->hdr.flags |= pkt->hdr.flags;
+ last_hdr->flags |= hdr->flags;
+ last_hdr->len = cpu_to_le32(last_skb->len);
goto out;
}
}
- list_add_tail(&pkt->list, &vvs->rx_queue);
+ __skb_queue_tail(&vvs->rx_queue, skb);
out:
spin_unlock_bh(&vvs->rx_lock);
if (free_pkt)
- virtio_transport_free_pkt(pkt);
+ kfree_skb(skb);
}
static int
virtio_transport_recv_connected(struct sock *sk,
- struct virtio_vsock_pkt *pkt)
+ struct sk_buff *skb)
{
+ struct virtio_vsock_hdr *hdr = virtio_vsock_hdr(skb);
struct vsock_sock *vsk = vsock_sk(sk);
int err = 0;
- switch (le16_to_cpu(pkt->hdr.op)) {
+ switch (le16_to_cpu(hdr->op)) {
case VIRTIO_VSOCK_OP_RW:
- virtio_transport_recv_enqueue(vsk, pkt);
+ virtio_transport_recv_enqueue(vsk, skb);
vsock_data_ready(sk);
return err;
case VIRTIO_VSOCK_OP_CREDIT_REQUEST:
@@ -1090,18 +1104,17 @@ virtio_transport_recv_connected(struct sock *sk,
sk->sk_write_space(sk);
break;
case VIRTIO_VSOCK_OP_SHUTDOWN:
- if (le32_to_cpu(pkt->hdr.flags) & VIRTIO_VSOCK_SHUTDOWN_RCV)
+ if (le32_to_cpu(hdr->flags) & VIRTIO_VSOCK_SHUTDOWN_RCV)
vsk->peer_shutdown |= RCV_SHUTDOWN;
- if (le32_to_cpu(pkt->hdr.flags) & VIRTIO_VSOCK_SHUTDOWN_SEND)
+ if (le32_to_cpu(hdr->flags) & VIRTIO_VSOCK_SHUTDOWN_SEND)
vsk->peer_shutdown |= SEND_SHUTDOWN;
if (vsk->peer_shutdown == SHUTDOWN_MASK &&
vsock_stream_has_data(vsk) <= 0 &&
!sock_flag(sk, SOCK_DONE)) {
(void)virtio_transport_reset(vsk, NULL);
-
virtio_transport_do_close(vsk, true);
}
- if (le32_to_cpu(pkt->hdr.flags))
+ if (le32_to_cpu(virtio_vsock_hdr(skb)->flags))
sk->sk_state_change(sk);
break;
case VIRTIO_VSOCK_OP_RST:
@@ -1112,28 +1125,30 @@ virtio_transport_recv_connected(struct sock *sk,
break;
}
- virtio_transport_free_pkt(pkt);
+ kfree_skb(skb);
return err;
}
static void
virtio_transport_recv_disconnecting(struct sock *sk,
- struct virtio_vsock_pkt *pkt)
+ struct sk_buff *skb)
{
+ struct virtio_vsock_hdr *hdr = virtio_vsock_hdr(skb);
struct vsock_sock *vsk = vsock_sk(sk);
- if (le16_to_cpu(pkt->hdr.op) == VIRTIO_VSOCK_OP_RST)
+ if (le16_to_cpu(hdr->op) == VIRTIO_VSOCK_OP_RST)
virtio_transport_do_close(vsk, true);
}
static int
virtio_transport_send_response(struct vsock_sock *vsk,
- struct virtio_vsock_pkt *pkt)
+ struct sk_buff *skb)
{
+ struct virtio_vsock_hdr *hdr = virtio_vsock_hdr(skb);
struct virtio_vsock_pkt_info info = {
.op = VIRTIO_VSOCK_OP_RESPONSE,
- .remote_cid = le64_to_cpu(pkt->hdr.src_cid),
- .remote_port = le32_to_cpu(pkt->hdr.src_port),
+ .remote_cid = le64_to_cpu(hdr->src_cid),
+ .remote_port = le32_to_cpu(hdr->src_port),
.reply = true,
.vsk = vsk,
};
@@ -1142,8 +1157,9 @@ virtio_transport_send_response(struct vsock_sock *vsk,
}
static bool virtio_transport_space_update(struct sock *sk,
- struct virtio_vsock_pkt *pkt)
+ struct sk_buff *skb)
{
+ struct virtio_vsock_hdr *hdr = virtio_vsock_hdr(skb);
struct vsock_sock *vsk = vsock_sk(sk);
struct virtio_vsock_sock *vvs = vsk->trans;
bool space_available;
@@ -1158,8 +1174,8 @@ static bool virtio_transport_space_update(struct sock *sk,
/* buf_alloc and fwd_cnt is always included in the hdr */
spin_lock_bh(&vvs->tx_lock);
- vvs->peer_buf_alloc = le32_to_cpu(pkt->hdr.buf_alloc);
- vvs->peer_fwd_cnt = le32_to_cpu(pkt->hdr.fwd_cnt);
+ vvs->peer_buf_alloc = le32_to_cpu(hdr->buf_alloc);
+ vvs->peer_fwd_cnt = le32_to_cpu(hdr->fwd_cnt);
space_available = virtio_transport_has_space(vsk);
spin_unlock_bh(&vvs->tx_lock);
return space_available;
@@ -1167,27 +1183,28 @@ static bool virtio_transport_space_update(struct sock *sk,
/* Handle server socket */
static int
-virtio_transport_recv_listen(struct sock *sk, struct virtio_vsock_pkt *pkt,
+virtio_transport_recv_listen(struct sock *sk, struct sk_buff *skb,
struct virtio_transport *t)
{
+ struct virtio_vsock_hdr *hdr = virtio_vsock_hdr(skb);
struct vsock_sock *vsk = vsock_sk(sk);
struct vsock_sock *vchild;
struct sock *child;
int ret;
- if (le16_to_cpu(pkt->hdr.op) != VIRTIO_VSOCK_OP_REQUEST) {
- virtio_transport_reset_no_sock(t, pkt);
+ if (le16_to_cpu(hdr->op) != VIRTIO_VSOCK_OP_REQUEST) {
+ virtio_transport_reset_no_sock(t, skb);
return -EINVAL;
}
if (sk_acceptq_is_full(sk)) {
- virtio_transport_reset_no_sock(t, pkt);
+ virtio_transport_reset_no_sock(t, skb);
return -ENOMEM;
}
child = vsock_create_connected(sk);
if (!child) {
- virtio_transport_reset_no_sock(t, pkt);
+ virtio_transport_reset_no_sock(t, skb);
return -ENOMEM;
}
@@ -1198,10 +1215,10 @@ virtio_transport_recv_listen(struct sock *sk, struct virtio_vsock_pkt *pkt,
child->sk_state = TCP_ESTABLISHED;
vchild = vsock_sk(child);
- vsock_addr_init(&vchild->local_addr, le64_to_cpu(pkt->hdr.dst_cid),
- le32_to_cpu(pkt->hdr.dst_port));
- vsock_addr_init(&vchild->remote_addr, le64_to_cpu(pkt->hdr.src_cid),
- le32_to_cpu(pkt->hdr.src_port));
+ vsock_addr_init(&vchild->local_addr, le64_to_cpu(hdr->dst_cid),
+ le32_to_cpu(hdr->dst_port));
+ vsock_addr_init(&vchild->remote_addr, le64_to_cpu(hdr->src_cid),
+ le32_to_cpu(hdr->src_port));
ret = vsock_assign_transport(vchild, vsk);
/* Transport assigned (looking at remote_addr) must be the same
@@ -1209,17 +1226,17 @@ virtio_transport_recv_listen(struct sock *sk, struct virtio_vsock_pkt *pkt,
*/
if (ret || vchild->transport != &t->transport) {
release_sock(child);
- virtio_transport_reset_no_sock(t, pkt);
+ virtio_transport_reset_no_sock(t, skb);
sock_put(child);
return ret;
}
- if (virtio_transport_space_update(child, pkt))
+ if (virtio_transport_space_update(child, skb))
child->sk_write_space(child);
vsock_insert_connected(vchild);
vsock_enqueue_accept(sk, child);
- virtio_transport_send_response(vchild, pkt);
+ virtio_transport_send_response(vchild, skb);
release_sock(child);
@@ -1237,29 +1254,30 @@ static bool virtio_transport_valid_type(u16 type)
* lock.
*/
void virtio_transport_recv_pkt(struct virtio_transport *t,
- struct virtio_vsock_pkt *pkt)
+ struct sk_buff *skb)
{
+ struct virtio_vsock_hdr *hdr = virtio_vsock_hdr(skb);
struct sockaddr_vm src, dst;
struct vsock_sock *vsk;
struct sock *sk;
bool space_available;
- vsock_addr_init(&src, le64_to_cpu(pkt->hdr.src_cid),
- le32_to_cpu(pkt->hdr.src_port));
- vsock_addr_init(&dst, le64_to_cpu(pkt->hdr.dst_cid),
- le32_to_cpu(pkt->hdr.dst_port));
+ vsock_addr_init(&src, le64_to_cpu(hdr->src_cid),
+ le32_to_cpu(hdr->src_port));
+ vsock_addr_init(&dst, le64_to_cpu(hdr->dst_cid),
+ le32_to_cpu(hdr->dst_port));
trace_virtio_transport_recv_pkt(src.svm_cid, src.svm_port,
dst.svm_cid, dst.svm_port,
- le32_to_cpu(pkt->hdr.len),
- le16_to_cpu(pkt->hdr.type),
- le16_to_cpu(pkt->hdr.op),
- le32_to_cpu(pkt->hdr.flags),
- le32_to_cpu(pkt->hdr.buf_alloc),
- le32_to_cpu(pkt->hdr.fwd_cnt));
-
- if (!virtio_transport_valid_type(le16_to_cpu(pkt->hdr.type))) {
- (void)virtio_transport_reset_no_sock(t, pkt);
+ le32_to_cpu(hdr->len),
+ le16_to_cpu(hdr->type),
+ le16_to_cpu(hdr->op),
+ le32_to_cpu(hdr->flags),
+ le32_to_cpu(hdr->buf_alloc),
+ le32_to_cpu(hdr->fwd_cnt));
+
+ if (!virtio_transport_valid_type(le16_to_cpu(hdr->type))) {
+ (void)virtio_transport_reset_no_sock(t, skb);
goto free_pkt;
}
@@ -1270,13 +1288,13 @@ void virtio_transport_recv_pkt(struct virtio_transport *t,
if (!sk) {
sk = vsock_find_bound_socket(&dst);
if (!sk) {
- (void)virtio_transport_reset_no_sock(t, pkt);
+ (void)virtio_transport_reset_no_sock(t, skb);
goto free_pkt;
}
}
- if (virtio_transport_get_type(sk) != le16_to_cpu(pkt->hdr.type)) {
- (void)virtio_transport_reset_no_sock(t, pkt);
+ if (virtio_transport_get_type(sk) != le16_to_cpu(hdr->type)) {
+ (void)virtio_transport_reset_no_sock(t, skb);
sock_put(sk);
goto free_pkt;
}
@@ -1287,13 +1305,13 @@ void virtio_transport_recv_pkt(struct virtio_transport *t,
/* Check if sk has been closed before lock_sock */
if (sock_flag(sk, SOCK_DONE)) {
- (void)virtio_transport_reset_no_sock(t, pkt);
+ (void)virtio_transport_reset_no_sock(t, skb);
release_sock(sk);
sock_put(sk);
goto free_pkt;
}
- space_available = virtio_transport_space_update(sk, pkt);
+ space_available = virtio_transport_space_update(sk, skb);
/* Update CID in case it has changed after a transport reset event */
if (vsk->local_addr.svm_cid != VMADDR_CID_ANY)
@@ -1304,23 +1322,23 @@ void virtio_transport_recv_pkt(struct virtio_transport *t,
switch (sk->sk_state) {
case TCP_LISTEN:
- virtio_transport_recv_listen(sk, pkt, t);
- virtio_transport_free_pkt(pkt);
+ virtio_transport_recv_listen(sk, skb, t);
+ kfree_skb(skb);
break;
case TCP_SYN_SENT:
- virtio_transport_recv_connecting(sk, pkt);
- virtio_transport_free_pkt(pkt);
+ virtio_transport_recv_connecting(sk, skb);
+ kfree_skb(skb);
break;
case TCP_ESTABLISHED:
- virtio_transport_recv_connected(sk, pkt);
+ virtio_transport_recv_connected(sk, skb);
break;
case TCP_CLOSING:
- virtio_transport_recv_disconnecting(sk, pkt);
- virtio_transport_free_pkt(pkt);
+ virtio_transport_recv_disconnecting(sk, skb);
+ kfree_skb(skb);
break;
default:
- (void)virtio_transport_reset_no_sock(t, pkt);
- virtio_transport_free_pkt(pkt);
+ (void)virtio_transport_reset_no_sock(t, skb);
+ kfree_skb(skb);
break;
}
@@ -1333,16 +1351,42 @@ void virtio_transport_recv_pkt(struct virtio_transport *t,
return;
free_pkt:
- virtio_transport_free_pkt(pkt);
+ kfree_skb(skb);
}
EXPORT_SYMBOL_GPL(virtio_transport_recv_pkt);
-void virtio_transport_free_pkt(struct virtio_vsock_pkt *pkt)
+/* Remove skbs found in a queue that have a vsk that matches.
+ *
+ * Each skb is freed.
+ *
+ * Returns the count of skbs that were reply packets.
+ */
+int virtio_transport_purge_skbs(void *vsk, struct sk_buff_head *queue)
{
- kvfree(pkt->buf);
- kfree(pkt);
+ struct sk_buff_head freeme;
+ struct sk_buff *skb, *tmp;
+ int cnt = 0;
+
+ skb_queue_head_init(&freeme);
+
+ spin_lock_bh(&queue->lock);
+ skb_queue_walk_safe(queue, skb, tmp) {
+ if (vsock_sk(skb->sk) != vsk)
+ continue;
+
+ __skb_unlink(skb, queue);
+ __skb_queue_tail(&freeme, skb);
+
+ if (virtio_vsock_skb_reply(skb))
+ cnt++;
+ }
+ spin_unlock_bh(&queue->lock);
+
+ __skb_queue_purge(&freeme);
+
+ return cnt;
}
-EXPORT_SYMBOL_GPL(virtio_transport_free_pkt);
+EXPORT_SYMBOL_GPL(virtio_transport_purge_skbs);
MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("Asias He");
diff --git a/net/vmw_vsock/vsock_loopback.c b/net/vmw_vsock/vsock_loopback.c
index 169a8cf65b390..671e03240fc52 100644
--- a/net/vmw_vsock/vsock_loopback.c
+++ b/net/vmw_vsock/vsock_loopback.c
@@ -16,7 +16,7 @@ struct vsock_loopback {
struct workqueue_struct *workqueue;
spinlock_t pkt_list_lock; /* protects pkt_list */
- struct list_head pkt_list;
+ struct sk_buff_head pkt_queue;
struct work_struct pkt_work;
};
@@ -27,13 +27,13 @@ static u32 vsock_loopback_get_local_cid(void)
return VMADDR_CID_LOCAL;
}
-static int vsock_loopback_send_pkt(struct virtio_vsock_pkt *pkt)
+static int vsock_loopback_send_pkt(struct sk_buff *skb)
{
struct vsock_loopback *vsock = &the_vsock_loopback;
- int len = pkt->len;
+ int len = skb->len;
spin_lock_bh(&vsock->pkt_list_lock);
- list_add_tail(&pkt->list, &vsock->pkt_list);
+ skb_queue_tail(&vsock->pkt_queue, skb);
spin_unlock_bh(&vsock->pkt_list_lock);
queue_work(vsock->workqueue, &vsock->pkt_work);
@@ -44,21 +44,8 @@ static int vsock_loopback_send_pkt(struct virtio_vsock_pkt *pkt)
static int vsock_loopback_cancel_pkt(struct vsock_sock *vsk)
{
struct vsock_loopback *vsock = &the_vsock_loopback;
- struct virtio_vsock_pkt *pkt, *n;
- LIST_HEAD(freeme);
- spin_lock_bh(&vsock->pkt_list_lock);
- list_for_each_entry_safe(pkt, n, &vsock->pkt_list, list) {
- if (pkt->vsk != vsk)
- continue;
- list_move(&pkt->list, &freeme);
- }
- spin_unlock_bh(&vsock->pkt_list_lock);
-
- list_for_each_entry_safe(pkt, n, &freeme, list) {
- list_del(&pkt->list);
- virtio_transport_free_pkt(pkt);
- }
+ virtio_transport_purge_skbs(vsk, &vsock->pkt_queue);
return 0;
}
@@ -121,20 +108,18 @@ static void vsock_loopback_work(struct work_struct *work)
{
struct vsock_loopback *vsock =
container_of(work, struct vsock_loopback, pkt_work);
- LIST_HEAD(pkts);
+ struct sk_buff_head pkts;
+ struct sk_buff *skb;
+
+ skb_queue_head_init(&pkts);
spin_lock_bh(&vsock->pkt_list_lock);
- list_splice_init(&vsock->pkt_list, &pkts);
+ skb_queue_splice_init(&vsock->pkt_queue, &pkts);
spin_unlock_bh(&vsock->pkt_list_lock);
- while (!list_empty(&pkts)) {
- struct virtio_vsock_pkt *pkt;
-
- pkt = list_first_entry(&pkts, struct virtio_vsock_pkt, list);
- list_del_init(&pkt->list);
-
- virtio_transport_deliver_tap_pkt(pkt);
- virtio_transport_recv_pkt(&loopback_transport, pkt);
+ while ((skb = __skb_dequeue(&pkts))) {
+ virtio_transport_deliver_tap_pkt(skb);
+ virtio_transport_recv_pkt(&loopback_transport, skb);
}
}
@@ -148,7 +133,7 @@ static int __init vsock_loopback_init(void)
return -ENOMEM;
spin_lock_init(&vsock->pkt_list_lock);
- INIT_LIST_HEAD(&vsock->pkt_list);
+ skb_queue_head_init(&vsock->pkt_queue);
INIT_WORK(&vsock->pkt_work, vsock_loopback_work);
ret = vsock_core_register(&loopback_transport.transport,
@@ -166,19 +151,13 @@ static int __init vsock_loopback_init(void)
static void __exit vsock_loopback_exit(void)
{
struct vsock_loopback *vsock = &the_vsock_loopback;
- struct virtio_vsock_pkt *pkt;
vsock_core_unregister(&loopback_transport.transport);
flush_work(&vsock->pkt_work);
spin_lock_bh(&vsock->pkt_list_lock);
- while (!list_empty(&vsock->pkt_list)) {
- pkt = list_first_entry(&vsock->pkt_list,
- struct virtio_vsock_pkt, list);
- list_del(&pkt->list);
- virtio_transport_free_pkt(pkt);
- }
+ virtio_vsock_skb_queue_purge(&vsock->pkt_queue);
spin_unlock_bh(&vsock->pkt_list_lock);
destroy_workqueue(vsock->workqueue);
--
2.42.0
next prev parent reply other threads:[~2023-11-15 20:02 UTC|newest]
Thread overview: 388+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-15 19:21 [PATCH 6.1 000/379] 6.1.63-rc1 review Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 001/379] hwmon: (nct6775) Fix incorrect variable reuse in fan_div calculation Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 002/379] sched/fair: Fix cfs_rq_is_decayed() on !SMP Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 003/379] iov_iter, x86: Be consistent about the __user tag on copy_mc_to_user() Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 004/379] sched/uclamp: Set max_spare_cap_cpu even if max_spare_cap is 0 Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 005/379] sched/uclamp: Ignore (util == 0) optimization in feec() when p_util_max = 0 Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 006/379] objtool: Propagate early errors Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 007/379] sched: Fix stop_one_cpu_nowait() vs hotplug Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 008/379] vfs: fix readahead(2) on block devices Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 009/379] writeback, cgroup: switch inodes with dirty timestamps to release dying cgwbs Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 010/379] x86/srso: Fix SBPB enablement for (possible) future fixed HW Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 011/379] futex: Dont include process MM in futex key on no-MMU Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 012/379] x86/numa: Introduce numa_fill_memblks() Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 013/379] ACPI/NUMA: Apply SRAT proximity domain to entire CFMWS window Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 014/379] x86/sev-es: Allow copy_from_kernel_nofault() in earlier boot Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 015/379] x86/boot: Fix incorrect startup_gdt_descr.size Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 016/379] drivers/clocksource/timer-ti-dm: Dont call clk_get_rate() in stop function Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 017/379] pstore/platform: Add check for kstrdup Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 018/379] string: Adjust strtomem() logic to allow for smaller sources Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 019/379] genirq/matrix: Exclude managed interrupts in irq_matrix_allocated() Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 020/379] wifi: cfg80211: add flush functions for wiphy work Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 021/379] wifi: mac80211: move radar detect work to " Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 022/379] wifi: mac80211: move scan " Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 023/379] wifi: mac80211: move offchannel works " Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 024/379] wifi: mac80211: move sched-scan stop work " Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 025/379] wifi: mac80211: fix # of MSDU in A-MSDU calculation Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 026/379] wifi: iwlwifi: honor the enable_ini value Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 027/379] i40e: fix potential memory leaks in i40e_remove() Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 028/379] iavf: Fix promiscuous mode configuration flow messages Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 029/379] selftests/bpf: Correct map_fd to data_fd in tailcalls Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 030/379] wifi: iwlwifi: Use FW rate for non-data frames Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 031/379] udp: add missing WRITE_ONCE() around up->encap_rcv Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 032/379] tcp: call tcp_try_undo_recovery when an RTOd TFO SYNACK is ACKed Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 033/379] gve: Use size_add() in call to struct_size() Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 034/379] mlxsw: Use size_mul() " Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 035/379] tls: Only use data field in crypto completion function Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 036/379] tls: Use size_add() in call to struct_size() Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 037/379] tipc: Use size_add() in calls " Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 038/379] net: spider_net: Use size_add() in call " Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 039/379] net: ethernet: mtk_wed: fix EXT_INT_STATUS_RX_FBUF definitions for MT7986 SoC Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 040/379] wifi: rtw88: debug: Fix the NULL vs IS_ERR() bug for debugfs_create_file() Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 041/379] wifi: ath11k: fix boot failure with one MSI vector Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 042/379] wifi: mt76: mt7603: rework/fix rx pse hang check Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 043/379] wifi: mt76: mt7603: improve watchdog reset reliablity Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 044/379] wifi: mt76: mt7603: improve stuck beacon handling Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 045/379] wifi: mt76: mt7915: fix beamforming availability check Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 046/379] wifi: ath: dfs_pattern_detector: Fix a memory initialization issue Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 047/379] tcp_metrics: add missing barriers on delete Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 048/379] tcp_metrics: properly set tp->snd_ssthresh in tcp_init_metrics() Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 049/379] tcp_metrics: do not create an entry from tcp_init_metrics() Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 050/379] wifi: rtlwifi: fix EDCA limit set by BT coexistence Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 051/379] ACPI: property: Allow _DSD buffer data only for byte accessors Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 052/379] =?UTF-8?q?ACPI:=20video:=20Add=20acpi=5Fbacklight=3Dvendor=20quir?= =?UTF-8?q?k=20for=20Toshiba=20Port=C3=A9g=C3=A9=20R100?= Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 053/379] wifi: ath11k: fix Tx power value during active CAC Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 054/379] can: dev: can_restart(): dont crash kernel if carrier is OK Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 055/379] can: dev: can_restart(): fix race condition between controller restart and netif_carrier_on() Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 056/379] can: dev: can_put_echo_skb(): dont crash kernel if can_priv::echo_skb is accessed out of bounds Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 057/379] PM / devfreq: rockchip-dfi: Make pmu regmap mandatory Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 058/379] wifi: wfx: fix case where rates are out of order Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 059/379] netfilter: nf_tables: Drop pointless memset when dumping rules Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 060/379] thermal: core: prevent potential string overflow Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 061/379] r8169: use tp_to_dev instead of open code Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 062/379] r8169: fix rare issue with broken rx after link-down on RTL8125 Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 063/379] selftests: netfilter: test for sctp collision processing in nf_conntrack Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 064/379] net: skb_find_text: Ignore patterns extending past to Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 065/379] chtls: fix tp->rcv_tstamp initialization Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 066/379] tcp: fix cookie_init_timestamp() overflows Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 067/379] wifi: iwlwifi: call napi_synchronize() before freeing rx/tx queues Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 068/379] wifi: iwlwifi: pcie: synchronize IRQs before NAPI Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 069/379] wifi: iwlwifi: empty overflow queue during flush Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 070/379] Bluetooth: hci_sync: Fix Opcode prints in bt_dev_dbg/err Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 071/379] bpf: Fix unnecessary -EBUSY from htab_lock_bucket Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 072/379] ACPI: sysfs: Fix create_pnp_modalias() and create_of_modalias() Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 073/379] ipv6: avoid atomic fragment on GSO packets Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 074/379] net: add DEV_STATS_READ() helper Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 075/379] ipvlan: properly track tx_errors Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 076/379] regmap: debugfs: Fix a erroneous check after snprintf() Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 077/379] spi: tegra: Fix missing IRQ check in tegra_slink_probe() Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 078/379] clk: qcom: gcc-msm8996: Remove RPM bus clocks Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 079/379] clk: qcom: clk-rcg2: Fix clock rate overflow for high parent frequencies Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 080/379] clk: qcom: mmcc-msm8998: Dont check halt bit on some branch clks Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 081/379] clk: qcom: mmcc-msm8998: Fix the SMMU GDSC Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 082/379] clk: qcom: gcc-sm8150: Fix gcc_sdcc2_apps_clk_src Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 083/379] regulator: mt6358: Fail probe on unknown chip ID Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 084/379] clk: imx: Select MXC_CLK for CLK_IMX8QXP Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 085/379] clk: imx: imx8mq: correct error handling path Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 086/379] clk: imx: imx8qxp: Fix elcdif_pll clock Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 087/379] clk: renesas: rcar-gen3: Extend SDnH divider table Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 088/379] clk: renesas: rzg2l: Wait for status bit of SD mux before continuing Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 089/379] clk: renesas: rzg2l: Lock around writes to mux register Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 090/379] clk: renesas: rzg2l: Trust value returned by hardware Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 091/379] clk: renesas: rzg2l: Use FIELD_GET() for PLL register fields Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 092/379] clk: renesas: rzg2l: Fix computation formula Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 093/379] clk: linux/clk-provider.h: fix kernel-doc warnings and typos Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 094/379] spi: nxp-fspi: use the correct ioremap function Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 095/379] clk: keystone: pll: fix a couple NULL vs IS_ERR() checks Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 096/379] clk: ti: change ti_clk_register[_omap_hw]() API Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 097/379] clk: ti: fix double free in of_ti_divider_clk_setup() Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 098/379] clk: npcm7xx: Fix incorrect kfree Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 099/379] clk: mediatek: clk-mt6765: Add check for mtk_alloc_clk_data Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 100/379] clk: mediatek: clk-mt6779: " Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 101/379] clk: mediatek: clk-mt6797: " Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 102/379] clk: mediatek: clk-mt7629-eth: " Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 103/379] clk: mediatek: clk-mt7629: " Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 104/379] clk: mediatek: clk-mt2701: " Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 105/379] clk: qcom: config IPQ_APSS_6018 should depend on QCOM_SMEM Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 106/379] platform/x86: wmi: Fix probe failure when failing to register WMI devices Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 107/379] platform/x86: wmi: Fix opening of char device Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 108/379] hwmon: (axi-fan-control) Fix possible NULL pointer dereference Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 109/379] hwmon: (coretemp) Fix potentially truncated sysfs attribute name Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 110/379] Revert "hwmon: (sch56xx-common) Add DMI override table" Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 111/379] Revert "hwmon: (sch56xx-common) Add automatic module loading on supported devices" Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 112/379] hwmon: (sch5627) Use bit macros when accessing the control register Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 113/379] hwmon: (sch5627) Disallow write access if virtual registers are locked Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 114/379] hte: tegra: Fix missing error code in tegra_hte_test_probe() Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 115/379] drm/rockchip: vop: Fix reset of state in duplicate state crtc funcs Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 116/379] drm/rockchip: vop: Fix call to crtc reset helper Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 117/379] drm/rockchip: vop2: Dont crash for invalid duplicate_state Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 118/379] drm/rockchip: vop2: Add missing call to crtc reset helper Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 119/379] drm/radeon: possible buffer overflow Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 120/379] drm: bridge: it66121: Fix invalid connector dereference Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 121/379] drm/bridge: lt8912b: Add hot plug detection Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 122/379] drm/bridge: lt8912b: Fix bridge_detach Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 123/379] drm/bridge: lt8912b: Fix crash on bridge detach Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 124/379] drm/bridge: lt8912b: Manually disable HPD only if it was enabled Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 125/379] drm/bridge: lt8912b: Add missing drm_bridge_attach call Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 126/379] drm/bridge: tc358768: Fix use of uninitialized variable Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 127/379] drm/bridge: tc358768: Fix bit updates Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 128/379] drm/bridge: tc358768: remove unused variable Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 129/379] drm/bridge: tc358768: Use struct videomode Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 130/379] drm/bridge: tc358768: Print logical values, not raw register values Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 131/379] drm/bridge: tc358768: Use dev for dbg prints, not priv->dev Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 132/379] drm/bridge: tc358768: Rename dsibclk to hsbyteclk Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 133/379] drm/bridge: tc358768: Clean up clock period code Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 134/379] drm/bridge: tc358768: Fix tc358768_ns_to_cnt() Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 135/379] drm/amdkfd: fix some race conditions in vram buffer alloc/free of svm code Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 136/379] drm/amd/display: Check all enabled planes in dm_check_crtc_cursor Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 137/379] drm/amd/display: Refactor dm_get_plane_scale helper Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 138/379] drm/amd/display: Bail from dm_check_crtc_cursor if no relevant change Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 139/379] io_uring/kbuf: Fix check of BID wrapping in provided buffers Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 140/379] io_uring/kbuf: Allow the full buffer id space for " Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 141/379] drm/mediatek: Fix iommu fault by swapping FBs after updating plane state Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 142/379] drm/mediatek: Fix iommu fault during crtc enabling Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 143/379] drm/rockchip: cdn-dp: Fix some error handling paths in cdn_dp_probe() Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 144/379] gpu: host1x: Correct allocated size for contexts Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 145/379] drm/bridge: lt9611uxc: fix the race in the error path Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 146/379] arm64/arm: xen: enlighten: Fix KPTI checks Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 147/379] drm/rockchip: Fix type promotion bug in rockchip_gem_iommu_map() Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 148/379] xenbus: fix error exit in xenbus_init() Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 149/379] xen-pciback: Consider INTx disabled when MSI/MSI-X is enabled Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 150/379] drm/msm/dsi: use msm_gem_kernel_put to free TX buffer Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 151/379] drm/msm/dsi: free TX buffer in unbind Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 152/379] clocksource/drivers/arm_arch_timer: limit XGene-1 workaround Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 153/379] drm: mediatek: mtk_dsi: Fix NO_EOT_PACKET settings/handling Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 154/379] drivers/perf: hisi: use cpuhp_state_remove_instance_nocalls() for hisi_hns3_pmu uninit process Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 155/379] perf/arm-cmn: Revamp model detection Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 156/379] perf/arm-cmn: Fix DTC domain detection Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 157/379] drivers/perf: hisi_pcie: Check the type first in pmu::event_init() Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 158/379] perf: hisi: Fix use-after-free when register pmu fails Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 159/379] ARM: dts: renesas: blanche: Fix typo in GP_11_2 pin name Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 160/379] arm64: dts: qcom: sdm845: cheza doesnt support LMh node Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 161/379] arm64: dts: qcom: sc7280: link usb3_phy_wrapper_gcc_usb30_pipe_clk Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 162/379] arm64: dts: qcom: msm8916: Fix iommu local address range Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 163/379] arm64: dts: qcom: msm8992-libra: drop duplicated reserved memory Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 164/379] arm64: dts: qcom: sc7280: Add missing LMH interrupts Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 165/379] arm64: dts: qcom: sm8150: add ref clock to PCIe PHYs Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 166/379] arm64: dts: qcom: sm8350: fix pinctrl for UART18 Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 167/379] arm64: dts: qcom: sdm845-mtp: fix WiFi configuration Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 168/379] ARM64: dts: marvell: cn9310: Use appropriate label for spi1 pins Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 169/379] arm64: dts: qcom: apq8016-sbc: Add missing ADV7533 regulators Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 170/379] ARM: dts: qcom: mdm9615: populate vsdcc fixed regulator Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 171/379] soc: qcom: llcc: Handle a second device without data corruption Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 172/379] kunit: Fix missed memory release in kunit_free_suite_set() Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 173/379] firmware: ti_sci: Mark driver as non removable Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 174/379] arm64: dts: ti: k3-am62a7-sk: Drop i2c-1 to 100Khz Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 175/379] firmware: arm_ffa: Assign the missing IDR allocation ID to the FFA device Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 176/379] firmware: arm_ffa: Allow the FF-A drivers to use 32bit mode of messaging Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 177/379] ARM: dts: am3517-evm: Fix LED3/4 pinmux Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 178/379] clk: scmi: Free scmi_clk allocated when the clocks with invalid info are skipped Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 179/379] arm64: dts: imx8qm-ss-img: Fix jpegenc compatible entry Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 180/379] arm64: dts: imx8mm: Add sound-dai-cells to micfil node Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 181/379] arm64: dts: imx8mn: " Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 182/379] arm64: tegra: Use correct interrupts for Tegra234 TKE Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 183/379] selftests/pidfd: Fix ksft print formats Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 184/379] selftests/resctrl: Ensure the benchmark commands fits to its array Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 185/379] module/decompress: use vmalloc() for gzip decompression workspace Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 186/379] ASoC: cs35l41: Verify PM runtime resume errors in IRQ handler Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 187/379] ASoC: cs35l41: Undo runtime PM changes at driver exit time Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 188/379] ALSA: hda: cs35l41: Fix unbalanced pm_runtime_get() Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 189/379] ALSA: hda: cs35l41: Undo runtime PM changes at driver exit time Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 190/379] KEYS: Include linux/errno.h in linux/verification.h Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 191/379] crypto: hisilicon/hpre - Fix a erroneous check after snprintf() Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 192/379] hwrng: bcm2835 - Fix hwrng throughput regression Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 193/379] hwrng: geode - fix accessing registers Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 194/379] RDMA/core: Use size_{add,sub,mul}() in calls to struct_size() Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 195/379] crypto: qat - ignore subsequent state up commands Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 196/379] crypto: qat - relocate bufferlist logic Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 197/379] crypto: qat - rename bufferlist functions Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 198/379] crypto: qat - change bufferlist logic interface Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 199/379] crypto: qat - generalize crypto request buffers Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 200/379] crypto: qat - extend buffer list interface Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 201/379] crypto: qat - fix unregistration of crypto algorithms Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 202/379] scsi: ibmvfc: Fix erroneous use of rtas_busy_delay with hcall return code Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 203/379] libnvdimm/of_pmem: Use devm_kstrdup instead of kstrdup and check its return value Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 204/379] nd_btt: Make BTT lanes preemptible Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 205/379] crypto: caam/qi2 - fix Chacha20 + Poly1305 self test failure Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 206/379] crypto: caam/jr " Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 207/379] crypto: qat - increase size of buffers Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 208/379] PCI: vmd: Correct PCI Header Type Registers multi-function check Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 209/379] hid: cp2112: Fix duplicate workqueue initialization Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 210/379] crypto: hisilicon/qm - delete redundant null assignment operations Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 211/379] crypto: hisilicon/qm - modify the process of regs dfx Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 212/379] crypto: hisilicon/qm - split a debugfs.c from qm Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 213/379] crypto: hisilicon/qm - fix PF queue parameter issue Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 214/379] ARM: 9321/1: memset: cast the constant byte to unsigned char Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 215/379] ext4: move ix sanity check to corrent position Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 216/379] ASoC: fsl: mpc5200_dma.c: Fix warning of Function parameter or member not described Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 217/379] IB/mlx5: Fix rdma counter binding for RAW QP Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 218/379] RDMA/hns: Fix printing level of asynchronous events Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 219/379] RDMA/hns: Fix uninitialized ucmd in hns_roce_create_qp_common() Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 220/379] RDMA/hns: Fix signed-unsigned mixed comparisons Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 221/379] RDMA/hns: Add check for SL Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 222/379] RDMA/hns: The UD mode can only be configured with DCQCN Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 223/379] ASoC: SOF: core: Ensure sof_ops_free() is still called when probe never ran Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 224/379] ASoC: fsl: Fix PM disable depth imbalance in fsl_easrc_probe Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 225/379] scsi: ufs: core: Leave space for \0 in utf8 desc string Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 226/379] RDMA/hfi1: Workaround truncation compilation error Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 227/379] HID: cp2112: Make irq_chip immutable Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 228/379] hid: cp2112: Fix IRQ shutdown stopping polling for all IRQs on chip Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 229/379] sh: bios: Revive earlyprintk support Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 230/379] Revert "HID: logitech-hidpp: add a module parameter to keep firmware gestures" Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 231/379] HID: logitech-hidpp: Remove HIDPP_QUIRK_NO_HIDINPUT quirk Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 232/379] HID: logitech-hidpp: Dont restart IO, instead defer hid_connect() only Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 233/379] HID: logitech-hidpp: Revert "Dont restart communication if not necessary" Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 234/379] HID: logitech-hidpp: Move get_wireless_feature_index() check to hidpp_connect_event() Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 235/379] ASoC: Intel: Skylake: Fix mem leak when parsing UUIDs fails Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 236/379] padata: Fix refcnt handling in padata_free_shell() Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 237/379] crypto: qat - fix deadlock in backlog processing Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 238/379] ASoC: ams-delta.c: use component after check Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 239/379] IB/mlx5: Fix init stage error handling to avoid double free of same QP and UAF Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 240/379] mfd: core: Un-constify mfd_cell.of_reg Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 241/379] mfd: core: Ensure disabled devices are skipped without aborting Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 242/379] mfd: dln2: Fix double put in dln2_probe Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 243/379] dt-bindings: mfd: mt6397: Add binding for MT6357 Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 244/379] dt-bindings: mfd: mt6397: Split out compatible for MediaTek MT6366 PMIC Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 245/379] mfd: arizona-spi: Set pdata.hpdet_channel for ACPI enumerated devs Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 246/379] leds: turris-omnia: Drop unnecessary mutex locking Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 247/379] leds: turris-omnia: Do not use SMBUS calls Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 248/379] leds: pwm: Dont disable the PWM when the LED should be off Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 249/379] leds: trigger: ledtrig-cpu:: Fix output may be truncated issue for cpu Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 250/379] kunit: add macro to allow conditionally exposing static symbols to tests Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 251/379] apparmor: test: make static symbols visible during kunit testing Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 252/379] apparmor: fix invalid reference on profile->disconnected Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 253/379] perf stat: Fix aggr mode initialization Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 254/379] iio: frequency: adf4350: Use device managed functions and fix power down issue Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 255/379] perf kwork: Fix incorrect and missing free atom in work_push_atom() Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 256/379] perf kwork: Add the supported subcommands to the document Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 257/379] perf kwork: Set ordered_events to true in struct perf_tool Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 258/379] filemap: add filemap_get_folios_tag() Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 259/379] f2fs: convert f2fs_write_cache_pages() to use filemap_get_folios_tag() Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 260/379] f2fs: compress: fix deadloop in f2fs_write_cache_pages() Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 261/379] f2fs: compress: fix to avoid use-after-free on dic Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 262/379] f2fs: compress: fix to avoid redundant compress extension Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 263/379] tty: tty_jobctrl: fix pid memleak in disassociate_ctty() Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 264/379] livepatch: Fix missing newline character in klp_resolve_symbols() Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 265/379] pinctrl: renesas: rzg2l: Make reverse order of enable() for disable() Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 266/379] perf record: Fix BTF type checks in the off-cpu profiling Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 267/379] dmaengine: idxd: Register dsa_bus_type before registering idxd sub-drivers Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 268/379] usb: dwc2: fix possible NULL pointer dereference caused by driver concurrency Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 269/379] usb: chipidea: Fix DMA overwrite for Tegra Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 270/379] usb: chipidea: Simplify Tegra DMA alignment code Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 271/379] dmaengine: ti: edma: handle irq_of_parse_and_map() errors Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 272/379] misc: st_core: Do not call kfree_skb() under spin_lock_irqsave() Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 273/379] tools: iio: iio_generic_buffer ensure alignment Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 274/379] USB: usbip: fix stub_dev hub disconnect Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 275/379] dmaengine: pxa_dma: Remove an erroneous BUG_ON() in pxad_free_desc() Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 276/379] f2fs: fix to initialize map.m_pblk in f2fs_precache_extents() Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 277/379] interconnect: qcom: sc7180: Retire DEFINE_QBCM Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 278/379] interconnect: qcom: sc7180: Set ACV enable_mask Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 279/379] interconnect: qcom: sc7280: " Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 280/379] interconnect: qcom: sc8180x: " Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 281/379] interconnect: qcom: sc8280xp: " Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 282/379] interconnect: qcom: sdm845: Retire DEFINE_QBCM Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 283/379] interconnect: qcom: sdm845: Set ACV enable_mask Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 284/379] interconnect: qcom: sm6350: Retire DEFINE_QBCM Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 285/379] interconnect: qcom: sm6350: Set ACV enable_mask Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 286/379] interconnect: move ignore_list out of of_count_icc_providers() Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 287/379] interconnect: qcom: sm8150: Drop IP0 interconnects Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 288/379] interconnect: qcom: sm8150: Retire DEFINE_QBCM Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 289/379] interconnect: qcom: sm8150: Set ACV enable_mask Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 290/379] interconnect: qcom: sm8350: Retire DEFINE_QBCM Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 291/379] interconnect: qcom: sm8350: Set ACV enable_mask Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 292/379] powerpc: Only define __parse_fpscr() when required Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 293/379] modpost: fix tee MODULE_DEVICE_TABLE built on big-endian host Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 294/379] modpost: fix ishtp " Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 295/379] powerpc/40x: Remove stale PTE_ATOMIC_UPDATES macro Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 296/379] powerpc/xive: Fix endian conversion size Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 297/379] powerpc/vas: Limit open window failure messages in log bufffer Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 298/379] powerpc/imc-pmu: Use the correct spinlock initializer Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 299/379] powerpc/pseries: fix potential memory leak in init_cpu_associativity() Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 300/379] xhci: Loosen RPM as default policy to cover for AMD xHC 1.1 Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 301/379] usb: host: xhci-plat: fix possible kernel oops while resuming Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 302/379] perf machine: Avoid out of bounds LBR memory read Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 303/379] perf hist: Add missing puts to hist__account_cycles Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 304/379] 9p/net: fix possible memory leak in p9_check_errors() Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 305/379] i3c: Fix potential refcount leak in i3c_master_register_new_i3c_devs Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 306/379] cxl/mem: Fix shutdown order Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 307/379] crypto: ccp - Name -1 return value as SEV_RET_NO_FW_CALL Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 308/379] x86/sev: Change snp_guest_issue_request()s fw_err argument Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 309/379] virt: sevguest: Fix passing a stack buffer as a scatterlist target Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 310/379] rtc: pcf85363: fix wrong mask/val parameters in regmap_update_bits call Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 311/379] pcmcia: cs: fix possible hung task and memory leak pccardd() Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 312/379] pcmcia: ds: fix refcount leak in pcmcia_device_add() Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 313/379] pcmcia: ds: fix possible name leak in error path " Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 314/379] media: hantro: Check whether reset op is defined before use Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 315/379] media: verisilicon: Do not enable G2 postproc downscale if source is narrower than destination Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 316/379] media: ov5640: Drop dead code using frame_interval Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 317/379] media: ov5640: fix vblank unchange issue when work at dvp mode Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 318/379] media: i2c: max9286: Fix some redundant of_node_put() calls Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 319/379] media: ov5640: Fix a memory leak when ov5640_probe fails Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 320/379] media: bttv: fix use after free error due to btv->timeout timer Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 321/379] media: amphion: handle firmware debug message Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 322/379] media: mtk-jpegenc: Fix bug in JPEG encode quality selection Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 323/379] media: s3c-camif: Avoid inappropriate kfree() Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 324/379] media: vidtv: psi: Add check for kstrdup Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 325/379] media: vidtv: mux: Add check and kfree " Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 326/379] media: cedrus: Fix clock/reset sequence Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 327/379] media: cadence: csi2rx: Unregister v4l2 async notifier Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 328/379] media: dvb-usb-v2: af9035: fix missing unlock Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 329/379] media: cec: meson: always include meson sub-directory in Makefile Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 330/379] regmap: prevent noinc writes from clobbering cache Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 331/379] pwm: sti: Reduce number of allocations and drop usage of chip_data Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 332/379] pwm: brcmstb: Utilize appropriate clock APIs in suspend/resume Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 333/379] Input: synaptics-rmi4 - fix use after free in rmi_unregister_function() Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 334/379] watchdog: ixp4xx: Make sure restart always works Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 335/379] llc: verify mac len before reading mac header Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 336/379] hsr: Prevent use after free in prp_create_tagged_frame() Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 337/379] tipc: Change nla_policy for bearer-related names to NLA_NUL_STRING Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 338/379] bpf: Check map->usercnt after timer->timer is assigned Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 339/379] inet: shrink struct flowi_common Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 340/379] octeontx2-pf: Fix error codes Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 341/379] octeontx2-pf: Fix holes in error code Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 342/379] net: page_pool: add missing free_percpu when page_pool_init fail Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 343/379] dccp: Call security_inet_conn_request() after setting IPv4 addresses Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 344/379] dccp/tcp: Call security_inet_conn_request() after setting IPv6 addresses Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 345/379] net: r8169: Disable multicast filter for RTL8168H and RTL8107E Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 346/379] Fix termination state for idr_for_each_entry_ul() Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 347/379] net: stmmac: xgmac: Enable support for multiple Flexible PPS outputs Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 348/379] selftests: pmtu.sh: fix result checking Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 349/379] octeontx2-pf: Rename tot_tx_queues to non_qos_queues Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 350/379] octeontx2-pf: qos send queues management Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 351/379] octeontx2-pf: Free pending and dropped SQEs Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 352/379] net/smc: fix dangling sock under state SMC_APPFINCLOSEWAIT Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 353/379] net/smc: allow cdc msg send rather than drop it with NULL sndbuf_desc Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 354/379] net/smc: put sk reference if close work was canceled Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 355/379] nvme: fix error-handling for io_uring nvme-passthrough Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 356/379] tg3: power down device only on SYSTEM_POWER_OFF Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 357/379] nbd: fix uaf in nbd_open Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 358/379] blk-core: use pr_warn_ratelimited() in bio_check_ro() Greg Kroah-Hartman
2023-11-15 19:27 ` Greg Kroah-Hartman [this message]
2023-11-15 19:27 ` [PATCH 6.1 360/379] vsock/virtio: remove socket from connected/bound list on shutdown Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 361/379] r8169: respect userspace disabling IFF_MULTICAST Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 362/379] i2c: iproc: handle invalid slave state Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 363/379] netfilter: xt_recent: fix (increase) ipv6 literal buffer length Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 364/379] netfilter: nft_redir: use `struct nf_nat_range2` throughout and deduplicate eval call-backs Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 365/379] netfilter: nat: fix ipv6 nat redirect with mapped and scoped addresses Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 366/379] RISC-V: Dont fail in riscv_of_parent_hartid() for disabled HARTs Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 367/379] drm/syncobj: fix DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 368/379] ASoC: mediatek: mt8186_mt6366_rt1019_rt5682s: trivial: fix error messages Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 369/379] ASoC: hdmi-codec: register hpd callback on component probe Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 370/379] ASoC: dapm: fix clock get name Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 371/379] spi: spi-zynq-qspi: add spi-mem to driver kconfig dependencies Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 372/379] fbdev: imsttfb: Fix error path of imsttfb_probe() Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 373/379] fbdev: imsttfb: fix a resource leak in probe Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 374/379] fbdev: fsl-diu-fb: mark wr_reg_wa() static Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 375/379] tracing/kprobes: Fix the order of argument descriptions Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 376/379] io_uring/net: ensure socket is marked connected on connect retry Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 377/379] x86/amd_nb: Use Family 19h Models 60h-7Fh Function 4 IDs Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 378/379] Revert "mmc: core: Capture correct oemid-bits for eMMC cards" Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 379/379] btrfs: use u64 for buffer sizes in the tree search ioctls Greg Kroah-Hartman
2023-11-15 22:31 ` [PATCH 6.1 000/379] 6.1.63-rc1 review SeongJae Park
2023-11-15 23:26 ` Florian Fainelli
2023-11-16 18:23 ` Naresh Kamboju
2023-11-16 23:43 ` Guenter Roeck
2023-11-17 9:14 ` Ron Economos
2023-11-17 17:01 ` Pavel Machek
2023-11-17 19:27 ` Allen Pais
2023-11-17 19:57 ` Pavel Machek
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=20231115192706.397251970@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=bobby.eshleman@bytedance.com \
--cc=davem@davemloft.net \
--cc=patches@lists.linux.dev \
--cc=sashal@kernel.org \
--cc=sgarzare@redhat.com \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.