Skip to content

Commit bf5432b

Browse files
stefano-garzarelladavem330
authored andcommitted
vsock/virtio: remove loopback handling
We can remove the loopback handling from virtio_transport, because now the vsock core is able to handle local communication using the new vsock_loopback device. Reviewed-by: Stefan Hajnoczi <[email protected]> Signed-off-by: Stefano Garzarella <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 408624a commit bf5432b

File tree

1 file changed

+2
-59
lines changed

1 file changed

+2
-59
lines changed

net/vmw_vsock/virtio_transport.c

Lines changed: 2 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,6 @@ struct virtio_vsock {
4444
spinlock_t send_pkt_list_lock;
4545
struct list_head send_pkt_list;
4646

47-
struct work_struct loopback_work;
48-
spinlock_t loopback_list_lock; /* protects loopback_list */
49-
struct list_head loopback_list;
50-
5147
atomic_t queued_replies;
5248

5349
/* The following fields are protected by rx_lock. vqs[VSOCK_VQ_RX]
@@ -86,20 +82,6 @@ static u32 virtio_transport_get_local_cid(void)
8682
return ret;
8783
}
8884

89-
static int virtio_transport_send_pkt_loopback(struct virtio_vsock *vsock,
90-
struct virtio_vsock_pkt *pkt)
91-
{
92-
int len = pkt->len;
93-
94-
spin_lock_bh(&vsock->loopback_list_lock);
95-
list_add_tail(&pkt->list, &vsock->loopback_list);
96-
spin_unlock_bh(&vsock->loopback_list_lock);
97-
98-
queue_work(virtio_vsock_workqueue, &vsock->loopback_work);
99-
100-
return len;
101-
}
102-
10385
static void
10486
virtio_transport_send_pkt_work(struct work_struct *work)
10587
{
@@ -194,7 +176,8 @@ virtio_transport_send_pkt(struct virtio_vsock_pkt *pkt)
194176
}
195177

196178
if (le64_to_cpu(pkt->hdr.dst_cid) == vsock->guest_cid) {
197-
len = virtio_transport_send_pkt_loopback(vsock, pkt);
179+
virtio_transport_free_pkt(pkt);
180+
len = -ENODEV;
198181
goto out_rcu;
199182
}
200183

@@ -502,33 +485,6 @@ static struct virtio_transport virtio_transport = {
502485
.send_pkt = virtio_transport_send_pkt,
503486
};
504487

505-
static void virtio_transport_loopback_work(struct work_struct *work)
506-
{
507-
struct virtio_vsock *vsock =
508-
container_of(work, struct virtio_vsock, loopback_work);
509-
LIST_HEAD(pkts);
510-
511-
spin_lock_bh(&vsock->loopback_list_lock);
512-
list_splice_init(&vsock->loopback_list, &pkts);
513-
spin_unlock_bh(&vsock->loopback_list_lock);
514-
515-
mutex_lock(&vsock->rx_lock);
516-
517-
if (!vsock->rx_run)
518-
goto out;
519-
520-
while (!list_empty(&pkts)) {
521-
struct virtio_vsock_pkt *pkt;
522-
523-
pkt = list_first_entry(&pkts, struct virtio_vsock_pkt, list);
524-
list_del_init(&pkt->list);
525-
526-
virtio_transport_recv_pkt(&virtio_transport, pkt);
527-
}
528-
out:
529-
mutex_unlock(&vsock->rx_lock);
530-
}
531-
532488
static void virtio_transport_rx_work(struct work_struct *work)
533489
{
534490
struct virtio_vsock *vsock =
@@ -633,13 +589,10 @@ static int virtio_vsock_probe(struct virtio_device *vdev)
633589
mutex_init(&vsock->event_lock);
634590
spin_lock_init(&vsock->send_pkt_list_lock);
635591
INIT_LIST_HEAD(&vsock->send_pkt_list);
636-
spin_lock_init(&vsock->loopback_list_lock);
637-
INIT_LIST_HEAD(&vsock->loopback_list);
638592
INIT_WORK(&vsock->rx_work, virtio_transport_rx_work);
639593
INIT_WORK(&vsock->tx_work, virtio_transport_tx_work);
640594
INIT_WORK(&vsock->event_work, virtio_transport_event_work);
641595
INIT_WORK(&vsock->send_pkt_work, virtio_transport_send_pkt_work);
642-
INIT_WORK(&vsock->loopback_work, virtio_transport_loopback_work);
643596

644597
mutex_lock(&vsock->tx_lock);
645598
vsock->tx_run = true;
@@ -720,22 +673,12 @@ static void virtio_vsock_remove(struct virtio_device *vdev)
720673
}
721674
spin_unlock_bh(&vsock->send_pkt_list_lock);
722675

723-
spin_lock_bh(&vsock->loopback_list_lock);
724-
while (!list_empty(&vsock->loopback_list)) {
725-
pkt = list_first_entry(&vsock->loopback_list,
726-
struct virtio_vsock_pkt, list);
727-
list_del(&pkt->list);
728-
virtio_transport_free_pkt(pkt);
729-
}
730-
spin_unlock_bh(&vsock->loopback_list_lock);
731-
732676
/* Delete virtqueues and flush outstanding callbacks if any */
733677
vdev->config->del_vqs(vdev);
734678

735679
/* Other works can be queued before 'config->del_vqs()', so we flush
736680
* all works before to free the vsock object to avoid use after free.
737681
*/
738-
flush_work(&vsock->loopback_work);
739682
flush_work(&vsock->rx_work);
740683
flush_work(&vsock->tx_work);
741684
flush_work(&vsock->event_work);

0 commit comments

Comments
 (0)