Loading drivers/vhost/net.c +15 −13 Original line number Diff line number Diff line Loading @@ -424,7 +424,7 @@ static void vhost_net_disable_vq(struct vhost_net *n, struct vhost_net_virtqueue *nvq = container_of(vq, struct vhost_net_virtqueue, vq); struct vhost_poll *poll = n->poll + (nvq - n->vqs); if (!vq->private_data) if (!vhost_vq_get_backend(vq)) return; vhost_poll_stop(poll); } Loading @@ -437,7 +437,7 @@ static int vhost_net_enable_vq(struct vhost_net *n, struct vhost_poll *poll = n->poll + (nvq - n->vqs); struct socket *sock; sock = vq->private_data; sock = vhost_vq_get_backend(vq); if (!sock) return 0; Loading Loading @@ -524,7 +524,7 @@ static void vhost_net_busy_poll(struct vhost_net *net, return; vhost_disable_notify(&net->dev, vq); sock = rvq->private_data; sock = vhost_vq_get_backend(rvq); busyloop_timeout = poll_rx ? rvq->busyloop_timeout: tvq->busyloop_timeout; Loading Loading @@ -570,8 +570,10 @@ static int vhost_net_tx_get_vq_desc(struct vhost_net *net, if (r == tvq->num && tvq->busyloop_timeout) { /* Flush batched packets first */ if (!vhost_sock_zcopy(tvq->private_data)) vhost_tx_batch(net, tnvq, tvq->private_data, msghdr); if (!vhost_sock_zcopy(vhost_vq_get_backend(tvq))) vhost_tx_batch(net, tnvq, vhost_vq_get_backend(tvq), msghdr); vhost_net_busy_poll(net, rvq, tvq, busyloop_intr, false); Loading Loading @@ -685,7 +687,7 @@ static int vhost_net_build_xdp(struct vhost_net_virtqueue *nvq, struct vhost_virtqueue *vq = &nvq->vq; struct vhost_net *net = container_of(vq->dev, struct vhost_net, dev); struct socket *sock = vq->private_data; struct socket *sock = vhost_vq_get_backend(vq); struct page_frag *alloc_frag = &net->page_frag; struct virtio_net_hdr *gso; struct xdp_buff *xdp = &nvq->xdp[nvq->batched_xdp]; Loading Loading @@ -952,7 +954,7 @@ static void handle_tx(struct vhost_net *net) struct socket *sock; mutex_lock_nested(&vq->mutex, VHOST_NET_VQ_TX); sock = vq->private_data; sock = vhost_vq_get_backend(vq); if (!sock) goto out; Loading Loading @@ -1121,7 +1123,7 @@ static void handle_rx(struct vhost_net *net) int recv_pkts = 0; mutex_lock_nested(&vq->mutex, VHOST_NET_VQ_RX); sock = vq->private_data; sock = vhost_vq_get_backend(vq); if (!sock) goto out; Loading Loading @@ -1345,9 +1347,9 @@ static struct socket *vhost_net_stop_vq(struct vhost_net *n, container_of(vq, struct vhost_net_virtqueue, vq); mutex_lock(&vq->mutex); sock = vq->private_data; sock = vhost_vq_get_backend(vq); vhost_net_disable_vq(n, vq); vq->private_data = NULL; vhost_vq_set_backend(vq, NULL); vhost_net_buf_unproduce(nvq); nvq->rx_ring = NULL; mutex_unlock(&vq->mutex); Loading Loading @@ -1521,7 +1523,7 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd) } /* start polling new socket */ oldsock = vq->private_data; oldsock = vhost_vq_get_backend(vq); if (sock != oldsock) { ubufs = vhost_net_ubuf_alloc(vq, sock && vhost_sock_zcopy(sock)); Loading @@ -1531,7 +1533,7 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd) } vhost_net_disable_vq(n, vq); vq->private_data = sock; vhost_vq_set_backend(vq, sock); vhost_net_buf_unproduce(nvq); r = vhost_vq_init_access(vq); if (r) Loading Loading @@ -1568,7 +1570,7 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd) return 0; err_used: vq->private_data = oldsock; vhost_vq_set_backend(vq, oldsock); vhost_net_enable_vq(n, vq); if (ubufs) vhost_net_ubuf_put_wait_and_free(ubufs); Loading drivers/vhost/scsi.c +7 −7 Original line number Diff line number Diff line Loading @@ -452,7 +452,7 @@ vhost_scsi_do_evt_work(struct vhost_scsi *vs, struct vhost_scsi_evt *evt) unsigned out, in; int head, ret; if (!vq->private_data) { if (!vhost_vq_get_backend(vq)) { vs->vs_events_missed = true; return; } Loading Loading @@ -892,7 +892,7 @@ vhost_scsi_get_req(struct vhost_virtqueue *vq, struct vhost_scsi_ctx *vc, } else { struct vhost_scsi_tpg **vs_tpg, *tpg; vs_tpg = vq->private_data; /* validated at handler entry */ vs_tpg = vhost_vq_get_backend(vq); /* validated at handler entry */ tpg = READ_ONCE(vs_tpg[*vc->target]); if (unlikely(!tpg)) { Loading Loading @@ -929,7 +929,7 @@ vhost_scsi_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq) * We can handle the vq only after the endpoint is setup by calling the * VHOST_SCSI_SET_ENDPOINT ioctl. */ vs_tpg = vq->private_data; vs_tpg = vhost_vq_get_backend(vq); if (!vs_tpg) goto out; Loading Loading @@ -1184,7 +1184,7 @@ vhost_scsi_ctl_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq) * We can handle the vq only after the endpoint is setup by calling the * VHOST_SCSI_SET_ENDPOINT ioctl. */ if (!vq->private_data) if (!vhost_vq_get_backend(vq)) goto out; memset(&vc, 0, sizeof(vc)); Loading Loading @@ -1322,7 +1322,7 @@ static void vhost_scsi_evt_handle_kick(struct vhost_work *work) struct vhost_scsi *vs = container_of(vq->dev, struct vhost_scsi, dev); mutex_lock(&vq->mutex); if (!vq->private_data) if (!vhost_vq_get_backend(vq)) goto out; if (vs->vs_events_missed) Loading Loading @@ -1460,7 +1460,7 @@ vhost_scsi_set_endpoint(struct vhost_scsi *vs, for (i = 0; i < VHOST_SCSI_MAX_VQ; i++) { vq = &vs->vqs[i].vq; mutex_lock(&vq->mutex); vq->private_data = vs_tpg; vhost_vq_set_backend(vq, vs_tpg); vhost_vq_init_access(vq); mutex_unlock(&vq->mutex); } Loading Loading @@ -1547,7 +1547,7 @@ vhost_scsi_clear_endpoint(struct vhost_scsi *vs, for (i = 0; i < VHOST_SCSI_MAX_VQ; i++) { vq = &vs->vqs[i].vq; mutex_lock(&vq->mutex); vq->private_data = NULL; vhost_vq_set_backend(vq, NULL); mutex_unlock(&vq->mutex); } } Loading drivers/vhost/test.c +5 −5 Original line number Diff line number Diff line Loading @@ -49,7 +49,7 @@ static void handle_vq(struct vhost_test *n) void *private; mutex_lock(&vq->mutex); private = vq->private_data; private = vhost_vq_get_backend(vq); if (!private) { mutex_unlock(&vq->mutex); return; Loading Loading @@ -133,8 +133,8 @@ static void *vhost_test_stop_vq(struct vhost_test *n, void *private; mutex_lock(&vq->mutex); private = vq->private_data; vq->private_data = NULL; private = vhost_vq_get_backend(vq); vhost_vq_set_backend(vq, NULL); mutex_unlock(&vq->mutex); return private; } Loading Loading @@ -198,8 +198,8 @@ static long vhost_test_run(struct vhost_test *n, int test) priv = test ? n : NULL; /* start polling new socket */ oldpriv = vq->private_data; vq->private_data = priv; oldpriv = vhost_vq_get_backend(vq); vhost_vq_set_backend(vq, priv); r = vhost_vq_init_access(&n->vqs[index]); Loading drivers/vhost/vhost.h +27 −0 Original line number Diff line number Diff line Loading @@ -231,6 +231,33 @@ enum { (1ULL << VIRTIO_F_VERSION_1) }; /** * vhost_vq_set_backend - Set backend. * * @vq Virtqueue. * @private_data The private data. * * Context: Need to call with vq->mutex acquired. */ static inline void vhost_vq_set_backend(struct vhost_virtqueue *vq, void *private_data) { vq->private_data = private_data; } /** * vhost_vq_get_backend - Get backend. * * @vq Virtqueue. * * Context: Need to call with vq->mutex acquired. * Return: Private data previously set with vhost_vq_set_backend. */ static inline void *vhost_vq_get_backend(struct vhost_virtqueue *vq) { return vq->private_data; } static inline bool vhost_has_feature(struct vhost_virtqueue *vq, int bit) { return vq->acked_features & (1ULL << bit); Loading drivers/vhost/vsock.c +7 −7 Original line number Diff line number Diff line Loading @@ -91,7 +91,7 @@ vhost_transport_do_send_pkt(struct vhost_vsock *vsock, mutex_lock(&vq->mutex); if (!vq->private_data) if (!vhost_vq_get_backend(vq)) goto out; /* Avoid further vmexits, we're already processing the virtqueue */ Loading Loading @@ -440,7 +440,7 @@ static void vhost_vsock_handle_tx_kick(struct vhost_work *work) mutex_lock(&vq->mutex); if (!vq->private_data) if (!vhost_vq_get_backend(vq)) goto out; vhost_disable_notify(&vsock->dev, vq); Loading Loading @@ -533,8 +533,8 @@ static int vhost_vsock_start(struct vhost_vsock *vsock) goto err_vq; } if (!vq->private_data) { vq->private_data = vsock; if (!vhost_vq_get_backend(vq)) { vhost_vq_set_backend(vq, vsock); ret = vhost_vq_init_access(vq); if (ret) goto err_vq; Loading @@ -547,14 +547,14 @@ static int vhost_vsock_start(struct vhost_vsock *vsock) return 0; err_vq: vq->private_data = NULL; vhost_vq_set_backend(vq, NULL); mutex_unlock(&vq->mutex); for (i = 0; i < ARRAY_SIZE(vsock->vqs); i++) { vq = &vsock->vqs[i]; mutex_lock(&vq->mutex); vq->private_data = NULL; vhost_vq_set_backend(vq, NULL); mutex_unlock(&vq->mutex); } err: Loading @@ -577,7 +577,7 @@ static int vhost_vsock_stop(struct vhost_vsock *vsock) struct vhost_virtqueue *vq = &vsock->vqs[i]; mutex_lock(&vq->mutex); vq->private_data = NULL; vhost_vq_set_backend(vq, NULL); mutex_unlock(&vq->mutex); } Loading Loading
drivers/vhost/net.c +15 −13 Original line number Diff line number Diff line Loading @@ -424,7 +424,7 @@ static void vhost_net_disable_vq(struct vhost_net *n, struct vhost_net_virtqueue *nvq = container_of(vq, struct vhost_net_virtqueue, vq); struct vhost_poll *poll = n->poll + (nvq - n->vqs); if (!vq->private_data) if (!vhost_vq_get_backend(vq)) return; vhost_poll_stop(poll); } Loading @@ -437,7 +437,7 @@ static int vhost_net_enable_vq(struct vhost_net *n, struct vhost_poll *poll = n->poll + (nvq - n->vqs); struct socket *sock; sock = vq->private_data; sock = vhost_vq_get_backend(vq); if (!sock) return 0; Loading Loading @@ -524,7 +524,7 @@ static void vhost_net_busy_poll(struct vhost_net *net, return; vhost_disable_notify(&net->dev, vq); sock = rvq->private_data; sock = vhost_vq_get_backend(rvq); busyloop_timeout = poll_rx ? rvq->busyloop_timeout: tvq->busyloop_timeout; Loading Loading @@ -570,8 +570,10 @@ static int vhost_net_tx_get_vq_desc(struct vhost_net *net, if (r == tvq->num && tvq->busyloop_timeout) { /* Flush batched packets first */ if (!vhost_sock_zcopy(tvq->private_data)) vhost_tx_batch(net, tnvq, tvq->private_data, msghdr); if (!vhost_sock_zcopy(vhost_vq_get_backend(tvq))) vhost_tx_batch(net, tnvq, vhost_vq_get_backend(tvq), msghdr); vhost_net_busy_poll(net, rvq, tvq, busyloop_intr, false); Loading Loading @@ -685,7 +687,7 @@ static int vhost_net_build_xdp(struct vhost_net_virtqueue *nvq, struct vhost_virtqueue *vq = &nvq->vq; struct vhost_net *net = container_of(vq->dev, struct vhost_net, dev); struct socket *sock = vq->private_data; struct socket *sock = vhost_vq_get_backend(vq); struct page_frag *alloc_frag = &net->page_frag; struct virtio_net_hdr *gso; struct xdp_buff *xdp = &nvq->xdp[nvq->batched_xdp]; Loading Loading @@ -952,7 +954,7 @@ static void handle_tx(struct vhost_net *net) struct socket *sock; mutex_lock_nested(&vq->mutex, VHOST_NET_VQ_TX); sock = vq->private_data; sock = vhost_vq_get_backend(vq); if (!sock) goto out; Loading Loading @@ -1121,7 +1123,7 @@ static void handle_rx(struct vhost_net *net) int recv_pkts = 0; mutex_lock_nested(&vq->mutex, VHOST_NET_VQ_RX); sock = vq->private_data; sock = vhost_vq_get_backend(vq); if (!sock) goto out; Loading Loading @@ -1345,9 +1347,9 @@ static struct socket *vhost_net_stop_vq(struct vhost_net *n, container_of(vq, struct vhost_net_virtqueue, vq); mutex_lock(&vq->mutex); sock = vq->private_data; sock = vhost_vq_get_backend(vq); vhost_net_disable_vq(n, vq); vq->private_data = NULL; vhost_vq_set_backend(vq, NULL); vhost_net_buf_unproduce(nvq); nvq->rx_ring = NULL; mutex_unlock(&vq->mutex); Loading Loading @@ -1521,7 +1523,7 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd) } /* start polling new socket */ oldsock = vq->private_data; oldsock = vhost_vq_get_backend(vq); if (sock != oldsock) { ubufs = vhost_net_ubuf_alloc(vq, sock && vhost_sock_zcopy(sock)); Loading @@ -1531,7 +1533,7 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd) } vhost_net_disable_vq(n, vq); vq->private_data = sock; vhost_vq_set_backend(vq, sock); vhost_net_buf_unproduce(nvq); r = vhost_vq_init_access(vq); if (r) Loading Loading @@ -1568,7 +1570,7 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd) return 0; err_used: vq->private_data = oldsock; vhost_vq_set_backend(vq, oldsock); vhost_net_enable_vq(n, vq); if (ubufs) vhost_net_ubuf_put_wait_and_free(ubufs); Loading
drivers/vhost/scsi.c +7 −7 Original line number Diff line number Diff line Loading @@ -452,7 +452,7 @@ vhost_scsi_do_evt_work(struct vhost_scsi *vs, struct vhost_scsi_evt *evt) unsigned out, in; int head, ret; if (!vq->private_data) { if (!vhost_vq_get_backend(vq)) { vs->vs_events_missed = true; return; } Loading Loading @@ -892,7 +892,7 @@ vhost_scsi_get_req(struct vhost_virtqueue *vq, struct vhost_scsi_ctx *vc, } else { struct vhost_scsi_tpg **vs_tpg, *tpg; vs_tpg = vq->private_data; /* validated at handler entry */ vs_tpg = vhost_vq_get_backend(vq); /* validated at handler entry */ tpg = READ_ONCE(vs_tpg[*vc->target]); if (unlikely(!tpg)) { Loading Loading @@ -929,7 +929,7 @@ vhost_scsi_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq) * We can handle the vq only after the endpoint is setup by calling the * VHOST_SCSI_SET_ENDPOINT ioctl. */ vs_tpg = vq->private_data; vs_tpg = vhost_vq_get_backend(vq); if (!vs_tpg) goto out; Loading Loading @@ -1184,7 +1184,7 @@ vhost_scsi_ctl_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq) * We can handle the vq only after the endpoint is setup by calling the * VHOST_SCSI_SET_ENDPOINT ioctl. */ if (!vq->private_data) if (!vhost_vq_get_backend(vq)) goto out; memset(&vc, 0, sizeof(vc)); Loading Loading @@ -1322,7 +1322,7 @@ static void vhost_scsi_evt_handle_kick(struct vhost_work *work) struct vhost_scsi *vs = container_of(vq->dev, struct vhost_scsi, dev); mutex_lock(&vq->mutex); if (!vq->private_data) if (!vhost_vq_get_backend(vq)) goto out; if (vs->vs_events_missed) Loading Loading @@ -1460,7 +1460,7 @@ vhost_scsi_set_endpoint(struct vhost_scsi *vs, for (i = 0; i < VHOST_SCSI_MAX_VQ; i++) { vq = &vs->vqs[i].vq; mutex_lock(&vq->mutex); vq->private_data = vs_tpg; vhost_vq_set_backend(vq, vs_tpg); vhost_vq_init_access(vq); mutex_unlock(&vq->mutex); } Loading Loading @@ -1547,7 +1547,7 @@ vhost_scsi_clear_endpoint(struct vhost_scsi *vs, for (i = 0; i < VHOST_SCSI_MAX_VQ; i++) { vq = &vs->vqs[i].vq; mutex_lock(&vq->mutex); vq->private_data = NULL; vhost_vq_set_backend(vq, NULL); mutex_unlock(&vq->mutex); } } Loading
drivers/vhost/test.c +5 −5 Original line number Diff line number Diff line Loading @@ -49,7 +49,7 @@ static void handle_vq(struct vhost_test *n) void *private; mutex_lock(&vq->mutex); private = vq->private_data; private = vhost_vq_get_backend(vq); if (!private) { mutex_unlock(&vq->mutex); return; Loading Loading @@ -133,8 +133,8 @@ static void *vhost_test_stop_vq(struct vhost_test *n, void *private; mutex_lock(&vq->mutex); private = vq->private_data; vq->private_data = NULL; private = vhost_vq_get_backend(vq); vhost_vq_set_backend(vq, NULL); mutex_unlock(&vq->mutex); return private; } Loading Loading @@ -198,8 +198,8 @@ static long vhost_test_run(struct vhost_test *n, int test) priv = test ? n : NULL; /* start polling new socket */ oldpriv = vq->private_data; vq->private_data = priv; oldpriv = vhost_vq_get_backend(vq); vhost_vq_set_backend(vq, priv); r = vhost_vq_init_access(&n->vqs[index]); Loading
drivers/vhost/vhost.h +27 −0 Original line number Diff line number Diff line Loading @@ -231,6 +231,33 @@ enum { (1ULL << VIRTIO_F_VERSION_1) }; /** * vhost_vq_set_backend - Set backend. * * @vq Virtqueue. * @private_data The private data. * * Context: Need to call with vq->mutex acquired. */ static inline void vhost_vq_set_backend(struct vhost_virtqueue *vq, void *private_data) { vq->private_data = private_data; } /** * vhost_vq_get_backend - Get backend. * * @vq Virtqueue. * * Context: Need to call with vq->mutex acquired. * Return: Private data previously set with vhost_vq_set_backend. */ static inline void *vhost_vq_get_backend(struct vhost_virtqueue *vq) { return vq->private_data; } static inline bool vhost_has_feature(struct vhost_virtqueue *vq, int bit) { return vq->acked_features & (1ULL << bit); Loading
drivers/vhost/vsock.c +7 −7 Original line number Diff line number Diff line Loading @@ -91,7 +91,7 @@ vhost_transport_do_send_pkt(struct vhost_vsock *vsock, mutex_lock(&vq->mutex); if (!vq->private_data) if (!vhost_vq_get_backend(vq)) goto out; /* Avoid further vmexits, we're already processing the virtqueue */ Loading Loading @@ -440,7 +440,7 @@ static void vhost_vsock_handle_tx_kick(struct vhost_work *work) mutex_lock(&vq->mutex); if (!vq->private_data) if (!vhost_vq_get_backend(vq)) goto out; vhost_disable_notify(&vsock->dev, vq); Loading Loading @@ -533,8 +533,8 @@ static int vhost_vsock_start(struct vhost_vsock *vsock) goto err_vq; } if (!vq->private_data) { vq->private_data = vsock; if (!vhost_vq_get_backend(vq)) { vhost_vq_set_backend(vq, vsock); ret = vhost_vq_init_access(vq); if (ret) goto err_vq; Loading @@ -547,14 +547,14 @@ static int vhost_vsock_start(struct vhost_vsock *vsock) return 0; err_vq: vq->private_data = NULL; vhost_vq_set_backend(vq, NULL); mutex_unlock(&vq->mutex); for (i = 0; i < ARRAY_SIZE(vsock->vqs); i++) { vq = &vsock->vqs[i]; mutex_lock(&vq->mutex); vq->private_data = NULL; vhost_vq_set_backend(vq, NULL); mutex_unlock(&vq->mutex); } err: Loading @@ -577,7 +577,7 @@ static int vhost_vsock_stop(struct vhost_vsock *vsock) struct vhost_virtqueue *vq = &vsock->vqs[i]; mutex_lock(&vq->mutex); vq->private_data = NULL; vhost_vq_set_backend(vq, NULL); mutex_unlock(&vq->mutex); } Loading