Skip to content

Commit 4c7246d

Browse files
stefano-garzarelladavem330
authored andcommitted
vsock/virtio: add transport parameter to the virtio_transport_reset_no_sock()
We are going to add 'struct vsock_sock *' parameter to virtio_transport_get_ops(). In some cases, like in the virtio_transport_reset_no_sock(), we don't have any socket assigned to the packet received, so we can't use the virtio_transport_get_ops(). In order to allow virtio_transport_reset_no_sock() to use the '.send_pkt' callback from the 'vhost_transport' or 'virtio_transport', we add the 'struct virtio_transport *' to it and to its caller: virtio_transport_recv_pkt(). We moved the 'vhost_transport' and 'virtio_transport' definition, to pass their address to the virtio_transport_recv_pkt(). Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Stefano Garzarella <sgarzare@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent fe502c4 commit 4c7246d

File tree

4 files changed

+135
-134
lines changed

4 files changed

+135
-134
lines changed

drivers/vhost/vsock.c

Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,52 @@ static bool vhost_vsock_more_replies(struct vhost_vsock *vsock)
384384
return val < vq->num;
385385
}
386386

387+
static struct virtio_transport vhost_transport = {
388+
.transport = {
389+
.get_local_cid = vhost_transport_get_local_cid,
390+
391+
.init = virtio_transport_do_socket_init,
392+
.destruct = virtio_transport_destruct,
393+
.release = virtio_transport_release,
394+
.connect = virtio_transport_connect,
395+
.shutdown = virtio_transport_shutdown,
396+
.cancel_pkt = vhost_transport_cancel_pkt,
397+
398+
.dgram_enqueue = virtio_transport_dgram_enqueue,
399+
.dgram_dequeue = virtio_transport_dgram_dequeue,
400+
.dgram_bind = virtio_transport_dgram_bind,
401+
.dgram_allow = virtio_transport_dgram_allow,
402+
403+
.stream_enqueue = virtio_transport_stream_enqueue,
404+
.stream_dequeue = virtio_transport_stream_dequeue,
405+
.stream_has_data = virtio_transport_stream_has_data,
406+
.stream_has_space = virtio_transport_stream_has_space,
407+
.stream_rcvhiwat = virtio_transport_stream_rcvhiwat,
408+
.stream_is_active = virtio_transport_stream_is_active,
409+
.stream_allow = virtio_transport_stream_allow,
410+
411+
.notify_poll_in = virtio_transport_notify_poll_in,
412+
.notify_poll_out = virtio_transport_notify_poll_out,
413+
.notify_recv_init = virtio_transport_notify_recv_init,
414+
.notify_recv_pre_block = virtio_transport_notify_recv_pre_block,
415+
.notify_recv_pre_dequeue = virtio_transport_notify_recv_pre_dequeue,
416+
.notify_recv_post_dequeue = virtio_transport_notify_recv_post_dequeue,
417+
.notify_send_init = virtio_transport_notify_send_init,
418+
.notify_send_pre_block = virtio_transport_notify_send_pre_block,
419+
.notify_send_pre_enqueue = virtio_transport_notify_send_pre_enqueue,
420+
.notify_send_post_enqueue = virtio_transport_notify_send_post_enqueue,
421+
422+
.set_buffer_size = virtio_transport_set_buffer_size,
423+
.set_min_buffer_size = virtio_transport_set_min_buffer_size,
424+
.set_max_buffer_size = virtio_transport_set_max_buffer_size,
425+
.get_buffer_size = virtio_transport_get_buffer_size,
426+
.get_min_buffer_size = virtio_transport_get_min_buffer_size,
427+
.get_max_buffer_size = virtio_transport_get_max_buffer_size,
428+
},
429+
430+
.send_pkt = vhost_transport_send_pkt,
431+
};
432+
387433
static void vhost_vsock_handle_tx_kick(struct vhost_work *work)
388434
{
389435
struct vhost_virtqueue *vq = container_of(work, struct vhost_virtqueue,
@@ -438,7 +484,7 @@ static void vhost_vsock_handle_tx_kick(struct vhost_work *work)
438484

439485
/* Only accept correctly addressed packets */
440486
if (le64_to_cpu(pkt->hdr.src_cid) == vsock->guest_cid)
441-
virtio_transport_recv_pkt(pkt);
487+
virtio_transport_recv_pkt(&vhost_transport, pkt);
442488
else
443489
virtio_transport_free_pkt(pkt);
444490

@@ -786,52 +832,6 @@ static struct miscdevice vhost_vsock_misc = {
786832
.fops = &vhost_vsock_fops,
787833
};
788834

789-
static struct virtio_transport vhost_transport = {
790-
.transport = {
791-
.get_local_cid = vhost_transport_get_local_cid,
792-
793-
.init = virtio_transport_do_socket_init,
794-
.destruct = virtio_transport_destruct,
795-
.release = virtio_transport_release,
796-
.connect = virtio_transport_connect,
797-
.shutdown = virtio_transport_shutdown,
798-
.cancel_pkt = vhost_transport_cancel_pkt,
799-
800-
.dgram_enqueue = virtio_transport_dgram_enqueue,
801-
.dgram_dequeue = virtio_transport_dgram_dequeue,
802-
.dgram_bind = virtio_transport_dgram_bind,
803-
.dgram_allow = virtio_transport_dgram_allow,
804-
805-
.stream_enqueue = virtio_transport_stream_enqueue,
806-
.stream_dequeue = virtio_transport_stream_dequeue,
807-
.stream_has_data = virtio_transport_stream_has_data,
808-
.stream_has_space = virtio_transport_stream_has_space,
809-
.stream_rcvhiwat = virtio_transport_stream_rcvhiwat,
810-
.stream_is_active = virtio_transport_stream_is_active,
811-
.stream_allow = virtio_transport_stream_allow,
812-
813-
.notify_poll_in = virtio_transport_notify_poll_in,
814-
.notify_poll_out = virtio_transport_notify_poll_out,
815-
.notify_recv_init = virtio_transport_notify_recv_init,
816-
.notify_recv_pre_block = virtio_transport_notify_recv_pre_block,
817-
.notify_recv_pre_dequeue = virtio_transport_notify_recv_pre_dequeue,
818-
.notify_recv_post_dequeue = virtio_transport_notify_recv_post_dequeue,
819-
.notify_send_init = virtio_transport_notify_send_init,
820-
.notify_send_pre_block = virtio_transport_notify_send_pre_block,
821-
.notify_send_pre_enqueue = virtio_transport_notify_send_pre_enqueue,
822-
.notify_send_post_enqueue = virtio_transport_notify_send_post_enqueue,
823-
824-
.set_buffer_size = virtio_transport_set_buffer_size,
825-
.set_min_buffer_size = virtio_transport_set_min_buffer_size,
826-
.set_max_buffer_size = virtio_transport_set_max_buffer_size,
827-
.get_buffer_size = virtio_transport_get_buffer_size,
828-
.get_min_buffer_size = virtio_transport_get_min_buffer_size,
829-
.get_max_buffer_size = virtio_transport_get_max_buffer_size,
830-
},
831-
832-
.send_pkt = vhost_transport_send_pkt,
833-
};
834-
835835
static int __init vhost_vsock_init(void)
836836
{
837837
int ret;

include/linux/virtio_vsock.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,8 @@ virtio_transport_dgram_enqueue(struct vsock_sock *vsk,
150150

151151
void virtio_transport_destruct(struct vsock_sock *vsk);
152152

153-
void virtio_transport_recv_pkt(struct virtio_vsock_pkt *pkt);
153+
void virtio_transport_recv_pkt(struct virtio_transport *t,
154+
struct virtio_vsock_pkt *pkt);
154155
void virtio_transport_free_pkt(struct virtio_vsock_pkt *pkt);
155156
void virtio_transport_inc_tx_pkt(struct virtio_vsock_sock *vvs, struct virtio_vsock_pkt *pkt);
156157
u32 virtio_transport_get_credit(struct virtio_vsock_sock *vvs, u32 wanted);

net/vmw_vsock/virtio_transport.c

Lines changed: 80 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -86,33 +86,6 @@ static u32 virtio_transport_get_local_cid(void)
8686
return ret;
8787
}
8888

89-
static void virtio_transport_loopback_work(struct work_struct *work)
90-
{
91-
struct virtio_vsock *vsock =
92-
container_of(work, struct virtio_vsock, loopback_work);
93-
LIST_HEAD(pkts);
94-
95-
spin_lock_bh(&vsock->loopback_list_lock);
96-
list_splice_init(&vsock->loopback_list, &pkts);
97-
spin_unlock_bh(&vsock->loopback_list_lock);
98-
99-
mutex_lock(&vsock->rx_lock);
100-
101-
if (!vsock->rx_run)
102-
goto out;
103-
104-
while (!list_empty(&pkts)) {
105-
struct virtio_vsock_pkt *pkt;
106-
107-
pkt = list_first_entry(&pkts, struct virtio_vsock_pkt, list);
108-
list_del_init(&pkt->list);
109-
110-
virtio_transport_recv_pkt(pkt);
111-
}
112-
out:
113-
mutex_unlock(&vsock->rx_lock);
114-
}
115-
11689
static int virtio_transport_send_pkt_loopback(struct virtio_vsock *vsock,
11790
struct virtio_vsock_pkt *pkt)
11891
{
@@ -370,59 +343,6 @@ static bool virtio_transport_more_replies(struct virtio_vsock *vsock)
370343
return val < virtqueue_get_vring_size(vq);
371344
}
372345

373-
static void virtio_transport_rx_work(struct work_struct *work)
374-
{
375-
struct virtio_vsock *vsock =
376-
container_of(work, struct virtio_vsock, rx_work);
377-
struct virtqueue *vq;
378-
379-
vq = vsock->vqs[VSOCK_VQ_RX];
380-
381-
mutex_lock(&vsock->rx_lock);
382-
383-
if (!vsock->rx_run)
384-
goto out;
385-
386-
do {
387-
virtqueue_disable_cb(vq);
388-
for (;;) {
389-
struct virtio_vsock_pkt *pkt;
390-
unsigned int len;
391-
392-
if (!virtio_transport_more_replies(vsock)) {
393-
/* Stop rx until the device processes already
394-
* pending replies. Leave rx virtqueue
395-
* callbacks disabled.
396-
*/
397-
goto out;
398-
}
399-
400-
pkt = virtqueue_get_buf(vq, &len);
401-
if (!pkt) {
402-
break;
403-
}
404-
405-
vsock->rx_buf_nr--;
406-
407-
/* Drop short/long packets */
408-
if (unlikely(len < sizeof(pkt->hdr) ||
409-
len > sizeof(pkt->hdr) + pkt->len)) {
410-
virtio_transport_free_pkt(pkt);
411-
continue;
412-
}
413-
414-
pkt->len = len - sizeof(pkt->hdr);
415-
virtio_transport_deliver_tap_pkt(pkt);
416-
virtio_transport_recv_pkt(pkt);
417-
}
418-
} while (!virtqueue_enable_cb(vq));
419-
420-
out:
421-
if (vsock->rx_buf_nr < vsock->rx_buf_max_nr / 2)
422-
virtio_vsock_rx_fill(vsock);
423-
mutex_unlock(&vsock->rx_lock);
424-
}
425-
426346
/* event_lock must be held */
427347
static int virtio_vsock_event_fill_one(struct virtio_vsock *vsock,
428348
struct virtio_vsock_event *event)
@@ -586,6 +506,86 @@ static struct virtio_transport virtio_transport = {
586506
.send_pkt = virtio_transport_send_pkt,
587507
};
588508

509+
static void virtio_transport_loopback_work(struct work_struct *work)
510+
{
511+
struct virtio_vsock *vsock =
512+
container_of(work, struct virtio_vsock, loopback_work);
513+
LIST_HEAD(pkts);
514+
515+
spin_lock_bh(&vsock->loopback_list_lock);
516+
list_splice_init(&vsock->loopback_list, &pkts);
517+
spin_unlock_bh(&vsock->loopback_list_lock);
518+
519+
mutex_lock(&vsock->rx_lock);
520+
521+
if (!vsock->rx_run)
522+
goto out;
523+
524+
while (!list_empty(&pkts)) {
525+
struct virtio_vsock_pkt *pkt;
526+
527+
pkt = list_first_entry(&pkts, struct virtio_vsock_pkt, list);
528+
list_del_init(&pkt->list);
529+
530+
virtio_transport_recv_pkt(&virtio_transport, pkt);
531+
}
532+
out:
533+
mutex_unlock(&vsock->rx_lock);
534+
}
535+
536+
static void virtio_transport_rx_work(struct work_struct *work)
537+
{
538+
struct virtio_vsock *vsock =
539+
container_of(work, struct virtio_vsock, rx_work);
540+
struct virtqueue *vq;
541+
542+
vq = vsock->vqs[VSOCK_VQ_RX];
543+
544+
mutex_lock(&vsock->rx_lock);
545+
546+
if (!vsock->rx_run)
547+
goto out;
548+
549+
do {
550+
virtqueue_disable_cb(vq);
551+
for (;;) {
552+
struct virtio_vsock_pkt *pkt;
553+
unsigned int len;
554+
555+
if (!virtio_transport_more_replies(vsock)) {
556+
/* Stop rx until the device processes already
557+
* pending replies. Leave rx virtqueue
558+
* callbacks disabled.
559+
*/
560+
goto out;
561+
}
562+
563+
pkt = virtqueue_get_buf(vq, &len);
564+
if (!pkt) {
565+
break;
566+
}
567+
568+
vsock->rx_buf_nr--;
569+
570+
/* Drop short/long packets */
571+
if (unlikely(len < sizeof(pkt->hdr) ||
572+
len > sizeof(pkt->hdr) + pkt->len)) {
573+
virtio_transport_free_pkt(pkt);
574+
continue;
575+
}
576+
577+
pkt->len = len - sizeof(pkt->hdr);
578+
virtio_transport_deliver_tap_pkt(pkt);
579+
virtio_transport_recv_pkt(&virtio_transport, pkt);
580+
}
581+
} while (!virtqueue_enable_cb(vq));
582+
583+
out:
584+
if (vsock->rx_buf_nr < vsock->rx_buf_max_nr / 2)
585+
virtio_vsock_rx_fill(vsock);
586+
mutex_unlock(&vsock->rx_lock);
587+
}
588+
589589
static int virtio_vsock_probe(struct virtio_device *vdev)
590590
{
591591
vq_callback_t *callbacks[] = {

net/vmw_vsock/virtio_transport_common.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -745,9 +745,9 @@ static int virtio_transport_reset(struct vsock_sock *vsk,
745745
/* Normally packets are associated with a socket. There may be no socket if an
746746
* attempt was made to connect to a socket that does not exist.
747747
*/
748-
static int virtio_transport_reset_no_sock(struct virtio_vsock_pkt *pkt)
748+
static int virtio_transport_reset_no_sock(const struct virtio_transport *t,
749+
struct virtio_vsock_pkt *pkt)
749750
{
750-
const struct virtio_transport *t;
751751
struct virtio_vsock_pkt *reply;
752752
struct virtio_vsock_pkt_info info = {
753753
.op = VIRTIO_VSOCK_OP_RST,
@@ -767,7 +767,6 @@ static int virtio_transport_reset_no_sock(struct virtio_vsock_pkt *pkt)
767767
if (!reply)
768768
return -ENOMEM;
769769

770-
t = virtio_transport_get_ops();
771770
if (!t) {
772771
virtio_transport_free_pkt(reply);
773772
return -ENOTCONN;
@@ -1109,7 +1108,8 @@ static bool virtio_transport_space_update(struct sock *sk,
11091108
/* We are under the virtio-vsock's vsock->rx_lock or vhost-vsock's vq->mutex
11101109
* lock.
11111110
*/
1112-
void virtio_transport_recv_pkt(struct virtio_vsock_pkt *pkt)
1111+
void virtio_transport_recv_pkt(struct virtio_transport *t,
1112+
struct virtio_vsock_pkt *pkt)
11131113
{
11141114
struct sockaddr_vm src, dst;
11151115
struct vsock_sock *vsk;
@@ -1131,7 +1131,7 @@ void virtio_transport_recv_pkt(struct virtio_vsock_pkt *pkt)
11311131
le32_to_cpu(pkt->hdr.fwd_cnt));
11321132

11331133
if (le16_to_cpu(pkt->hdr.type) != VIRTIO_VSOCK_TYPE_STREAM) {
1134-
(void)virtio_transport_reset_no_sock(pkt);
1134+
(void)virtio_transport_reset_no_sock(t, pkt);
11351135
goto free_pkt;
11361136
}
11371137

@@ -1142,7 +1142,7 @@ void virtio_transport_recv_pkt(struct virtio_vsock_pkt *pkt)
11421142
if (!sk) {
11431143
sk = vsock_find_bound_socket(&dst);
11441144
if (!sk) {
1145-
(void)virtio_transport_reset_no_sock(pkt);
1145+
(void)virtio_transport_reset_no_sock(t, pkt);
11461146
goto free_pkt;
11471147
}
11481148
}

0 commit comments

Comments
 (0)