]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - net/vmw_vsock/virtio_transport.c
Merge tag 'for_v5.5-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
[linux.git] / net / vmw_vsock / virtio_transport.c
index 082a309366905987528608e597999bef6f0ee661..1458c5c8b64d2784d79f8def7d709e734dfa13bf 100644 (file)
@@ -86,33 +86,6 @@ static u32 virtio_transport_get_local_cid(void)
        return ret;
 }
 
-static void virtio_transport_loopback_work(struct work_struct *work)
-{
-       struct virtio_vsock *vsock =
-               container_of(work, struct virtio_vsock, loopback_work);
-       LIST_HEAD(pkts);
-
-       spin_lock_bh(&vsock->loopback_list_lock);
-       list_splice_init(&vsock->loopback_list, &pkts);
-       spin_unlock_bh(&vsock->loopback_list_lock);
-
-       mutex_lock(&vsock->rx_lock);
-
-       if (!vsock->rx_run)
-               goto out;
-
-       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_recv_pkt(pkt);
-       }
-out:
-       mutex_unlock(&vsock->rx_lock);
-}
-
 static int virtio_transport_send_pkt_loopback(struct virtio_vsock *vsock,
                                              struct virtio_vsock_pkt *pkt)
 {
@@ -370,59 +343,6 @@ static bool virtio_transport_more_replies(struct virtio_vsock *vsock)
        return val < virtqueue_get_vring_size(vq);
 }
 
-static void virtio_transport_rx_work(struct work_struct *work)
-{
-       struct virtio_vsock *vsock =
-               container_of(work, struct virtio_vsock, rx_work);
-       struct virtqueue *vq;
-
-       vq = vsock->vqs[VSOCK_VQ_RX];
-
-       mutex_lock(&vsock->rx_lock);
-
-       if (!vsock->rx_run)
-               goto out;
-
-       do {
-               virtqueue_disable_cb(vq);
-               for (;;) {
-                       struct virtio_vsock_pkt *pkt;
-                       unsigned int len;
-
-                       if (!virtio_transport_more_replies(vsock)) {
-                               /* Stop rx until the device processes already
-                                * pending replies.  Leave rx virtqueue
-                                * callbacks disabled.
-                                */
-                               goto out;
-                       }
-
-                       pkt = virtqueue_get_buf(vq, &len);
-                       if (!pkt) {
-                               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);
-                               continue;
-                       }
-
-                       pkt->len = len - sizeof(pkt->hdr);
-                       virtio_transport_deliver_tap_pkt(pkt);
-                       virtio_transport_recv_pkt(pkt);
-               }
-       } while (!virtqueue_enable_cb(vq));
-
-out:
-       if (vsock->rx_buf_nr < vsock->rx_buf_max_nr / 2)
-               virtio_vsock_rx_fill(vsock);
-       mutex_unlock(&vsock->rx_lock);
-}
-
 /* event_lock must be held */
 static int virtio_vsock_event_fill_one(struct virtio_vsock *vsock,
                                       struct virtio_vsock_event *event)
@@ -542,6 +462,8 @@ static void virtio_vsock_rx_done(struct virtqueue *vq)
 
 static struct virtio_transport virtio_transport = {
        .transport = {
+               .module                   = THIS_MODULE,
+
                .get_local_cid            = virtio_transport_get_local_cid,
 
                .init                     = virtio_transport_do_socket_init,
@@ -574,18 +496,92 @@ static struct virtio_transport virtio_transport = {
                .notify_send_pre_block    = virtio_transport_notify_send_pre_block,
                .notify_send_pre_enqueue  = virtio_transport_notify_send_pre_enqueue,
                .notify_send_post_enqueue = virtio_transport_notify_send_post_enqueue,
-
-               .set_buffer_size          = virtio_transport_set_buffer_size,
-               .set_min_buffer_size      = virtio_transport_set_min_buffer_size,
-               .set_max_buffer_size      = virtio_transport_set_max_buffer_size,
-               .get_buffer_size          = virtio_transport_get_buffer_size,
-               .get_min_buffer_size      = virtio_transport_get_min_buffer_size,
-               .get_max_buffer_size      = virtio_transport_get_max_buffer_size,
+               .notify_buffer_size       = virtio_transport_notify_buffer_size,
        },
 
        .send_pkt = virtio_transport_send_pkt,
 };
 
+static void virtio_transport_loopback_work(struct work_struct *work)
+{
+       struct virtio_vsock *vsock =
+               container_of(work, struct virtio_vsock, loopback_work);
+       LIST_HEAD(pkts);
+
+       spin_lock_bh(&vsock->loopback_list_lock);
+       list_splice_init(&vsock->loopback_list, &pkts);
+       spin_unlock_bh(&vsock->loopback_list_lock);
+
+       mutex_lock(&vsock->rx_lock);
+
+       if (!vsock->rx_run)
+               goto out;
+
+       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_recv_pkt(&virtio_transport, pkt);
+       }
+out:
+       mutex_unlock(&vsock->rx_lock);
+}
+
+static void virtio_transport_rx_work(struct work_struct *work)
+{
+       struct virtio_vsock *vsock =
+               container_of(work, struct virtio_vsock, rx_work);
+       struct virtqueue *vq;
+
+       vq = vsock->vqs[VSOCK_VQ_RX];
+
+       mutex_lock(&vsock->rx_lock);
+
+       if (!vsock->rx_run)
+               goto out;
+
+       do {
+               virtqueue_disable_cb(vq);
+               for (;;) {
+                       struct virtio_vsock_pkt *pkt;
+                       unsigned int len;
+
+                       if (!virtio_transport_more_replies(vsock)) {
+                               /* Stop rx until the device processes already
+                                * pending replies.  Leave rx virtqueue
+                                * callbacks disabled.
+                                */
+                               goto out;
+                       }
+
+                       pkt = virtqueue_get_buf(vq, &len);
+                       if (!pkt) {
+                               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);
+                               continue;
+                       }
+
+                       pkt->len = len - sizeof(pkt->hdr);
+                       virtio_transport_deliver_tap_pkt(pkt);
+                       virtio_transport_recv_pkt(&virtio_transport, pkt);
+               }
+       } while (!virtqueue_enable_cb(vq));
+
+out:
+       if (vsock->rx_buf_nr < vsock->rx_buf_max_nr / 2)
+               virtio_vsock_rx_fill(vsock);
+       mutex_unlock(&vsock->rx_lock);
+}
+
 static int virtio_vsock_probe(struct virtio_device *vdev)
 {
        vq_callback_t *callbacks[] = {
@@ -776,7 +772,8 @@ static int __init virtio_vsock_init(void)
        if (!virtio_vsock_workqueue)
                return -ENOMEM;
 
-       ret = vsock_core_init(&virtio_transport.transport);
+       ret = vsock_core_register(&virtio_transport.transport,
+                                 VSOCK_TRANSPORT_F_G2H);
        if (ret)
                goto out_wq;
 
@@ -787,7 +784,7 @@ static int __init virtio_vsock_init(void)
        return 0;
 
 out_vci:
-       vsock_core_exit();
+       vsock_core_unregister(&virtio_transport.transport);
 out_wq:
        destroy_workqueue(virtio_vsock_workqueue);
        return ret;
@@ -796,7 +793,7 @@ static int __init virtio_vsock_init(void)
 static void __exit virtio_vsock_exit(void)
 {
        unregister_virtio_driver(&virtio_vsock_driver);
-       vsock_core_exit();
+       vsock_core_unregister(&virtio_transport.transport);
        destroy_workqueue(virtio_vsock_workqueue);
 }