@@ -44,10 +44,6 @@ struct virtio_vsock {
44
44
spinlock_t send_pkt_list_lock ;
45
45
struct list_head send_pkt_list ;
46
46
47
- struct work_struct loopback_work ;
48
- spinlock_t loopback_list_lock ; /* protects loopback_list */
49
- struct list_head loopback_list ;
50
-
51
47
atomic_t queued_replies ;
52
48
53
49
/* The following fields are protected by rx_lock. vqs[VSOCK_VQ_RX]
@@ -86,20 +82,6 @@ static u32 virtio_transport_get_local_cid(void)
86
82
return ret ;
87
83
}
88
84
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
-
103
85
static void
104
86
virtio_transport_send_pkt_work (struct work_struct * work )
105
87
{
@@ -194,7 +176,8 @@ virtio_transport_send_pkt(struct virtio_vsock_pkt *pkt)
194
176
}
195
177
196
178
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 ;
198
181
goto out_rcu ;
199
182
}
200
183
@@ -502,33 +485,6 @@ static struct virtio_transport virtio_transport = {
502
485
.send_pkt = virtio_transport_send_pkt ,
503
486
};
504
487
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
-
532
488
static void virtio_transport_rx_work (struct work_struct * work )
533
489
{
534
490
struct virtio_vsock * vsock =
@@ -633,13 +589,10 @@ static int virtio_vsock_probe(struct virtio_device *vdev)
633
589
mutex_init (& vsock -> event_lock );
634
590
spin_lock_init (& vsock -> send_pkt_list_lock );
635
591
INIT_LIST_HEAD (& vsock -> send_pkt_list );
636
- spin_lock_init (& vsock -> loopback_list_lock );
637
- INIT_LIST_HEAD (& vsock -> loopback_list );
638
592
INIT_WORK (& vsock -> rx_work , virtio_transport_rx_work );
639
593
INIT_WORK (& vsock -> tx_work , virtio_transport_tx_work );
640
594
INIT_WORK (& vsock -> event_work , virtio_transport_event_work );
641
595
INIT_WORK (& vsock -> send_pkt_work , virtio_transport_send_pkt_work );
642
- INIT_WORK (& vsock -> loopback_work , virtio_transport_loopback_work );
643
596
644
597
mutex_lock (& vsock -> tx_lock );
645
598
vsock -> tx_run = true;
@@ -720,22 +673,12 @@ static void virtio_vsock_remove(struct virtio_device *vdev)
720
673
}
721
674
spin_unlock_bh (& vsock -> send_pkt_list_lock );
722
675
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
-
732
676
/* Delete virtqueues and flush outstanding callbacks if any */
733
677
vdev -> config -> del_vqs (vdev );
734
678
735
679
/* Other works can be queued before 'config->del_vqs()', so we flush
736
680
* all works before to free the vsock object to avoid use after free.
737
681
*/
738
- flush_work (& vsock -> loopback_work );
739
682
flush_work (& vsock -> rx_work );
740
683
flush_work (& vsock -> tx_work );
741
684
flush_work (& vsock -> event_work );
0 commit comments