Lines Matching refs:vsock

72 	struct vhost_vsock *vsock;  in vhost_vsock_get()  local
74 hash_for_each_possible_rcu(vhost_vsock_hash, vsock, hash, guest_cid) { in vhost_vsock_get()
75 u32 other_cid = vsock->guest_cid; in vhost_vsock_get()
82 return vsock; in vhost_vsock_get()
90 vhost_transport_do_send_pkt(struct vhost_vsock *vsock, in vhost_transport_do_send_pkt() argument
93 struct vhost_virtqueue *tx_vq = &vsock->vqs[VSOCK_VQ_TX]; in vhost_transport_do_send_pkt()
107 vhost_disable_notify(&vsock->dev, vq); in vhost_transport_do_send_pkt()
119 skb = virtio_vsock_skb_dequeue(&vsock->send_pkt_queue); in vhost_transport_do_send_pkt()
122 vhost_enable_notify(&vsock->dev, vq); in vhost_transport_do_send_pkt()
129 virtio_vsock_skb_queue_head(&vsock->send_pkt_queue, skb); in vhost_transport_do_send_pkt()
134 virtio_vsock_skb_queue_head(&vsock->send_pkt_queue, skb); in vhost_transport_do_send_pkt()
138 if (unlikely(vhost_enable_notify(&vsock->dev, vq))) { in vhost_transport_do_send_pkt()
139 vhost_disable_notify(&vsock->dev, vq); in vhost_transport_do_send_pkt()
229 virtio_vsock_skb_queue_head(&vsock->send_pkt_queue, skb); in vhost_transport_do_send_pkt()
234 val = atomic_dec_return(&vsock->queued_replies); in vhost_transport_do_send_pkt()
247 vhost_signal(&vsock->dev, vq); in vhost_transport_do_send_pkt()
259 struct vhost_vsock *vsock; in vhost_transport_send_pkt_work() local
261 vsock = container_of(work, struct vhost_vsock, send_pkt_work); in vhost_transport_send_pkt_work()
262 vq = &vsock->vqs[VSOCK_VQ_RX]; in vhost_transport_send_pkt_work()
264 vhost_transport_do_send_pkt(vsock, vq); in vhost_transport_send_pkt_work()
271 struct vhost_vsock *vsock; in vhost_transport_send_pkt() local
277 vsock = vhost_vsock_get(le64_to_cpu(hdr->dst_cid)); in vhost_transport_send_pkt()
278 if (!vsock) { in vhost_transport_send_pkt()
285 atomic_inc(&vsock->queued_replies); in vhost_transport_send_pkt()
287 virtio_vsock_skb_queue_tail(&vsock->send_pkt_queue, skb); in vhost_transport_send_pkt()
288 vhost_vq_work_queue(&vsock->vqs[VSOCK_VQ_RX], &vsock->send_pkt_work); in vhost_transport_send_pkt()
297 struct vhost_vsock *vsock; in vhost_transport_cancel_pkt() local
304 vsock = vhost_vsock_get(vsk->remote_addr.svm_cid); in vhost_transport_cancel_pkt()
305 if (!vsock) in vhost_transport_cancel_pkt()
308 cnt = virtio_transport_purge_skbs(vsk, &vsock->send_pkt_queue); in vhost_transport_cancel_pkt()
311 struct vhost_virtqueue *tx_vq = &vsock->vqs[VSOCK_VQ_TX]; in vhost_transport_cancel_pkt()
314 new_cnt = atomic_sub_return(cnt, &vsock->queued_replies); in vhost_transport_cancel_pkt()
386 static bool vhost_vsock_more_replies(struct vhost_vsock *vsock) in vhost_vsock_more_replies() argument
388 struct vhost_virtqueue *vq = &vsock->vqs[VSOCK_VQ_TX]; in vhost_vsock_more_replies()
392 val = atomic_read(&vsock->queued_replies); in vhost_vsock_more_replies()
450 struct vhost_vsock *vsock; in vhost_transport_seqpacket_allow() local
454 vsock = vhost_vsock_get(remote_cid); in vhost_transport_seqpacket_allow()
456 if (vsock) in vhost_transport_seqpacket_allow()
457 seqpacket_allow = vsock->seqpacket_allow; in vhost_transport_seqpacket_allow()
468 struct vhost_vsock *vsock = container_of(vq->dev, struct vhost_vsock, in vhost_vsock_handle_tx_kick() local
483 vhost_disable_notify(&vsock->dev, vq); in vhost_vsock_handle_tx_kick()
487 if (!vhost_vsock_more_replies(vsock)) { in vhost_vsock_handle_tx_kick()
501 if (unlikely(vhost_enable_notify(&vsock->dev, vq))) { in vhost_vsock_handle_tx_kick()
502 vhost_disable_notify(&vsock->dev, vq); in vhost_vsock_handle_tx_kick()
522 if (le64_to_cpu(hdr->src_cid) == vsock->guest_cid && in vhost_vsock_handle_tx_kick()
535 vhost_signal(&vsock->dev, vq); in vhost_vsock_handle_tx_kick()
545 struct vhost_vsock *vsock = container_of(vq->dev, struct vhost_vsock, in vhost_vsock_handle_rx_kick() local
548 vhost_transport_do_send_pkt(vsock, vq); in vhost_vsock_handle_rx_kick()
551 static int vhost_vsock_start(struct vhost_vsock *vsock) in vhost_vsock_start() argument
557 mutex_lock(&vsock->dev.mutex); in vhost_vsock_start()
559 ret = vhost_dev_check_owner(&vsock->dev); in vhost_vsock_start()
563 for (i = 0; i < ARRAY_SIZE(vsock->vqs); i++) { in vhost_vsock_start()
564 vq = &vsock->vqs[i]; in vhost_vsock_start()
574 vhost_vq_set_backend(vq, vsock); in vhost_vsock_start()
586 vhost_vq_work_queue(&vsock->vqs[VSOCK_VQ_RX], &vsock->send_pkt_work); in vhost_vsock_start()
588 mutex_unlock(&vsock->dev.mutex); in vhost_vsock_start()
595 for (i = 0; i < ARRAY_SIZE(vsock->vqs); i++) { in vhost_vsock_start()
596 vq = &vsock->vqs[i]; in vhost_vsock_start()
603 mutex_unlock(&vsock->dev.mutex); in vhost_vsock_start()
607 static int vhost_vsock_stop(struct vhost_vsock *vsock, bool check_owner) in vhost_vsock_stop() argument
612 mutex_lock(&vsock->dev.mutex); in vhost_vsock_stop()
615 ret = vhost_dev_check_owner(&vsock->dev); in vhost_vsock_stop()
620 for (i = 0; i < ARRAY_SIZE(vsock->vqs); i++) { in vhost_vsock_stop()
621 struct vhost_virtqueue *vq = &vsock->vqs[i]; in vhost_vsock_stop()
629 mutex_unlock(&vsock->dev.mutex); in vhost_vsock_stop()
633 static void vhost_vsock_free(struct vhost_vsock *vsock) in vhost_vsock_free() argument
635 kvfree(vsock); in vhost_vsock_free()
641 struct vhost_vsock *vsock; in vhost_vsock_dev_open() local
647 vsock = kvmalloc(sizeof(*vsock), GFP_KERNEL | __GFP_RETRY_MAYFAIL); in vhost_vsock_dev_open()
648 if (!vsock) in vhost_vsock_dev_open()
651 vqs = kmalloc_array(ARRAY_SIZE(vsock->vqs), sizeof(*vqs), GFP_KERNEL); in vhost_vsock_dev_open()
657 vsock->guest_cid = 0; /* no CID assigned yet */ in vhost_vsock_dev_open()
659 atomic_set(&vsock->queued_replies, 0); in vhost_vsock_dev_open()
661 vqs[VSOCK_VQ_TX] = &vsock->vqs[VSOCK_VQ_TX]; in vhost_vsock_dev_open()
662 vqs[VSOCK_VQ_RX] = &vsock->vqs[VSOCK_VQ_RX]; in vhost_vsock_dev_open()
663 vsock->vqs[VSOCK_VQ_TX].handle_kick = vhost_vsock_handle_tx_kick; in vhost_vsock_dev_open()
664 vsock->vqs[VSOCK_VQ_RX].handle_kick = vhost_vsock_handle_rx_kick; in vhost_vsock_dev_open()
666 vhost_dev_init(&vsock->dev, vqs, ARRAY_SIZE(vsock->vqs), in vhost_vsock_dev_open()
670 file->private_data = vsock; in vhost_vsock_dev_open()
671 skb_queue_head_init(&vsock->send_pkt_queue); in vhost_vsock_dev_open()
672 vhost_work_init(&vsock->send_pkt_work, vhost_transport_send_pkt_work); in vhost_vsock_dev_open()
676 vhost_vsock_free(vsock); in vhost_vsock_dev_open()
680 static void vhost_vsock_flush(struct vhost_vsock *vsock) in vhost_vsock_flush() argument
682 vhost_dev_flush(&vsock->dev); in vhost_vsock_flush()
713 struct vhost_vsock *vsock = file->private_data; in vhost_vsock_dev_release() local
716 if (vsock->guest_cid) in vhost_vsock_dev_release()
717 hash_del_rcu(&vsock->hash); in vhost_vsock_dev_release()
733 vhost_vsock_stop(vsock, false); in vhost_vsock_dev_release()
734 vhost_vsock_flush(vsock); in vhost_vsock_dev_release()
735 vhost_dev_stop(&vsock->dev); in vhost_vsock_dev_release()
737 virtio_vsock_skb_queue_purge(&vsock->send_pkt_queue); in vhost_vsock_dev_release()
739 vhost_dev_cleanup(&vsock->dev); in vhost_vsock_dev_release()
740 kfree(vsock->dev.vqs); in vhost_vsock_dev_release()
741 vhost_vsock_free(vsock); in vhost_vsock_dev_release()
745 static int vhost_vsock_set_cid(struct vhost_vsock *vsock, u64 guest_cid) in vhost_vsock_set_cid() argument
767 if (other && other != vsock) { in vhost_vsock_set_cid()
772 if (vsock->guest_cid) in vhost_vsock_set_cid()
773 hash_del_rcu(&vsock->hash); in vhost_vsock_set_cid()
775 vsock->guest_cid = guest_cid; in vhost_vsock_set_cid()
776 hash_add_rcu(vhost_vsock_hash, &vsock->hash, vsock->guest_cid); in vhost_vsock_set_cid()
782 static int vhost_vsock_set_features(struct vhost_vsock *vsock, u64 features) in vhost_vsock_set_features() argument
790 mutex_lock(&vsock->dev.mutex); in vhost_vsock_set_features()
792 !vhost_log_access_ok(&vsock->dev)) { in vhost_vsock_set_features()
797 if (vhost_init_device_iotlb(&vsock->dev)) in vhost_vsock_set_features()
802 vsock->seqpacket_allow = true; in vhost_vsock_set_features()
804 for (i = 0; i < ARRAY_SIZE(vsock->vqs); i++) { in vhost_vsock_set_features()
805 vq = &vsock->vqs[i]; in vhost_vsock_set_features()
810 mutex_unlock(&vsock->dev.mutex); in vhost_vsock_set_features()
814 mutex_unlock(&vsock->dev.mutex); in vhost_vsock_set_features()
821 struct vhost_vsock *vsock = f->private_data; in vhost_vsock_dev_ioctl() local
832 return vhost_vsock_set_cid(vsock, guest_cid); in vhost_vsock_dev_ioctl()
837 return vhost_vsock_start(vsock); in vhost_vsock_dev_ioctl()
839 return vhost_vsock_stop(vsock, true); in vhost_vsock_dev_ioctl()
848 return vhost_vsock_set_features(vsock, features); in vhost_vsock_dev_ioctl()
859 vhost_set_backend_features(&vsock->dev, features); in vhost_vsock_dev_ioctl()
862 mutex_lock(&vsock->dev.mutex); in vhost_vsock_dev_ioctl()
863 r = vhost_dev_ioctl(&vsock->dev, ioctl, argp); in vhost_vsock_dev_ioctl()
865 r = vhost_vring_ioctl(&vsock->dev, ioctl, argp); in vhost_vsock_dev_ioctl()
867 vhost_vsock_flush(vsock); in vhost_vsock_dev_ioctl()
868 mutex_unlock(&vsock->dev.mutex); in vhost_vsock_dev_ioctl()
876 struct vhost_vsock *vsock = file->private_data; in vhost_vsock_chr_read_iter() local
877 struct vhost_dev *dev = &vsock->dev; in vhost_vsock_chr_read_iter()
887 struct vhost_vsock *vsock = file->private_data; in vhost_vsock_chr_write_iter() local
888 struct vhost_dev *dev = &vsock->dev; in vhost_vsock_chr_write_iter()
895 struct vhost_vsock *vsock = file->private_data; in vhost_vsock_chr_poll() local
896 struct vhost_dev *dev = &vsock->dev; in vhost_vsock_chr_poll()