aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/vhost
diff options
context:
space:
mode:
authorNicholas Bellinger <nab@linux-iscsi.org>2015-01-28 16:10:51 -0500
committerNicholas Bellinger <nab@linux-iscsi.org>2015-02-04 13:55:36 -0500
commitb4078b5face3c1e79ef6e2dd254af04a470ed2bc (patch)
tree55692e7ced0d180fd202c2c03f740a68d69d68f3 /drivers/vhost
parentde1419e42088e99f8f839710c42aec759e45de77 (diff)
vhost/scsi: Change vhost_scsi_map_to_sgl to accept iov ptr + len
This patch changes vhost_scsi_map_to_sgl() parameters to accept virtio iovec ptr + len when determing pages_nr. This is currently done with iov_num_pages() -> PAGE_ALIGN, so allow the same parameters as well. Cc: Michael S. Tsirkin <mst@redhat.com> Cc: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/vhost')
-rw-r--r--drivers/vhost/scsi.c37
1 files changed, 15 insertions, 22 deletions
diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c
index 62de820ae2f4..b9800c7a1d5d 100644
--- a/drivers/vhost/scsi.c
+++ b/drivers/vhost/scsi.c
@@ -222,10 +222,10 @@ static struct workqueue_struct *tcm_vhost_workqueue;
222static DEFINE_MUTEX(tcm_vhost_mutex); 222static DEFINE_MUTEX(tcm_vhost_mutex);
223static LIST_HEAD(tcm_vhost_list); 223static LIST_HEAD(tcm_vhost_list);
224 224
225static int iov_num_pages(struct iovec *iov) 225static int iov_num_pages(void __user *iov_base, size_t iov_len)
226{ 226{
227 return (PAGE_ALIGN((unsigned long)iov->iov_base + iov->iov_len) - 227 return (PAGE_ALIGN((unsigned long)iov_base + iov_len) -
228 ((unsigned long)iov->iov_base & PAGE_MASK)) >> PAGE_SHIFT; 228 ((unsigned long)iov_base & PAGE_MASK)) >> PAGE_SHIFT;
229} 229}
230 230
231static void tcm_vhost_done_inflight(struct kref *kref) 231static void tcm_vhost_done_inflight(struct kref *kref)
@@ -782,25 +782,18 @@ vhost_scsi_get_tag(struct vhost_virtqueue *vq, struct tcm_vhost_tpg *tpg,
782 * Returns the number of scatterlist entries used or -errno on error. 782 * Returns the number of scatterlist entries used or -errno on error.
783 */ 783 */
784static int 784static int
785vhost_scsi_map_to_sgl(struct tcm_vhost_cmd *tv_cmd, 785vhost_scsi_map_to_sgl(struct tcm_vhost_cmd *cmd,
786 void __user *ptr,
787 size_t len,
786 struct scatterlist *sgl, 788 struct scatterlist *sgl,
787 unsigned int sgl_count,
788 struct iovec *iov,
789 struct page **pages,
790 bool write) 789 bool write)
791{ 790{
792 unsigned int npages = 0, pages_nr, offset, nbytes; 791 unsigned int npages = 0, offset, nbytes;
792 unsigned int pages_nr = iov_num_pages(ptr, len);
793 struct scatterlist *sg = sgl; 793 struct scatterlist *sg = sgl;
794 void __user *ptr = iov->iov_base; 794 struct page **pages = cmd->tvc_upages;
795 size_t len = iov->iov_len;
796 int ret, i; 795 int ret, i;
797 796
798 pages_nr = iov_num_pages(iov);
799 if (pages_nr > sgl_count) {
800 pr_err("vhost_scsi_map_to_sgl() pages_nr: %u greater than"
801 " sgl_count: %u\n", pages_nr, sgl_count);
802 return -ENOBUFS;
803 }
804 if (pages_nr > TCM_VHOST_PREALLOC_UPAGES) { 797 if (pages_nr > TCM_VHOST_PREALLOC_UPAGES) {
805 pr_err("vhost_scsi_map_to_sgl() pages_nr: %u greater than" 798 pr_err("vhost_scsi_map_to_sgl() pages_nr: %u greater than"
806 " preallocated TCM_VHOST_PREALLOC_UPAGES: %u\n", 799 " preallocated TCM_VHOST_PREALLOC_UPAGES: %u\n",
@@ -845,7 +838,7 @@ vhost_scsi_map_iov_to_sgl(struct tcm_vhost_cmd *cmd,
845 int ret, i; 838 int ret, i;
846 839
847 for (i = 0; i < niov; i++) 840 for (i = 0; i < niov; i++)
848 sgl_count += iov_num_pages(&iov[i]); 841 sgl_count += iov_num_pages(iov[i].iov_base, iov[i].iov_len);
849 842
850 if (sgl_count > TCM_VHOST_PREALLOC_SGLS) { 843 if (sgl_count > TCM_VHOST_PREALLOC_SGLS) {
851 pr_err("vhost_scsi_map_iov_to_sgl() sgl_count: %u greater than" 844 pr_err("vhost_scsi_map_iov_to_sgl() sgl_count: %u greater than"
@@ -861,8 +854,8 @@ vhost_scsi_map_iov_to_sgl(struct tcm_vhost_cmd *cmd,
861 pr_debug("Mapping iovec %p for %u pages\n", &iov[0], sgl_count); 854 pr_debug("Mapping iovec %p for %u pages\n", &iov[0], sgl_count);
862 855
863 for (i = 0; i < niov; i++) { 856 for (i = 0; i < niov; i++) {
864 ret = vhost_scsi_map_to_sgl(cmd, sg, sgl_count, &iov[i], 857 ret = vhost_scsi_map_to_sgl(cmd, iov[i].iov_base, iov[i].iov_len,
865 cmd->tvc_upages, write); 858 sg, write);
866 if (ret < 0) { 859 if (ret < 0) {
867 for (i = 0; i < cmd->tvc_sgl_count; i++) { 860 for (i = 0; i < cmd->tvc_sgl_count; i++) {
868 struct page *page = sg_page(&cmd->tvc_sgl[i]); 861 struct page *page = sg_page(&cmd->tvc_sgl[i]);
@@ -889,7 +882,7 @@ vhost_scsi_map_iov_to_prot(struct tcm_vhost_cmd *cmd,
889 int ret, i; 882 int ret, i;
890 883
891 for (i = 0; i < niov; i++) 884 for (i = 0; i < niov; i++)
892 prot_sgl_count += iov_num_pages(&iov[i]); 885 prot_sgl_count += iov_num_pages(iov[i].iov_base, iov[i].iov_len);
893 886
894 if (prot_sgl_count > TCM_VHOST_PREALLOC_PROT_SGLS) { 887 if (prot_sgl_count > TCM_VHOST_PREALLOC_PROT_SGLS) {
895 pr_err("vhost_scsi_map_iov_to_prot() sgl_count: %u greater than" 888 pr_err("vhost_scsi_map_iov_to_prot() sgl_count: %u greater than"
@@ -904,8 +897,8 @@ vhost_scsi_map_iov_to_prot(struct tcm_vhost_cmd *cmd,
904 cmd->tvc_prot_sgl_count = prot_sgl_count; 897 cmd->tvc_prot_sgl_count = prot_sgl_count;
905 898
906 for (i = 0; i < niov; i++) { 899 for (i = 0; i < niov; i++) {
907 ret = vhost_scsi_map_to_sgl(cmd, prot_sg, prot_sgl_count, &iov[i], 900 ret = vhost_scsi_map_to_sgl(cmd, iov[i].iov_base, iov[i].iov_len,
908 cmd->tvc_upages, write); 901 prot_sg, write);
909 if (ret < 0) { 902 if (ret < 0) {
910 for (i = 0; i < cmd->tvc_prot_sgl_count; i++) { 903 for (i = 0; i < cmd->tvc_prot_sgl_count; i++) {
911 struct page *page = sg_page(&cmd->tvc_prot_sgl[i]); 904 struct page *page = sg_page(&cmd->tvc_prot_sgl[i]);