Lines Matching full:vs

210 	struct vhost_scsi *vs;  member
291 static void vhost_scsi_init_inflight(struct vhost_scsi *vs, in vhost_scsi_init_inflight() argument
298 for (i = 0; i < vs->dev.nvqs; i++) { in vhost_scsi_init_inflight()
299 vq = &vs->vqs[i].vq; in vhost_scsi_init_inflight()
304 idx = vs->vqs[i].inflight_idx; in vhost_scsi_init_inflight()
306 old_inflight[i] = &vs->vqs[i].inflights[idx]; in vhost_scsi_init_inflight()
309 vs->vqs[i].inflight_idx = idx ^ 1; in vhost_scsi_init_inflight()
310 new_inflight = &vs->vqs[i].inflights[idx ^ 1]; in vhost_scsi_init_inflight()
371 struct vhost_scsi *vs = svq->vs; in vhost_scsi_release_cmd_res() local
390 sg_free_table_chained(&tv_cmd->table, vs->inline_sg_cnt); in vhost_scsi_release_cmd_res()
398 sg_free_table_chained(&tv_cmd->prot_table, vs->inline_sg_cnt); in vhost_scsi_release_cmd_res()
477 static void vhost_scsi_free_evt(struct vhost_scsi *vs, struct vhost_scsi_evt *evt) in vhost_scsi_free_evt() argument
479 vs->vs_events_nr--; in vhost_scsi_free_evt()
484 vhost_scsi_allocate_evt(struct vhost_scsi *vs, in vhost_scsi_allocate_evt() argument
487 struct vhost_virtqueue *vq = &vs->vqs[VHOST_SCSI_VQ_EVT].vq; in vhost_scsi_allocate_evt()
490 if (vs->vs_events_nr > VHOST_SCSI_MAX_EVENT) { in vhost_scsi_allocate_evt()
491 vs->vs_events_missed = true; in vhost_scsi_allocate_evt()
498 vs->vs_events_missed = true; in vhost_scsi_allocate_evt()
504 vs->vs_events_nr++; in vhost_scsi_allocate_evt()
515 vhost_scsi_do_evt_work(struct vhost_scsi *vs, struct vhost_scsi_evt *evt) in vhost_scsi_do_evt_work() argument
517 struct vhost_virtqueue *vq = &vs->vqs[VHOST_SCSI_VQ_EVT].vq; in vhost_scsi_do_evt_work()
524 vs->vs_events_missed = true; in vhost_scsi_do_evt_work()
529 vhost_disable_notify(&vs->dev, vq); in vhost_scsi_do_evt_work()
534 vs->vs_events_missed = true; in vhost_scsi_do_evt_work()
538 if (vhost_enable_notify(&vs->dev, vq)) in vhost_scsi_do_evt_work()
540 vs->vs_events_missed = true; in vhost_scsi_do_evt_work()
547 vs->vs_events_missed = true; in vhost_scsi_do_evt_work()
551 if (vs->vs_events_missed) { in vhost_scsi_do_evt_work()
553 vs->vs_events_missed = false; in vhost_scsi_do_evt_work()
559 vhost_add_used_and_signal(&vs->dev, vq, head, 0); in vhost_scsi_do_evt_work()
564 static void vhost_scsi_complete_events(struct vhost_scsi *vs, bool drop) in vhost_scsi_complete_events() argument
566 struct vhost_virtqueue *vq = &vs->vqs[VHOST_SCSI_VQ_EVT].vq; in vhost_scsi_complete_events()
571 llnode = llist_del_all(&vs->vs_event_list); in vhost_scsi_complete_events()
574 vhost_scsi_do_evt_work(vs, evt); in vhost_scsi_complete_events()
575 vhost_scsi_free_evt(vs, evt); in vhost_scsi_complete_events()
582 struct vhost_scsi *vs = container_of(work, struct vhost_scsi, in vhost_scsi_evt_work() local
584 vhost_scsi_complete_events(vs, false); in vhost_scsi_evt_work()
669 vhost_signal(&svq->vs->dev, &svq->vq); in vhost_scsi_complete_cmd_work()
891 vhost_scsi_mapal(struct vhost_scsi *vs, struct vhost_scsi_cmd *cmd, in vhost_scsi_mapal() argument
903 vs->inline_sg_cnt); in vhost_scsi_mapal()
916 vs->inline_sg_cnt); in vhost_scsi_mapal()
928 vs->inline_sg_cnt); in vhost_scsi_mapal()
942 sg_free_table_chained(&cmd->table, vs->inline_sg_cnt); in vhost_scsi_mapal()
1001 vhost_scsi_send_status(struct vhost_scsi *vs, struct vhost_virtqueue *vq, in vhost_scsi_send_status() argument
1017 vhost_add_used_and_signal(&vs->dev, vq, vc->head, 0); in vhost_scsi_send_status()
1027 vhost_scsi_send_bad_target(struct vhost_scsi *vs, in vhost_scsi_send_bad_target() argument
1059 vhost_add_used_and_signal(&vs->dev, vq, vc->head, 0); in vhost_scsi_send_bad_target()
1065 vhost_scsi_get_desc(struct vhost_scsi *vs, struct vhost_virtqueue *vq, in vhost_scsi_get_desc() argument
1083 if (unlikely(vhost_enable_notify(&vs->dev, vq))) { in vhost_scsi_get_desc()
1084 vhost_disable_notify(&vs->dev, vq); in vhost_scsi_get_desc()
1208 vhost_scsi_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq) in vhost_scsi_handle_vq() argument
1237 vhost_disable_notify(&vs->dev, vq); in vhost_scsi_handle_vq()
1240 ret = vhost_scsi_get_desc(vs, vq, &vc); in vhost_scsi_handle_vq()
1277 * iovec sizes + incoming iovec sizes vs. virtio-scsi request + in vhost_scsi_handle_vq()
1395 ret = vhost_scsi_mapal(vs, cmd, prot_bytes, &prot_iter, in vhost_scsi_handle_vq()
1425 vhost_scsi_send_bad_target(vs, vq, &vc, TYPE_IO_CMD); in vhost_scsi_handle_vq()
1427 vhost_scsi_send_status(vs, vq, &vc, in vhost_scsi_handle_vq()
1435 vhost_scsi_send_tmf_resp(struct vhost_scsi *vs, struct vhost_virtqueue *vq, in vhost_scsi_send_tmf_resp() argument
1451 vhost_add_used_and_signal(&vs->dev, vq, vq_desc, 0); in vhost_scsi_send_tmf_resp()
1490 vhost_scsi_handle_tmf(struct vhost_scsi *vs, struct vhost_scsi_tpg *tpg, in vhost_scsi_handle_tmf() argument
1514 tmf->vhost = vs; in vhost_scsi_handle_tmf()
1532 vhost_scsi_send_tmf_resp(vs, vq, vc->in, vc->head, &vq->iov[vc->out], in vhost_scsi_handle_tmf()
1537 vhost_scsi_send_an_resp(struct vhost_scsi *vs, in vhost_scsi_send_an_resp() argument
1553 vhost_add_used_and_signal(&vs->dev, vq, vc->head, 0); in vhost_scsi_send_an_resp()
1559 vhost_scsi_ctl_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq) in vhost_scsi_ctl_handle_vq() argument
1581 vhost_disable_notify(&vs->dev, vq); in vhost_scsi_ctl_handle_vq()
1584 ret = vhost_scsi_get_desc(vs, vq, &vc); in vhost_scsi_ctl_handle_vq()
1648 vhost_scsi_handle_tmf(vs, tpg, vq, &v_req.tmf, &vc); in vhost_scsi_ctl_handle_vq()
1650 vhost_scsi_send_an_resp(vs, vq, &vc); in vhost_scsi_ctl_handle_vq()
1661 vhost_scsi_send_bad_target(vs, vq, &vc, in vhost_scsi_ctl_handle_vq()
1674 struct vhost_scsi *vs = container_of(vq->dev, struct vhost_scsi, dev); in vhost_scsi_ctl_handle_kick() local
1677 vhost_scsi_ctl_handle_vq(vs, vq); in vhost_scsi_ctl_handle_kick()
1681 vhost_scsi_send_evt(struct vhost_scsi *vs, struct vhost_virtqueue *vq, in vhost_scsi_send_evt() argument
1687 evt = vhost_scsi_allocate_evt(vs, event, reason); in vhost_scsi_send_evt()
1704 llist_add(&evt->list, &vs->vs_event_list); in vhost_scsi_send_evt()
1705 if (!vhost_vq_work_queue(vq, &vs->vs_event_work)) in vhost_scsi_send_evt()
1706 vhost_scsi_complete_events(vs, true); in vhost_scsi_send_evt()
1713 struct vhost_scsi *vs = container_of(vq->dev, struct vhost_scsi, dev); in vhost_scsi_evt_handle_kick() local
1719 if (vs->vs_events_missed) in vhost_scsi_evt_handle_kick()
1720 vhost_scsi_send_evt(vs, vq, NULL, NULL, VIRTIO_SCSI_T_NO_EVENT, in vhost_scsi_evt_handle_kick()
1730 struct vhost_scsi *vs = container_of(vq->dev, struct vhost_scsi, dev); in vhost_scsi_handle_kick() local
1732 vhost_scsi_handle_vq(vs, vq); in vhost_scsi_handle_kick()
1736 static void vhost_scsi_flush(struct vhost_scsi *vs) in vhost_scsi_flush() argument
1741 vhost_scsi_init_inflight(vs, vs->old_inflight); in vhost_scsi_flush()
1748 for (i = 0; i < vs->dev.nvqs; i++) in vhost_scsi_flush()
1749 kref_put(&vs->old_inflight[i]->kref, vhost_scsi_done_inflight); in vhost_scsi_flush()
1752 vhost_dev_flush(&vs->dev); in vhost_scsi_flush()
1755 for (i = 0; i < vs->dev.nvqs; i++) in vhost_scsi_flush()
1756 wait_for_completion(&vs->old_inflight[i]->comp); in vhost_scsi_flush()
1786 struct vhost_scsi *vs = svq->vs; in vhost_scsi_setup_vq_cmds() local
1812 if (vs->inline_sg_cnt) { in vhost_scsi_setup_vq_cmds()
1813 tv_cmd->sgl = kcalloc(vs->inline_sg_cnt, in vhost_scsi_setup_vq_cmds()
1823 vs->inline_sg_cnt) { in vhost_scsi_setup_vq_cmds()
1824 tv_cmd->prot_sgl = kcalloc(vs->inline_sg_cnt, in vhost_scsi_setup_vq_cmds()
1844 * vs->dev.mutex -> vhost_scsi_mutex -> tpg->tv_tpg_mutex -> vq->mutex
1847 vhost_scsi_set_endpoint(struct vhost_scsi *vs, in vhost_scsi_set_endpoint() argument
1858 mutex_lock(&vs->dev.mutex); in vhost_scsi_set_endpoint()
1861 for (index = 0; index < vs->dev.nvqs; ++index) { in vhost_scsi_set_endpoint()
1863 if (!vhost_vq_access_ok(&vs->vqs[index].vq)) { in vhost_scsi_set_endpoint()
1869 if (vs->vs_tpg) { in vhost_scsi_set_endpoint()
1871 vs->vs_vhost_wwpn); in vhost_scsi_set_endpoint()
1912 tpg->vhost_scsi = vs; in vhost_scsi_set_endpoint()
1921 memcpy(vs->vs_vhost_wwpn, t->vhost_wwpn, in vhost_scsi_set_endpoint()
1922 sizeof(vs->vs_vhost_wwpn)); in vhost_scsi_set_endpoint()
1924 for (i = VHOST_SCSI_VQ_IO; i < vs->dev.nvqs; i++) { in vhost_scsi_set_endpoint()
1925 vq = &vs->vqs[i].vq; in vhost_scsi_set_endpoint()
1934 for (i = 0; i < vs->dev.nvqs; i++) { in vhost_scsi_set_endpoint()
1935 vq = &vs->vqs[i].vq; in vhost_scsi_set_endpoint()
1951 vhost_scsi_flush(vs); in vhost_scsi_set_endpoint()
1952 vs->vs_tpg = vs_tpg; in vhost_scsi_set_endpoint()
1957 if (!vhost_vq_get_backend(&vs->vqs[i].vq)) in vhost_scsi_set_endpoint()
1958 vhost_scsi_destroy_vq_cmds(&vs->vqs[i].vq); in vhost_scsi_set_endpoint()
1974 mutex_unlock(&vs->dev.mutex); in vhost_scsi_set_endpoint()
1979 vhost_scsi_clear_endpoint(struct vhost_scsi *vs, in vhost_scsi_clear_endpoint() argument
1990 mutex_lock(&vs->dev.mutex); in vhost_scsi_clear_endpoint()
1992 for (index = 0; index < vs->dev.nvqs; ++index) { in vhost_scsi_clear_endpoint()
1993 if (!vhost_vq_access_ok(&vs->vqs[index].vq)) { in vhost_scsi_clear_endpoint()
1999 if (!vs->vs_tpg) { in vhost_scsi_clear_endpoint()
2006 tpg = vs->vs_tpg[target]; in vhost_scsi_clear_endpoint()
2030 for (i = 0; i < vs->dev.nvqs; i++) { in vhost_scsi_clear_endpoint()
2031 vq = &vs->vqs[i].vq; in vhost_scsi_clear_endpoint()
2037 vhost_scsi_flush(vs); in vhost_scsi_clear_endpoint()
2039 for (i = 0; i < vs->dev.nvqs; i++) { in vhost_scsi_clear_endpoint()
2040 vq = &vs->vqs[i].vq; in vhost_scsi_clear_endpoint()
2050 tpg = vs->vs_tpg[target]; in vhost_scsi_clear_endpoint()
2058 vs->vs_tpg[target] = NULL; in vhost_scsi_clear_endpoint()
2069 * old vs->vs_tpg is finished. in vhost_scsi_clear_endpoint()
2071 vhost_scsi_flush(vs); in vhost_scsi_clear_endpoint()
2072 kfree(vs->vs_tpg); in vhost_scsi_clear_endpoint()
2073 vs->vs_tpg = NULL; in vhost_scsi_clear_endpoint()
2074 memset(vs->vs_vhost_wwpn, 0, sizeof(vs->vs_vhost_wwpn)); in vhost_scsi_clear_endpoint()
2075 WARN_ON(vs->vs_events_nr); in vhost_scsi_clear_endpoint()
2076 mutex_unlock(&vs->dev.mutex); in vhost_scsi_clear_endpoint()
2080 mutex_unlock(&vs->dev.mutex); in vhost_scsi_clear_endpoint()
2084 static int vhost_scsi_set_features(struct vhost_scsi *vs, u64 features) in vhost_scsi_set_features() argument
2092 mutex_lock(&vs->dev.mutex); in vhost_scsi_set_features()
2094 !vhost_log_access_ok(&vs->dev)) { in vhost_scsi_set_features()
2095 mutex_unlock(&vs->dev.mutex); in vhost_scsi_set_features()
2099 for (i = 0; i < vs->dev.nvqs; i++) { in vhost_scsi_set_features()
2100 vq = &vs->vqs[i].vq; in vhost_scsi_set_features()
2105 mutex_unlock(&vs->dev.mutex); in vhost_scsi_set_features()
2112 struct vhost_scsi *vs; in vhost_scsi_open() local
2116 vs = kvzalloc(sizeof(*vs), GFP_KERNEL); in vhost_scsi_open()
2117 if (!vs) in vhost_scsi_open()
2119 vs->inline_sg_cnt = vhost_scsi_inline_sg_cnt; in vhost_scsi_open()
2131 vs->old_inflight = kmalloc_array(nvqs, sizeof(*vs->old_inflight), in vhost_scsi_open()
2133 if (!vs->old_inflight) in vhost_scsi_open()
2136 vs->vqs = kmalloc_array(nvqs, sizeof(*vs->vqs), in vhost_scsi_open()
2138 if (!vs->vqs) in vhost_scsi_open()
2145 vhost_work_init(&vs->vs_event_work, vhost_scsi_evt_work); in vhost_scsi_open()
2147 vs->vs_events_nr = 0; in vhost_scsi_open()
2148 vs->vs_events_missed = false; in vhost_scsi_open()
2150 vqs[VHOST_SCSI_VQ_CTL] = &vs->vqs[VHOST_SCSI_VQ_CTL].vq; in vhost_scsi_open()
2151 vqs[VHOST_SCSI_VQ_EVT] = &vs->vqs[VHOST_SCSI_VQ_EVT].vq; in vhost_scsi_open()
2152 vs->vqs[VHOST_SCSI_VQ_CTL].vq.handle_kick = vhost_scsi_ctl_handle_kick; in vhost_scsi_open()
2153 vs->vqs[VHOST_SCSI_VQ_EVT].vq.handle_kick = vhost_scsi_evt_handle_kick; in vhost_scsi_open()
2155 svq = &vs->vqs[i]; in vhost_scsi_open()
2158 svq->vs = vs; in vhost_scsi_open()
2164 vhost_dev_init(&vs->dev, vqs, nvqs, UIO_MAXIOV, in vhost_scsi_open()
2167 vhost_scsi_init_inflight(vs, NULL); in vhost_scsi_open()
2169 f->private_data = vs; in vhost_scsi_open()
2173 kfree(vs->vqs); in vhost_scsi_open()
2175 kfree(vs->old_inflight); in vhost_scsi_open()
2177 kvfree(vs); in vhost_scsi_open()
2184 struct vhost_scsi *vs = f->private_data; in vhost_scsi_release() local
2187 mutex_lock(&vs->dev.mutex); in vhost_scsi_release()
2188 memcpy(t.vhost_wwpn, vs->vs_vhost_wwpn, sizeof(t.vhost_wwpn)); in vhost_scsi_release()
2189 mutex_unlock(&vs->dev.mutex); in vhost_scsi_release()
2190 vhost_scsi_clear_endpoint(vs, &t); in vhost_scsi_release()
2191 vhost_dev_stop(&vs->dev); in vhost_scsi_release()
2192 vhost_dev_cleanup(&vs->dev); in vhost_scsi_release()
2193 kfree(vs->dev.vqs); in vhost_scsi_release()
2194 kfree(vs->vqs); in vhost_scsi_release()
2195 kfree(vs->old_inflight); in vhost_scsi_release()
2196 kvfree(vs); in vhost_scsi_release()
2205 struct vhost_scsi *vs = f->private_data; in vhost_scsi_ioctl() local
2213 struct vhost_virtqueue *vq = &vs->vqs[VHOST_SCSI_VQ_EVT].vq; in vhost_scsi_ioctl()
2222 return vhost_scsi_set_endpoint(vs, &backend); in vhost_scsi_ioctl()
2229 return vhost_scsi_clear_endpoint(vs, &backend); in vhost_scsi_ioctl()
2238 vs->vs_events_missed = events_missed; in vhost_scsi_ioctl()
2243 events_missed = vs->vs_events_missed; in vhost_scsi_ioctl()
2256 return vhost_scsi_set_features(vs, features); in vhost_scsi_ioctl()
2261 mutex_lock(&vs->dev.mutex); in vhost_scsi_ioctl()
2262 r = vhost_worker_ioctl(&vs->dev, ioctl, argp); in vhost_scsi_ioctl()
2263 mutex_unlock(&vs->dev.mutex); in vhost_scsi_ioctl()
2266 mutex_lock(&vs->dev.mutex); in vhost_scsi_ioctl()
2267 r = vhost_dev_ioctl(&vs->dev, ioctl, argp); in vhost_scsi_ioctl()
2270 r = vhost_vring_ioctl(&vs->dev, ioctl, argp); in vhost_scsi_ioctl()
2271 mutex_unlock(&vs->dev.mutex); in vhost_scsi_ioctl()
2322 struct vhost_scsi *vs = tpg->vhost_scsi; in vhost_scsi_do_plug() local
2326 if (!vs) in vhost_scsi_do_plug()
2334 vq = &vs->vqs[VHOST_SCSI_VQ_EVT].vq; in vhost_scsi_do_plug()
2344 vhost_scsi_send_evt(vs, vq, tpg, lun, in vhost_scsi_do_plug()