Lines Matching refs:vq
170 struct vhost_virtqueue vq; member
251 struct vhost_virtqueue *vq; in vhost_scsi_init_inflight() local
255 vq = &vs->vqs[i].vq; in vhost_scsi_init_inflight()
257 mutex_lock(&vq->mutex); in vhost_scsi_init_inflight()
270 mutex_unlock(&vq->mutex); in vhost_scsi_init_inflight()
275 vhost_scsi_get_inflight(struct vhost_virtqueue *vq) in vhost_scsi_get_inflight() argument
280 svq = container_of(vq, struct vhost_scsi_virtqueue, vq); in vhost_scsi_get_inflight()
336 struct vhost_scsi_virtqueue, vq); in vhost_scsi_release_cmd_res()
439 struct vhost_virtqueue *vq = &vs->vqs[VHOST_SCSI_VQ_EVT].vq; in vhost_scsi_allocate_evt() local
449 vq_err(vq, "Failed to allocate vhost_scsi_evt\n"); in vhost_scsi_allocate_evt()
454 evt->event.event = cpu_to_vhost32(vq, event); in vhost_scsi_allocate_evt()
455 evt->event.reason = cpu_to_vhost32(vq, reason); in vhost_scsi_allocate_evt()
469 struct vhost_virtqueue *vq = &vs->vqs[VHOST_SCSI_VQ_EVT].vq; in vhost_scsi_do_evt_work() local
475 if (!vhost_vq_get_backend(vq)) { in vhost_scsi_do_evt_work()
481 vhost_disable_notify(&vs->dev, vq); in vhost_scsi_do_evt_work()
482 head = vhost_get_vq_desc(vq, vq->iov, in vhost_scsi_do_evt_work()
483 ARRAY_SIZE(vq->iov), &out, &in, in vhost_scsi_do_evt_work()
489 if (head == vq->num) { in vhost_scsi_do_evt_work()
490 if (vhost_enable_notify(&vs->dev, vq)) in vhost_scsi_do_evt_work()
496 if ((vq->iov[out].iov_len != sizeof(struct virtio_scsi_event))) { in vhost_scsi_do_evt_work()
497 vq_err(vq, "Expecting virtio_scsi_event, got %zu bytes\n", in vhost_scsi_do_evt_work()
498 vq->iov[out].iov_len); in vhost_scsi_do_evt_work()
504 event->event |= cpu_to_vhost32(vq, VIRTIO_SCSI_T_EVENTS_MISSED); in vhost_scsi_do_evt_work()
508 eventp = vq->iov[out].iov_base; in vhost_scsi_do_evt_work()
511 vhost_add_used_and_signal(&vs->dev, vq, head, 0); in vhost_scsi_do_evt_work()
513 vq_err(vq, "Faulted on vhost_scsi_send_event\n"); in vhost_scsi_do_evt_work()
520 struct vhost_virtqueue *vq = &vs->vqs[VHOST_SCSI_VQ_EVT].vq; in vhost_scsi_evt_work() local
524 mutex_lock(&vq->mutex); in vhost_scsi_evt_work()
530 mutex_unlock(&vq->mutex); in vhost_scsi_evt_work()
547 int ret, vq; in vhost_scsi_complete_cmd_work() local
572 q = container_of(cmd->tvc_vq, struct vhost_scsi_virtqueue, vq); in vhost_scsi_complete_cmd_work()
573 vq = q - vs->vqs; in vhost_scsi_complete_cmd_work()
574 __set_bit(vq, vs->compl_bitmap); in vhost_scsi_complete_cmd_work()
581 vq = -1; in vhost_scsi_complete_cmd_work()
582 while ((vq = find_next_bit(vs->compl_bitmap, vs->dev.nvqs, vq + 1)) in vhost_scsi_complete_cmd_work()
584 vhost_signal(&vs->dev, &vs->vqs[vq].vq); in vhost_scsi_complete_cmd_work()
588 vhost_scsi_get_cmd(struct vhost_virtqueue *vq, struct vhost_scsi_tpg *tpg, in vhost_scsi_get_cmd() argument
592 struct vhost_scsi_virtqueue *svq = container_of(vq, in vhost_scsi_get_cmd()
593 struct vhost_scsi_virtqueue, vq); in vhost_scsi_get_cmd()
629 cmd->inflight = vhost_scsi_get_inflight(vq); in vhost_scsi_get_cmd()
810 struct vhost_virtqueue *vq, in vhost_scsi_send_bad_target() argument
819 resp = vq->iov[out].iov_base; in vhost_scsi_send_bad_target()
822 vhost_add_used_and_signal(&vs->dev, vq, head, 0); in vhost_scsi_send_bad_target()
828 vhost_scsi_get_desc(struct vhost_scsi *vs, struct vhost_virtqueue *vq, in vhost_scsi_get_desc() argument
833 vc->head = vhost_get_vq_desc(vq, vq->iov, in vhost_scsi_get_desc()
834 ARRAY_SIZE(vq->iov), &vc->out, &vc->in, in vhost_scsi_get_desc()
845 if (vc->head == vq->num) { in vhost_scsi_get_desc()
846 if (unlikely(vhost_enable_notify(&vs->dev, vq))) { in vhost_scsi_get_desc()
847 vhost_disable_notify(&vs->dev, vq); in vhost_scsi_get_desc()
857 vc->out_size = iov_length(vq->iov, vc->out); in vhost_scsi_get_desc()
858 vc->in_size = iov_length(&vq->iov[vc->out], vc->in); in vhost_scsi_get_desc()
870 iov_iter_init(&vc->out_iter, ITER_SOURCE, vq->iov, vc->out, vc->out_size); in vhost_scsi_get_desc()
878 vhost_scsi_chk_size(struct vhost_virtqueue *vq, struct vhost_scsi_ctx *vc) in vhost_scsi_chk_size() argument
881 vq_err(vq, in vhost_scsi_chk_size()
886 vq_err(vq, in vhost_scsi_chk_size()
896 vhost_scsi_get_req(struct vhost_virtqueue *vq, struct vhost_scsi_ctx *vc, in vhost_scsi_get_req() argument
903 vq_err(vq, "Faulted on copy_from_iter_full\n"); in vhost_scsi_get_req()
906 vq_err(vq, "Illegal virtio-scsi lun: %u\n", *vc->lunp); in vhost_scsi_get_req()
910 vs_tpg = vhost_vq_get_backend(vq); /* validated at handler entry */ in vhost_scsi_get_req()
914 vq_err(vq, "Target 0x%x does not exist\n", *vc->target); in vhost_scsi_get_req()
931 vhost_scsi_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq) in vhost_scsi_handle_vq() argument
944 bool t10_pi = vhost_has_feature(vq, VIRTIO_SCSI_F_T10_PI); in vhost_scsi_handle_vq()
947 mutex_lock(&vq->mutex); in vhost_scsi_handle_vq()
952 vs_tpg = vhost_vq_get_backend(vq); in vhost_scsi_handle_vq()
959 vhost_disable_notify(&vs->dev, vq); in vhost_scsi_handle_vq()
962 ret = vhost_scsi_get_desc(vs, vq, &vc); in vhost_scsi_handle_vq()
987 ret = vhost_scsi_chk_size(vq, &vc); in vhost_scsi_handle_vq()
991 ret = vhost_scsi_get_req(vq, &vc, &tpg); in vhost_scsi_handle_vq()
1022 iov_iter_init(&in_iter, ITER_DEST, &vq->iov[vc.out], vc.in, in vhost_scsi_handle_vq()
1038 vq_err(vq, "Received non zero pi_bytesout," in vhost_scsi_handle_vq()
1042 prot_bytes = vhost32_to_cpu(vq, v_req_pi.pi_bytesout); in vhost_scsi_handle_vq()
1045 vq_err(vq, "Received non zero pi_bytesin," in vhost_scsi_handle_vq()
1049 prot_bytes = vhost32_to_cpu(vq, v_req_pi.pi_bytesin); in vhost_scsi_handle_vq()
1065 tag = vhost64_to_cpu(vq, v_req_pi.tag); in vhost_scsi_handle_vq()
1070 tag = vhost64_to_cpu(vq, v_req.tag); in vhost_scsi_handle_vq()
1083 vq_err(vq, "Received SCSI CDB with command_size: %d that" in vhost_scsi_handle_vq()
1088 cmd = vhost_scsi_get_cmd(vq, tpg, cdb, tag, lun, task_attr, in vhost_scsi_handle_vq()
1092 vq_err(vq, "vhost_scsi_get_cmd failed %ld\n", in vhost_scsi_handle_vq()
1097 cmd->tvc_vq = vq; in vhost_scsi_handle_vq()
1099 cmd->tvc_resp_iov[i] = vq->iov[vc.out + i]; in vhost_scsi_handle_vq()
1111 vq_err(vq, "Failed to map iov to sgl\n"); in vhost_scsi_handle_vq()
1134 vhost_scsi_send_bad_target(vs, vq, vc.head, vc.out); in vhost_scsi_handle_vq()
1135 } while (likely(!vhost_exceeds_weight(vq, ++c, 0))); in vhost_scsi_handle_vq()
1137 mutex_unlock(&vq->mutex); in vhost_scsi_handle_vq()
1141 vhost_scsi_send_tmf_resp(struct vhost_scsi *vs, struct vhost_virtqueue *vq, in vhost_scsi_send_tmf_resp() argument
1157 vhost_add_used_and_signal(&vs->dev, vq, vq_desc, 0); in vhost_scsi_send_tmf_resp()
1173 vhost_scsi_send_tmf_resp(tmf->vhost, &tmf->svq->vq, tmf->in_iovs, in vhost_scsi_tmf_resp_work()
1180 struct vhost_virtqueue *vq, in vhost_scsi_handle_tmf() argument
1184 struct vhost_scsi_virtqueue *svq = container_of(vq, in vhost_scsi_handle_tmf()
1185 struct vhost_scsi_virtqueue, vq); in vhost_scsi_handle_tmf()
1188 if (vhost32_to_cpu(vq, vtmf->subtype) != in vhost_scsi_handle_tmf()
1212 tmf->resp_iov = vq->iov[vc->out]; in vhost_scsi_handle_tmf()
1215 tmf->inflight = vhost_scsi_get_inflight(vq); in vhost_scsi_handle_tmf()
1228 vhost_scsi_send_tmf_resp(vs, vq, vc->in, vc->head, &vq->iov[vc->out], in vhost_scsi_handle_tmf()
1234 struct vhost_virtqueue *vq, in vhost_scsi_send_an_resp() argument
1245 iov_iter_init(&iov_iter, ITER_DEST, &vq->iov[vc->out], vc->in, sizeof(rsp)); in vhost_scsi_send_an_resp()
1249 vhost_add_used_and_signal(&vs->dev, vq, vc->head, 0); in vhost_scsi_send_an_resp()
1255 vhost_scsi_ctl_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq) in vhost_scsi_ctl_handle_vq() argument
1267 mutex_lock(&vq->mutex); in vhost_scsi_ctl_handle_vq()
1272 if (!vhost_vq_get_backend(vq)) in vhost_scsi_ctl_handle_vq()
1277 vhost_disable_notify(&vs->dev, vq); in vhost_scsi_ctl_handle_vq()
1280 ret = vhost_scsi_get_desc(vs, vq, &vc); in vhost_scsi_ctl_handle_vq()
1293 vq_err(vq, "Faulted on copy_from_iter tmf type\n"); in vhost_scsi_ctl_handle_vq()
1303 switch (vhost32_to_cpu(vq, v_req.type)) { in vhost_scsi_ctl_handle_vq()
1320 vq_err(vq, "Unknown control request %d", v_req.type); in vhost_scsi_ctl_handle_vq()
1329 ret = vhost_scsi_chk_size(vq, &vc); in vhost_scsi_ctl_handle_vq()
1339 ret = vhost_scsi_get_req(vq, &vc, &tpg); in vhost_scsi_ctl_handle_vq()
1344 vhost_scsi_handle_tmf(vs, tpg, vq, &v_req.tmf, &vc); in vhost_scsi_ctl_handle_vq()
1346 vhost_scsi_send_an_resp(vs, vq, &vc); in vhost_scsi_ctl_handle_vq()
1357 vhost_scsi_send_bad_target(vs, vq, vc.head, vc.out); in vhost_scsi_ctl_handle_vq()
1358 } while (likely(!vhost_exceeds_weight(vq, ++c, 0))); in vhost_scsi_ctl_handle_vq()
1360 mutex_unlock(&vq->mutex); in vhost_scsi_ctl_handle_vq()
1365 struct vhost_virtqueue *vq = container_of(work, struct vhost_virtqueue, in vhost_scsi_ctl_handle_kick() local
1367 struct vhost_scsi *vs = container_of(vq->dev, struct vhost_scsi, dev); in vhost_scsi_ctl_handle_kick()
1370 vhost_scsi_ctl_handle_vq(vs, vq); in vhost_scsi_ctl_handle_kick()
1405 struct vhost_virtqueue *vq = container_of(work, struct vhost_virtqueue, in vhost_scsi_evt_handle_kick() local
1407 struct vhost_scsi *vs = container_of(vq->dev, struct vhost_scsi, dev); in vhost_scsi_evt_handle_kick()
1409 mutex_lock(&vq->mutex); in vhost_scsi_evt_handle_kick()
1410 if (!vhost_vq_get_backend(vq)) in vhost_scsi_evt_handle_kick()
1416 mutex_unlock(&vq->mutex); in vhost_scsi_evt_handle_kick()
1421 struct vhost_virtqueue *vq = container_of(work, struct vhost_virtqueue, in vhost_scsi_handle_kick() local
1423 struct vhost_scsi *vs = container_of(vq->dev, struct vhost_scsi, dev); in vhost_scsi_handle_kick()
1425 vhost_scsi_handle_vq(vs, vq); in vhost_scsi_handle_kick()
1452 static void vhost_scsi_destroy_vq_cmds(struct vhost_virtqueue *vq) in vhost_scsi_destroy_vq_cmds() argument
1454 struct vhost_scsi_virtqueue *svq = container_of(vq, in vhost_scsi_destroy_vq_cmds()
1455 struct vhost_scsi_virtqueue, vq); in vhost_scsi_destroy_vq_cmds()
1476 static int vhost_scsi_setup_vq_cmds(struct vhost_virtqueue *vq, int max_cmds) in vhost_scsi_setup_vq_cmds() argument
1478 struct vhost_scsi_virtqueue *svq = container_of(vq, in vhost_scsi_setup_vq_cmds()
1479 struct vhost_scsi_virtqueue, vq); in vhost_scsi_setup_vq_cmds()
1534 vhost_scsi_destroy_vq_cmds(vq); in vhost_scsi_setup_vq_cmds()
1553 struct vhost_virtqueue *vq; in vhost_scsi_set_endpoint() local
1563 if (!vhost_vq_access_ok(&vs->vqs[index].vq)) { in vhost_scsi_set_endpoint()
1622 vq = &vs->vqs[i].vq; in vhost_scsi_set_endpoint()
1623 if (!vhost_vq_is_setup(vq)) in vhost_scsi_set_endpoint()
1626 ret = vhost_scsi_setup_vq_cmds(vq, vq->num); in vhost_scsi_set_endpoint()
1632 vq = &vs->vqs[i].vq; in vhost_scsi_set_endpoint()
1633 mutex_lock(&vq->mutex); in vhost_scsi_set_endpoint()
1634 vhost_vq_set_backend(vq, vs_tpg); in vhost_scsi_set_endpoint()
1635 vhost_vq_init_access(vq); in vhost_scsi_set_endpoint()
1636 mutex_unlock(&vq->mutex); in vhost_scsi_set_endpoint()
1654 if (!vhost_vq_get_backend(&vs->vqs[i].vq)) in vhost_scsi_set_endpoint()
1655 vhost_scsi_destroy_vq_cmds(&vs->vqs[i].vq); in vhost_scsi_set_endpoint()
1679 struct vhost_virtqueue *vq; in vhost_scsi_clear_endpoint() local
1688 if (!vhost_vq_access_ok(&vs->vqs[index].vq)) { in vhost_scsi_clear_endpoint()
1734 vq = &vs->vqs[i].vq; in vhost_scsi_clear_endpoint()
1735 mutex_lock(&vq->mutex); in vhost_scsi_clear_endpoint()
1736 vhost_vq_set_backend(vq, NULL); in vhost_scsi_clear_endpoint()
1737 mutex_unlock(&vq->mutex); in vhost_scsi_clear_endpoint()
1743 vq = &vs->vqs[i].vq; in vhost_scsi_clear_endpoint()
1744 vhost_scsi_destroy_vq_cmds(vq); in vhost_scsi_clear_endpoint()
1769 struct vhost_virtqueue *vq; in vhost_scsi_set_features() local
1783 vq = &vs->vqs[i].vq; in vhost_scsi_set_features()
1784 mutex_lock(&vq->mutex); in vhost_scsi_set_features()
1785 vq->acked_features = features; in vhost_scsi_set_features()
1786 mutex_unlock(&vq->mutex); in vhost_scsi_set_features()
1836 vqs[VHOST_SCSI_VQ_CTL] = &vs->vqs[VHOST_SCSI_VQ_CTL].vq; in vhost_scsi_open()
1837 vqs[VHOST_SCSI_VQ_EVT] = &vs->vqs[VHOST_SCSI_VQ_EVT].vq; in vhost_scsi_open()
1838 vs->vqs[VHOST_SCSI_VQ_CTL].vq.handle_kick = vhost_scsi_ctl_handle_kick; in vhost_scsi_open()
1839 vs->vqs[VHOST_SCSI_VQ_EVT].vq.handle_kick = vhost_scsi_evt_handle_kick; in vhost_scsi_open()
1841 vqs[i] = &vs->vqs[i].vq; in vhost_scsi_open()
1842 vs->vqs[i].vq.handle_kick = vhost_scsi_handle_kick; in vhost_scsi_open()
1896 struct vhost_virtqueue *vq = &vs->vqs[VHOST_SCSI_VQ_EVT].vq; in vhost_scsi_ioctl() local
1920 mutex_lock(&vq->mutex); in vhost_scsi_ioctl()
1922 mutex_unlock(&vq->mutex); in vhost_scsi_ioctl()
1925 mutex_lock(&vq->mutex); in vhost_scsi_ioctl()
1927 mutex_unlock(&vq->mutex); in vhost_scsi_ioctl()
1998 struct vhost_virtqueue *vq; in vhost_scsi_do_plug() local
2011 vq = &vs->vqs[VHOST_SCSI_VQ_EVT].vq; in vhost_scsi_do_plug()
2012 mutex_lock(&vq->mutex); in vhost_scsi_do_plug()
2013 if (vhost_has_feature(vq, VIRTIO_SCSI_F_HOTPLUG)) in vhost_scsi_do_plug()
2016 mutex_unlock(&vq->mutex); in vhost_scsi_do_plug()