Lines Matching refs:vsock

70 	struct virtio_vsock *vsock;  in virtio_transport_get_local_cid()  local
74 vsock = rcu_dereference(the_virtio_vsock); in virtio_transport_get_local_cid()
75 if (!vsock) { in virtio_transport_get_local_cid()
80 ret = vsock->guest_cid; in virtio_transport_get_local_cid()
89 struct virtio_vsock *vsock = in virtio_transport_send_pkt_work() local
95 mutex_lock(&vsock->tx_lock); in virtio_transport_send_pkt_work()
97 if (!vsock->tx_run) in virtio_transport_send_pkt_work()
100 vq = vsock->vqs[VSOCK_VQ_TX]; in virtio_transport_send_pkt_work()
108 spin_lock_bh(&vsock->send_pkt_list_lock); in virtio_transport_send_pkt_work()
109 if (list_empty(&vsock->send_pkt_list)) { in virtio_transport_send_pkt_work()
110 spin_unlock_bh(&vsock->send_pkt_list_lock); in virtio_transport_send_pkt_work()
114 pkt = list_first_entry(&vsock->send_pkt_list, in virtio_transport_send_pkt_work()
117 spin_unlock_bh(&vsock->send_pkt_list_lock); in virtio_transport_send_pkt_work()
135 spin_lock_bh(&vsock->send_pkt_list_lock); in virtio_transport_send_pkt_work()
136 list_add(&pkt->list, &vsock->send_pkt_list); in virtio_transport_send_pkt_work()
137 spin_unlock_bh(&vsock->send_pkt_list_lock); in virtio_transport_send_pkt_work()
142 struct virtqueue *rx_vq = vsock->vqs[VSOCK_VQ_RX]; in virtio_transport_send_pkt_work()
145 val = atomic_dec_return(&vsock->queued_replies); in virtio_transport_send_pkt_work()
159 mutex_unlock(&vsock->tx_lock); in virtio_transport_send_pkt_work()
162 queue_work(virtio_vsock_workqueue, &vsock->rx_work); in virtio_transport_send_pkt_work()
168 struct virtio_vsock *vsock; in virtio_transport_send_pkt() local
172 vsock = rcu_dereference(the_virtio_vsock); in virtio_transport_send_pkt()
173 if (!vsock) { in virtio_transport_send_pkt()
179 if (le64_to_cpu(pkt->hdr.dst_cid) == vsock->guest_cid) { in virtio_transport_send_pkt()
186 atomic_inc(&vsock->queued_replies); in virtio_transport_send_pkt()
188 spin_lock_bh(&vsock->send_pkt_list_lock); in virtio_transport_send_pkt()
189 list_add_tail(&pkt->list, &vsock->send_pkt_list); in virtio_transport_send_pkt()
190 spin_unlock_bh(&vsock->send_pkt_list_lock); in virtio_transport_send_pkt()
192 queue_work(virtio_vsock_workqueue, &vsock->send_pkt_work); in virtio_transport_send_pkt()
202 struct virtio_vsock *vsock; in virtio_transport_cancel_pkt() local
208 vsock = rcu_dereference(the_virtio_vsock); in virtio_transport_cancel_pkt()
209 if (!vsock) { in virtio_transport_cancel_pkt()
214 spin_lock_bh(&vsock->send_pkt_list_lock); in virtio_transport_cancel_pkt()
215 list_for_each_entry_safe(pkt, n, &vsock->send_pkt_list, list) { in virtio_transport_cancel_pkt()
220 spin_unlock_bh(&vsock->send_pkt_list_lock); in virtio_transport_cancel_pkt()
230 struct virtqueue *rx_vq = vsock->vqs[VSOCK_VQ_RX]; in virtio_transport_cancel_pkt()
233 new_cnt = atomic_sub_return(cnt, &vsock->queued_replies); in virtio_transport_cancel_pkt()
236 queue_work(virtio_vsock_workqueue, &vsock->rx_work); in virtio_transport_cancel_pkt()
246 static void virtio_vsock_rx_fill(struct virtio_vsock *vsock) in virtio_vsock_rx_fill() argument
254 vq = vsock->vqs[VSOCK_VQ_RX]; in virtio_vsock_rx_fill()
280 vsock->rx_buf_nr++; in virtio_vsock_rx_fill()
282 if (vsock->rx_buf_nr > vsock->rx_buf_max_nr) in virtio_vsock_rx_fill()
283 vsock->rx_buf_max_nr = vsock->rx_buf_nr; in virtio_vsock_rx_fill()
289 struct virtio_vsock *vsock = in virtio_transport_tx_work() local
294 vq = vsock->vqs[VSOCK_VQ_TX]; in virtio_transport_tx_work()
295 mutex_lock(&vsock->tx_lock); in virtio_transport_tx_work()
297 if (!vsock->tx_run) in virtio_transport_tx_work()
312 mutex_unlock(&vsock->tx_lock); in virtio_transport_tx_work()
315 queue_work(virtio_vsock_workqueue, &vsock->send_pkt_work); in virtio_transport_tx_work()
319 static bool virtio_transport_more_replies(struct virtio_vsock *vsock) in virtio_transport_more_replies() argument
321 struct virtqueue *vq = vsock->vqs[VSOCK_VQ_RX]; in virtio_transport_more_replies()
325 val = atomic_read(&vsock->queued_replies); in virtio_transport_more_replies()
331 static int virtio_vsock_event_fill_one(struct virtio_vsock *vsock, in virtio_vsock_event_fill_one() argument
337 vq = vsock->vqs[VSOCK_VQ_EVENT]; in virtio_vsock_event_fill_one()
345 static void virtio_vsock_event_fill(struct virtio_vsock *vsock) in virtio_vsock_event_fill() argument
349 for (i = 0; i < ARRAY_SIZE(vsock->event_list); i++) { in virtio_vsock_event_fill()
350 struct virtio_vsock_event *event = &vsock->event_list[i]; in virtio_vsock_event_fill()
352 virtio_vsock_event_fill_one(vsock, event); in virtio_vsock_event_fill()
355 virtqueue_kick(vsock->vqs[VSOCK_VQ_EVENT]); in virtio_vsock_event_fill()
370 static void virtio_vsock_update_guest_cid(struct virtio_vsock *vsock) in virtio_vsock_update_guest_cid() argument
372 struct virtio_device *vdev = vsock->vdev; in virtio_vsock_update_guest_cid()
377 vsock->guest_cid = le64_to_cpu(guest_cid); in virtio_vsock_update_guest_cid()
381 static void virtio_vsock_event_handle(struct virtio_vsock *vsock, in virtio_vsock_event_handle() argument
386 virtio_vsock_update_guest_cid(vsock); in virtio_vsock_event_handle()
394 struct virtio_vsock *vsock = in virtio_transport_event_work() local
398 vq = vsock->vqs[VSOCK_VQ_EVENT]; in virtio_transport_event_work()
400 mutex_lock(&vsock->event_lock); in virtio_transport_event_work()
402 if (!vsock->event_run) in virtio_transport_event_work()
412 virtio_vsock_event_handle(vsock, event); in virtio_transport_event_work()
414 virtio_vsock_event_fill_one(vsock, event); in virtio_transport_event_work()
418 virtqueue_kick(vsock->vqs[VSOCK_VQ_EVENT]); in virtio_transport_event_work()
420 mutex_unlock(&vsock->event_lock); in virtio_transport_event_work()
425 struct virtio_vsock *vsock = vq->vdev->priv; in virtio_vsock_event_done() local
427 if (!vsock) in virtio_vsock_event_done()
429 queue_work(virtio_vsock_workqueue, &vsock->event_work); in virtio_vsock_event_done()
434 struct virtio_vsock *vsock = vq->vdev->priv; in virtio_vsock_tx_done() local
436 if (!vsock) in virtio_vsock_tx_done()
438 queue_work(virtio_vsock_workqueue, &vsock->tx_work); in virtio_vsock_tx_done()
443 struct virtio_vsock *vsock = vq->vdev->priv; in virtio_vsock_rx_done() local
445 if (!vsock) in virtio_vsock_rx_done()
447 queue_work(virtio_vsock_workqueue, &vsock->rx_work); in virtio_vsock_rx_done()
501 struct virtio_vsock *vsock; in virtio_transport_seqpacket_allow() local
506 vsock = rcu_dereference(the_virtio_vsock); in virtio_transport_seqpacket_allow()
507 if (vsock) in virtio_transport_seqpacket_allow()
508 seqpacket_allow = vsock->seqpacket_allow; in virtio_transport_seqpacket_allow()
516 struct virtio_vsock *vsock = in virtio_transport_rx_work() local
520 vq = vsock->vqs[VSOCK_VQ_RX]; in virtio_transport_rx_work()
522 mutex_lock(&vsock->rx_lock); in virtio_transport_rx_work()
524 if (!vsock->rx_run) in virtio_transport_rx_work()
533 if (!virtio_transport_more_replies(vsock)) { in virtio_transport_rx_work()
546 vsock->rx_buf_nr--; in virtio_transport_rx_work()
562 if (vsock->rx_buf_nr < vsock->rx_buf_max_nr / 2) in virtio_transport_rx_work()
563 virtio_vsock_rx_fill(vsock); in virtio_transport_rx_work()
564 mutex_unlock(&vsock->rx_lock); in virtio_transport_rx_work()
579 struct virtio_vsock *vsock = NULL; in virtio_vsock_probe() local
593 vsock = kzalloc(sizeof(*vsock), GFP_KERNEL); in virtio_vsock_probe()
594 if (!vsock) { in virtio_vsock_probe()
599 vsock->vdev = vdev; in virtio_vsock_probe()
601 ret = virtio_find_vqs(vsock->vdev, VSOCK_VQ_MAX, in virtio_vsock_probe()
602 vsock->vqs, callbacks, names, in virtio_vsock_probe()
607 virtio_vsock_update_guest_cid(vsock); in virtio_vsock_probe()
609 vsock->rx_buf_nr = 0; in virtio_vsock_probe()
610 vsock->rx_buf_max_nr = 0; in virtio_vsock_probe()
611 atomic_set(&vsock->queued_replies, 0); in virtio_vsock_probe()
613 mutex_init(&vsock->tx_lock); in virtio_vsock_probe()
614 mutex_init(&vsock->rx_lock); in virtio_vsock_probe()
615 mutex_init(&vsock->event_lock); in virtio_vsock_probe()
616 spin_lock_init(&vsock->send_pkt_list_lock); in virtio_vsock_probe()
617 INIT_LIST_HEAD(&vsock->send_pkt_list); in virtio_vsock_probe()
618 INIT_WORK(&vsock->rx_work, virtio_transport_rx_work); in virtio_vsock_probe()
619 INIT_WORK(&vsock->tx_work, virtio_transport_tx_work); in virtio_vsock_probe()
620 INIT_WORK(&vsock->event_work, virtio_transport_event_work); in virtio_vsock_probe()
621 INIT_WORK(&vsock->send_pkt_work, virtio_transport_send_pkt_work); in virtio_vsock_probe()
623 mutex_lock(&vsock->tx_lock); in virtio_vsock_probe()
624 vsock->tx_run = true; in virtio_vsock_probe()
625 mutex_unlock(&vsock->tx_lock); in virtio_vsock_probe()
627 mutex_lock(&vsock->rx_lock); in virtio_vsock_probe()
628 virtio_vsock_rx_fill(vsock); in virtio_vsock_probe()
629 vsock->rx_run = true; in virtio_vsock_probe()
630 mutex_unlock(&vsock->rx_lock); in virtio_vsock_probe()
632 mutex_lock(&vsock->event_lock); in virtio_vsock_probe()
633 virtio_vsock_event_fill(vsock); in virtio_vsock_probe()
634 vsock->event_run = true; in virtio_vsock_probe()
635 mutex_unlock(&vsock->event_lock); in virtio_vsock_probe()
638 vsock->seqpacket_allow = true; in virtio_vsock_probe()
640 vdev->priv = vsock; in virtio_vsock_probe()
641 rcu_assign_pointer(the_virtio_vsock, vsock); in virtio_vsock_probe()
648 kfree(vsock); in virtio_vsock_probe()
655 struct virtio_vsock *vsock = vdev->priv; in virtio_vsock_remove() local
670 mutex_lock(&vsock->rx_lock); in virtio_vsock_remove()
671 vsock->rx_run = false; in virtio_vsock_remove()
672 mutex_unlock(&vsock->rx_lock); in virtio_vsock_remove()
674 mutex_lock(&vsock->tx_lock); in virtio_vsock_remove()
675 vsock->tx_run = false; in virtio_vsock_remove()
676 mutex_unlock(&vsock->tx_lock); in virtio_vsock_remove()
678 mutex_lock(&vsock->event_lock); in virtio_vsock_remove()
679 vsock->event_run = false; in virtio_vsock_remove()
680 mutex_unlock(&vsock->event_lock); in virtio_vsock_remove()
687 mutex_lock(&vsock->rx_lock); in virtio_vsock_remove()
688 while ((pkt = virtqueue_detach_unused_buf(vsock->vqs[VSOCK_VQ_RX]))) in virtio_vsock_remove()
690 mutex_unlock(&vsock->rx_lock); in virtio_vsock_remove()
692 mutex_lock(&vsock->tx_lock); in virtio_vsock_remove()
693 while ((pkt = virtqueue_detach_unused_buf(vsock->vqs[VSOCK_VQ_TX]))) in virtio_vsock_remove()
695 mutex_unlock(&vsock->tx_lock); in virtio_vsock_remove()
697 spin_lock_bh(&vsock->send_pkt_list_lock); in virtio_vsock_remove()
698 while (!list_empty(&vsock->send_pkt_list)) { in virtio_vsock_remove()
699 pkt = list_first_entry(&vsock->send_pkt_list, in virtio_vsock_remove()
704 spin_unlock_bh(&vsock->send_pkt_list_lock); in virtio_vsock_remove()
712 flush_work(&vsock->rx_work); in virtio_vsock_remove()
713 flush_work(&vsock->tx_work); in virtio_vsock_remove()
714 flush_work(&vsock->event_work); in virtio_vsock_remove()
715 flush_work(&vsock->send_pkt_work); in virtio_vsock_remove()
719 kfree(vsock); in virtio_vsock_remove()