linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/4] Fix some bugs of the vop driver and mpssd user space tool
@ 2020-09-25  7:18 Sherry Sun
  2020-09-25  7:18 ` [PATCH 1/4] samples: mpssd: fix the build errors when enable DEBUG in mpssd.c Sherry Sun
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Sherry Sun @ 2020-09-25  7:18 UTC (permalink / raw)
  To: sudeep.dutt, ashutosh.dixit, arnd, gregkh, rikard.falkeborn,
	lee.jones, mst
  Cc: linux-kernel, linux-imx

This patchset fix some bugs about the vop driver and Intel MIC user space tool
-- mpssd.

Sherry Sun (4):
  samples: mpssd: fix the build errors when enable DEBUG in mpssd.c
  misc: vop: build VOP based on CONFIG_VOP
  misc: vop: add round_up(x,4) for vring_size to avoid kernel panic
  mic: vop: copy data to kernel space then write to io memory

 drivers/misc/mic/vop/Makefile     |  2 +-
 drivers/misc/mic/vop/vop_main.c   |  2 +-
 drivers/misc/mic/vop/vop_vringh.c | 10 +++++++---
 samples/mic/mpssd/mpssd.c         | 24 ++++++++++++------------
 4 files changed, 21 insertions(+), 17 deletions(-)

-- 
2.17.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/4] samples: mpssd: fix the build errors when enable DEBUG in mpssd.c
  2020-09-25  7:18 [PATCH 0/4] Fix some bugs of the vop driver and mpssd user space tool Sherry Sun
@ 2020-09-25  7:18 ` Sherry Sun
  2020-09-25  7:18 ` [PATCH 2/4] misc: vop: build VOP based on CONFIG_VOP Sherry Sun
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 9+ messages in thread
From: Sherry Sun @ 2020-09-25  7:18 UTC (permalink / raw)
  To: sudeep.dutt, ashutosh.dixit, arnd, gregkh, rikard.falkeborn,
	lee.jones, mst
  Cc: linux-kernel, linux-imx

If enable DEBUG, will meet the following errors when build mpssd, so fix
them here. Only one error is listed here, other errors are similar.

mpssd.c: In function ‘virtio_net’:
mpssd.c:615:21: error: incompatible type for argument 2 of ‘disp_iovec’
     disp_iovec(mic, copy, __func__, __LINE__);
                     ^~~~
mpssd.c:361:1: note: expected ‘struct mic_copy_desc *’ but argument is of type ‘struct mic_copy_desc’
 disp_iovec(struct mic_info *mic, struct mic_copy_desc *copy,
 ^~~~~~~~~~

Signed-off-by: Sherry Sun <sherry.sun@nxp.com>
---
 samples/mic/mpssd/mpssd.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/samples/mic/mpssd/mpssd.c b/samples/mic/mpssd/mpssd.c
index a11bf6c5b53b..51d03545869e 100644
--- a/samples/mic/mpssd/mpssd.c
+++ b/samples/mic/mpssd/mpssd.c
@@ -612,7 +612,7 @@ virtio_net(void *arg)
 					copy.out_len, hdr->gso_type);
 #endif
 #ifdef DEBUG
-				disp_iovec(mic, copy, __func__, __LINE__);
+				disp_iovec(mic, &copy, __func__, __LINE__);
 				mpsslog("%s %s %d read from tap 0x%lx\n",
 					mic->name, __func__, __LINE__,
 					len);
@@ -632,7 +632,7 @@ virtio_net(void *arg)
 				if (!err)
 					verify_out_len(mic, &copy);
 #ifdef DEBUG
-				disp_iovec(mic, copy, __func__, __LINE__);
+				disp_iovec(mic, &copy, __func__, __LINE__);
 				mpsslog("%s %s %d wrote to net 0x%lx\n",
 					mic->name, __func__, __LINE__,
 					sum_iovec_len(&copy));
@@ -681,12 +681,12 @@ virtio_net(void *arg)
 						sizeof(struct virtio_net_hdr);
 					verify_out_len(mic, &copy);
 #ifdef DEBUG
-					disp_iovec(mic, copy, __func__,
+					disp_iovec(mic, &copy, __func__,
 						   __LINE__);
 					mpsslog("%s %s %d ",
 						mic->name, __func__, __LINE__);
 					mpsslog("read from net 0x%lx\n",
-						sum_iovec_len(copy));
+						sum_iovec_len(&copy));
 #endif
 					len = writev(net_poll[NET_FD_TUN].fd,
 						copy.iov, copy.iovcnt);
@@ -814,7 +814,7 @@ virtio_console(void *arg)
 			len = readv(pty_fd, copy.iov, copy.iovcnt);
 			if (len > 0) {
 #ifdef DEBUG
-				disp_iovec(mic, copy, __func__, __LINE__);
+				disp_iovec(mic, &copy, __func__, __LINE__);
 				mpsslog("%s %s %d read from tap 0x%lx\n",
 					mic->name, __func__, __LINE__,
 					len);
@@ -834,10 +834,10 @@ virtio_console(void *arg)
 				if (!err)
 					verify_out_len(mic, &copy);
 #ifdef DEBUG
-				disp_iovec(mic, copy, __func__, __LINE__);
+				disp_iovec(mic, &copy, __func__, __LINE__);
 				mpsslog("%s %s %d wrote to net 0x%lx\n",
 					mic->name, __func__, __LINE__,
-					sum_iovec_len(copy));
+					sum_iovec_len(&copy));
 #endif
 				/* Reinitialize IOV for next run */
 				iov0->iov_len = PAGE_SIZE;
@@ -866,12 +866,12 @@ virtio_console(void *arg)
 					iov1->iov_len = copy.out_len;
 					verify_out_len(mic, &copy);
 #ifdef DEBUG
-					disp_iovec(mic, copy, __func__,
+					disp_iovec(mic, &copy, __func__,
 						   __LINE__);
 					mpsslog("%s %s %d ",
 						mic->name, __func__, __LINE__);
 					mpsslog("read from net 0x%lx\n",
-						sum_iovec_len(copy));
+						sum_iovec_len(&copy));
 #endif
 					len = writev(pty_fd,
 						copy.iov, copy.iovcnt);
@@ -883,7 +883,7 @@ virtio_console(void *arg)
 							sum_iovec_len(&copy));
 					} else {
 #ifdef DEBUG
-						disp_iovec(mic, copy, __func__,
+						disp_iovec(mic, &copy, __func__,
 							   __LINE__);
 						mpsslog("%s %s %d ",
 							mic->name, __func__,
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 2/4] misc: vop: build VOP based on CONFIG_VOP
  2020-09-25  7:18 [PATCH 0/4] Fix some bugs of the vop driver and mpssd user space tool Sherry Sun
  2020-09-25  7:18 ` [PATCH 1/4] samples: mpssd: fix the build errors when enable DEBUG in mpssd.c Sherry Sun
@ 2020-09-25  7:18 ` Sherry Sun
  2020-09-25  7:18 ` [PATCH 3/4] misc: vop: add round_up(x,4) for vring_size to avoid kernel panic Sherry Sun
  2020-09-25  7:18 ` [PATCH 4/4] mic: vop: copy data to kernel space then write to io memory Sherry Sun
  3 siblings, 0 replies; 9+ messages in thread
From: Sherry Sun @ 2020-09-25  7:18 UTC (permalink / raw)
  To: sudeep.dutt, ashutosh.dixit, arnd, gregkh, rikard.falkeborn,
	lee.jones, mst
  Cc: linux-kernel, linux-imx

Build module or builtin VOP based on CONFIG_VOP macro.

Signed-off-by: Joakim Zhang <qiangqing.zhang@nxp.com>
Signed-off-by: Sherry Sun <sherry.sun@nxp.com>
---
 drivers/misc/mic/vop/Makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/misc/mic/vop/Makefile b/drivers/misc/mic/vop/Makefile
index 579da3868c8e..51b9b0022786 100644
--- a/drivers/misc/mic/vop/Makefile
+++ b/drivers/misc/mic/vop/Makefile
@@ -3,7 +3,7 @@
 # Makefile - Intel MIC Linux driver.
 # Copyright(c) 2016, Intel Corporation.
 #
-obj-m := vop.o
+obj-$(CONFIG_VOP) := vop.o
 
 vop-objs += vop_main.o
 vop-objs += vop_debugfs.o
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 3/4] misc: vop: add round_up(x,4) for vring_size to avoid kernel panic
  2020-09-25  7:18 [PATCH 0/4] Fix some bugs of the vop driver and mpssd user space tool Sherry Sun
  2020-09-25  7:18 ` [PATCH 1/4] samples: mpssd: fix the build errors when enable DEBUG in mpssd.c Sherry Sun
  2020-09-25  7:18 ` [PATCH 2/4] misc: vop: build VOP based on CONFIG_VOP Sherry Sun
@ 2020-09-25  7:18 ` Sherry Sun
  2020-09-25  7:18 ` [PATCH 4/4] mic: vop: copy data to kernel space then write to io memory Sherry Sun
  3 siblings, 0 replies; 9+ messages in thread
From: Sherry Sun @ 2020-09-25  7:18 UTC (permalink / raw)
  To: sudeep.dutt, ashutosh.dixit, arnd, gregkh, rikard.falkeborn,
	lee.jones, mst
  Cc: linux-kernel, linux-imx

Since struct _mic_vring_info and vring are allocated together and follow
vring, if the vring_size() is not four bytes aligned, which will cause
the start address of struct _mic_vring_info is not four byte aligned.
For example, when vring entries is 128, the vring_size() will be 5126
bytes. The _mic_vring_info struct layout in ddr looks like:
0x90002400:  00000000 00390000 EE010000 0000C0FF
Here 0x39 is the avail_idx member, and 0xC0FFEE01 is the magic member.

When EP use ioread32(magic) to reads the magic in RC's share memory, it
will cause kernel panic on ARM64 platform due to the cross-byte io read.
Here read magic in user space use le32toh(vr0->info->magic) will meet
the same issue.
So add round_up(x,4) for vring_size, then the struct _mic_vring_info
will store in this way:
0x90002400:  00000000 00000000 00000039 C0FFEE01
Which will avoid kernel panic when read magic in struct _mic_vring_info.

Signed-off-by: Sherry Sun <sherry.sun@nxp.com>
Signed-off-by: Joakim Zhang <qiangqing.zhang@nxp.com>
---
 drivers/misc/mic/vop/vop_main.c   | 2 +-
 drivers/misc/mic/vop/vop_vringh.c | 4 ++--
 samples/mic/mpssd/mpssd.c         | 4 ++--
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/misc/mic/vop/vop_main.c b/drivers/misc/mic/vop/vop_main.c
index 55e7f21e51f4..6722c726b259 100644
--- a/drivers/misc/mic/vop/vop_main.c
+++ b/drivers/misc/mic/vop/vop_main.c
@@ -320,7 +320,7 @@ static struct virtqueue *vop_find_vq(struct virtio_device *dev,
 	/* First assign the vring's allocated in host memory */
 	vqconfig = _vop_vq_config(vdev->desc) + index;
 	memcpy_fromio(&config, vqconfig, sizeof(config));
-	_vr_size = vring_size(le16_to_cpu(config.num), MIC_VIRTIO_RING_ALIGN);
+	_vr_size = round_up(vring_size(le16_to_cpu(config.num), MIC_VIRTIO_RING_ALIGN), 4);
 	vr_size = PAGE_ALIGN(_vr_size + sizeof(struct _mic_vring_info));
 	va = vpdev->hw_ops->remap(vpdev, le64_to_cpu(config.address), vr_size);
 	if (!va)
diff --git a/drivers/misc/mic/vop/vop_vringh.c b/drivers/misc/mic/vop/vop_vringh.c
index 30eac172f017..45fdb394de11 100644
--- a/drivers/misc/mic/vop/vop_vringh.c
+++ b/drivers/misc/mic/vop/vop_vringh.c
@@ -296,7 +296,7 @@ static int vop_virtio_add_device(struct vop_vdev *vdev,
 
 		num = le16_to_cpu(vqconfig[i].num);
 		mutex_init(&vvr->vr_mutex);
-		vr_size = PAGE_ALIGN(vring_size(num, MIC_VIRTIO_RING_ALIGN) +
+		vr_size = PAGE_ALIGN(round_up(vring_size(num, MIC_VIRTIO_RING_ALIGN), 4) +
 			sizeof(struct _mic_vring_info));
 		vr->va = (void *)
 			__get_free_pages(GFP_KERNEL | __GFP_ZERO,
@@ -308,7 +308,7 @@ static int vop_virtio_add_device(struct vop_vdev *vdev,
 			goto err;
 		}
 		vr->len = vr_size;
-		vr->info = vr->va + vring_size(num, MIC_VIRTIO_RING_ALIGN);
+		vr->info = vr->va + round_up(vring_size(num, MIC_VIRTIO_RING_ALIGN), 4);
 		vr->info->magic = cpu_to_le32(MIC_MAGIC + vdev->virtio_id + i);
 		vr_addr = dma_map_single(&vpdev->dev, vr->va, vr_size,
 					 DMA_BIDIRECTIONAL);
diff --git a/samples/mic/mpssd/mpssd.c b/samples/mic/mpssd/mpssd.c
index 51d03545869e..c03a05d498f0 100644
--- a/samples/mic/mpssd/mpssd.c
+++ b/samples/mic/mpssd/mpssd.c
@@ -403,9 +403,9 @@ mic_virtio_copy(struct mic_info *mic, int fd,
 
 static inline unsigned _vring_size(unsigned int num, unsigned long align)
 {
-	return ((sizeof(struct vring_desc) * num + sizeof(__u16) * (3 + num)
+	return _ALIGN_UP(((sizeof(struct vring_desc) * num + sizeof(__u16) * (3 + num)
 				+ align - 1) & ~(align - 1))
-		+ sizeof(__u16) * 3 + sizeof(struct vring_used_elem) * num;
+		+ sizeof(__u16) * 3 + sizeof(struct vring_used_elem) * num, 4);
 }
 
 /*
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 4/4] mic: vop: copy data to kernel space then write to io memory
  2020-09-25  7:18 [PATCH 0/4] Fix some bugs of the vop driver and mpssd user space tool Sherry Sun
                   ` (2 preceding siblings ...)
  2020-09-25  7:18 ` [PATCH 3/4] misc: vop: add round_up(x,4) for vring_size to avoid kernel panic Sherry Sun
@ 2020-09-25  7:18 ` Sherry Sun
  2020-09-25  7:32   ` Arnd Bergmann
                     ` (2 more replies)
  3 siblings, 3 replies; 9+ messages in thread
From: Sherry Sun @ 2020-09-25  7:18 UTC (permalink / raw)
  To: sudeep.dutt, ashutosh.dixit, arnd, gregkh, rikard.falkeborn,
	lee.jones, mst
  Cc: linux-kernel, linux-imx

Read and write io memory should address align on ARCH ARM. Change to use
memcpy_toio to avoid kernel panic caused by the address un-align issue.

Signed-off-by: Sherry Sun <sherry.sun@nxp.com>
Signed-off-by: Joakim Zhang <qiangqing.zhang@nxp.com>
---
 drivers/misc/mic/vop/vop_vringh.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/misc/mic/vop/vop_vringh.c b/drivers/misc/mic/vop/vop_vringh.c
index 45fdb394de11..f344209ac386 100644
--- a/drivers/misc/mic/vop/vop_vringh.c
+++ b/drivers/misc/mic/vop/vop_vringh.c
@@ -602,6 +602,7 @@ static int vop_virtio_copy_from_user(struct vop_vdev *vdev, void __user *ubuf,
 	size_t partlen;
 	bool dma = VOP_USE_DMA && vi->dma_ch;
 	int err = 0;
+	void *temp = NULL;
 
 	if (dma) {
 		dma_alignment = 1 << vi->dma_ch->device->copy_align;
@@ -655,12 +656,15 @@ static int vop_virtio_copy_from_user(struct vop_vdev *vdev, void __user *ubuf,
 	 * We are copying to IO below and should ideally use something
 	 * like copy_from_user_toio(..) if it existed.
 	 */
-	if (copy_from_user((void __force *)dbuf, ubuf, len)) {
+	temp = kmalloc(len, GFP_KERNEL);
+	if (copy_from_user(temp, ubuf, len)) {
 		err = -EFAULT;
 		dev_err(vop_dev(vdev), "%s %d err %d\n",
 			__func__, __LINE__, err);
 		goto err;
 	}
+	memcpy_toio((void __force *)dbuf, temp, len);
+	kfree(temp);
 	vdev->out_bytes += len;
 	err = 0;
 err:
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 4/4] mic: vop: copy data to kernel space then write to io memory
  2020-09-25  7:18 ` [PATCH 4/4] mic: vop: copy data to kernel space then write to io memory Sherry Sun
@ 2020-09-25  7:32   ` Arnd Bergmann
  2020-09-25  7:50     ` Sherry Sun
  2020-09-25 10:55   ` kernel test robot
  2020-09-25 11:03   ` kernel test robot
  2 siblings, 1 reply; 9+ messages in thread
From: Arnd Bergmann @ 2020-09-25  7:32 UTC (permalink / raw)
  To: Sherry Sun
  Cc: Sudeep Dutt, Ashutosh Dixit, gregkh, Rikard Falkeborn, Lee Jones,
	Michael S. Tsirkin, linux-kernel, NXP Linux Team

On Fri, Sep 25, 2020 at 9:22 AM Sherry Sun <sherry.sun@nxp.com> wrote:
>

> @@ -655,12 +656,15 @@ static int vop_virtio_copy_from_user(struct vop_vdev *vdev, void __user *ubuf,
>          * We are copying to IO below and should ideally use something
>          * like copy_from_user_toio(..) if it existed.
>          */
> -       if (copy_from_user((void __force *)dbuf, ubuf, len)) {
> +       temp = kmalloc(len, GFP_KERNEL);
> +       if (copy_from_user(temp, ubuf, len))

This needs to have error handling for a kmalloc() failure. As the length
appears to be user-provided, you might also want to limit the size of
the allocation and instead do a loop with multiple copies if there is
more data than fits into the allocation.

       Arnd

^ permalink raw reply	[flat|nested] 9+ messages in thread

* RE: [PATCH 4/4] mic: vop: copy data to kernel space then write to io memory
  2020-09-25  7:32   ` Arnd Bergmann
@ 2020-09-25  7:50     ` Sherry Sun
  0 siblings, 0 replies; 9+ messages in thread
From: Sherry Sun @ 2020-09-25  7:50 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Sudeep Dutt, Ashutosh Dixit, gregkh, Rikard Falkeborn, Lee Jones,
	Michael S. Tsirkin, linux-kernel, dl-linux-imx

Hi Arnd,

> Subject: Re: [PATCH 4/4] mic: vop: copy data to kernel space then write to io
> memory
> 
> On Fri, Sep 25, 2020 at 9:22 AM Sherry Sun <sherry.sun@nxp.com> wrote:
> >
> 
> > @@ -655,12 +656,15 @@ static int vop_virtio_copy_from_user(struct
> vop_vdev *vdev, void __user *ubuf,
> >          * We are copying to IO below and should ideally use something
> >          * like copy_from_user_toio(..) if it existed.
> >          */
> > -       if (copy_from_user((void __force *)dbuf, ubuf, len)) {
> > +       temp = kmalloc(len, GFP_KERNEL);
> > +       if (copy_from_user(temp, ubuf, len))
> 
> This needs to have error handling for a kmalloc() failure. As the length
> appears to be user-provided, you might also want to limit the size of the
> allocation and instead do a loop with multiple copies if there is more data
> than fits into the allocation.

Thanks for your quick reply, you are right, will add error handling for kmalloc() failure and size limit handling in v2.

Regards
Sherry 
> 
>        Arnd

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 4/4] mic: vop: copy data to kernel space then write to io memory
  2020-09-25  7:18 ` [PATCH 4/4] mic: vop: copy data to kernel space then write to io memory Sherry Sun
  2020-09-25  7:32   ` Arnd Bergmann
@ 2020-09-25 10:55   ` kernel test robot
  2020-09-25 11:03   ` kernel test robot
  2 siblings, 0 replies; 9+ messages in thread
From: kernel test robot @ 2020-09-25 10:55 UTC (permalink / raw)
  To: Sherry Sun, sudeep.dutt, ashutosh.dixit, arnd, gregkh,
	rikard.falkeborn, lee.jones, mst
  Cc: kbuild-all, linux-kernel, linux-imx

[-- Attachment #1: Type: text/plain, Size: 5112 bytes --]

Hi Sherry,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on char-misc/char-misc-testing]
[also build test WARNING on soc/for-next linus/master v5.9-rc6 next-20200924]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Sherry-Sun/Fix-some-bugs-of-the-vop-driver-and-mpssd-user-space-tool/20200925-152356
base:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git 9eb29f2ed95edda511ce28651b1d7cdef3614c12
config: x86_64-randconfig-s021-20200925 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
reproduce:
        # apt-get install sparse
        # sparse version: v0.6.2-201-g24bdaac6-dirty
        # https://github.com/0day-ci/linux/commit/5f4b5ded8447941d43166eba5d303cdca2e54f07
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Sherry-Sun/Fix-some-bugs-of-the-vop-driver-and-mpssd-user-space-tool/20200925-152356
        git checkout 5f4b5ded8447941d43166eba5d303cdca2e54f07
        # save the attached .config to linux build tree
        make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=x86_64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


sparse warnings: (new ones prefixed by >>)

>> drivers/misc/mic/vop/vop_vringh.c:666:22: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void volatile [noderef] __iomem * @@     got void * @@
>> drivers/misc/mic/vop/vop_vringh.c:666:22: sparse:     expected void volatile [noderef] __iomem *
>> drivers/misc/mic/vop/vop_vringh.c:666:22: sparse:     got void *

vim +666 drivers/misc/mic/vop/vop_vringh.c

   585	
   586	/*
   587	 * Initiates copies across the PCIe bus from a user space buffer to card
   588	 * memory. When transfers are done using DMA, source/destination addresses
   589	 * and transfer length must follow the alignment requirements of the MIC
   590	 * DMA engine.
   591	 */
   592	static int vop_virtio_copy_from_user(struct vop_vdev *vdev, void __user *ubuf,
   593					     size_t len, u64 daddr, size_t dlen,
   594					     int vr_idx)
   595	{
   596		struct vop_device *vpdev = vdev->vpdev;
   597		void __iomem *dbuf = vpdev->hw_ops->remap(vpdev, daddr, len);
   598		struct vop_vringh *vvr = &vdev->vvr[vr_idx];
   599		struct vop_info *vi = dev_get_drvdata(&vdev->vpdev->dev);
   600		size_t dma_alignment;
   601		bool x200;
   602		size_t partlen;
   603		bool dma = VOP_USE_DMA && vi->dma_ch;
   604		int err = 0;
   605		void *temp = NULL;
   606	
   607		if (dma) {
   608			dma_alignment = 1 << vi->dma_ch->device->copy_align;
   609			x200 = is_dma_copy_aligned(vi->dma_ch->device, 1, 1, 1);
   610	
   611			if (daddr & (dma_alignment - 1)) {
   612				vdev->tx_dst_unaligned += len;
   613				dma = false;
   614			} else if (ALIGN(len, dma_alignment) > dlen) {
   615				vdev->tx_len_unaligned += len;
   616				dma = false;
   617			}
   618		}
   619	
   620		if (!dma)
   621			goto memcpy;
   622	
   623		/*
   624		 * X100 uses DMA addresses as seen by the card so adding
   625		 * the aperture base is not required for DMA. However x200
   626		 * requires DMA addresses to be an offset into the bar so
   627		 * add the aperture base for x200.
   628		 */
   629		if (x200)
   630			daddr += vpdev->aper->pa;
   631		while (len) {
   632			partlen = min_t(size_t, len, VOP_INT_DMA_BUF_SIZE);
   633	
   634			if (copy_from_user(vvr->buf, ubuf, partlen)) {
   635				err = -EFAULT;
   636				dev_err(vop_dev(vdev), "%s %d err %d\n",
   637					__func__, __LINE__, err);
   638				goto err;
   639			}
   640			err = vop_sync_dma(vdev, daddr, vvr->buf_da,
   641					   ALIGN(partlen, dma_alignment));
   642			if (err) {
   643				dev_err(vop_dev(vdev), "%s %d err %d\n",
   644					__func__, __LINE__, err);
   645				goto err;
   646			}
   647			daddr += partlen;
   648			ubuf += partlen;
   649			dbuf += partlen;
   650			vdev->out_bytes_dma += partlen;
   651			vdev->out_bytes += partlen;
   652			len -= partlen;
   653		}
   654	memcpy:
   655		/*
   656		 * We are copying to IO below and should ideally use something
   657		 * like copy_from_user_toio(..) if it existed.
   658		 */
   659		temp = kmalloc(len, GFP_KERNEL);
   660		if (copy_from_user(temp, ubuf, len)) {
   661			err = -EFAULT;
   662			dev_err(vop_dev(vdev), "%s %d err %d\n",
   663				__func__, __LINE__, err);
   664			goto err;
   665		}
 > 666		memcpy_toio((void __force *)dbuf, temp, len);
   667		kfree(temp);
   668		vdev->out_bytes += len;
   669		err = 0;
   670	err:
   671		vpdev->hw_ops->unmap(vpdev, dbuf);
   672		dev_dbg(vop_dev(vdev),
   673			"%s: ubuf %p dbuf %p len 0x%zx vr_idx 0x%x\n",
   674			__func__, ubuf, dbuf, len, vr_idx);
   675		return err;
   676	}
   677	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 28053 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 4/4] mic: vop: copy data to kernel space then write to io memory
  2020-09-25  7:18 ` [PATCH 4/4] mic: vop: copy data to kernel space then write to io memory Sherry Sun
  2020-09-25  7:32   ` Arnd Bergmann
  2020-09-25 10:55   ` kernel test robot
@ 2020-09-25 11:03   ` kernel test robot
  2 siblings, 0 replies; 9+ messages in thread
From: kernel test robot @ 2020-09-25 11:03 UTC (permalink / raw)
  To: Sherry Sun, sudeep.dutt, ashutosh.dixit, arnd, gregkh,
	rikard.falkeborn, lee.jones, mst
  Cc: kbuild-all, linux-kernel, linux-imx

[-- Attachment #1: Type: text/plain, Size: 5305 bytes --]

Hi Sherry,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on char-misc/char-misc-testing]
[also build test WARNING on soc/for-next linus/master v5.9-rc6 next-20200924]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Sherry-Sun/Fix-some-bugs-of-the-vop-driver-and-mpssd-user-space-tool/20200925-152356
base:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git 9eb29f2ed95edda511ce28651b1d7cdef3614c12
config: ia64-randconfig-s032-20200925 (attached as .config)
compiler: ia64-linux-gcc (GCC) 9.3.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # apt-get install sparse
        # sparse version: v0.6.2-201-g24bdaac6-dirty
        # https://github.com/0day-ci/linux/commit/5f4b5ded8447941d43166eba5d303cdca2e54f07
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Sherry-Sun/Fix-some-bugs-of-the-vop-driver-and-mpssd-user-space-tool/20200925-152356
        git checkout 5f4b5ded8447941d43166eba5d303cdca2e54f07
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=ia64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


sparse warnings: (new ones prefixed by >>)

>> drivers/misc/mic/vop/vop_vringh.c:666:22: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void volatile [noderef] __iomem *dst @@     got void * @@
>> drivers/misc/mic/vop/vop_vringh.c:666:22: sparse:     expected void volatile [noderef] __iomem *dst
   drivers/misc/mic/vop/vop_vringh.c:666:22: sparse:     got void *

vim +666 drivers/misc/mic/vop/vop_vringh.c

   585	
   586	/*
   587	 * Initiates copies across the PCIe bus from a user space buffer to card
   588	 * memory. When transfers are done using DMA, source/destination addresses
   589	 * and transfer length must follow the alignment requirements of the MIC
   590	 * DMA engine.
   591	 */
   592	static int vop_virtio_copy_from_user(struct vop_vdev *vdev, void __user *ubuf,
   593					     size_t len, u64 daddr, size_t dlen,
   594					     int vr_idx)
   595	{
   596		struct vop_device *vpdev = vdev->vpdev;
   597		void __iomem *dbuf = vpdev->hw_ops->remap(vpdev, daddr, len);
   598		struct vop_vringh *vvr = &vdev->vvr[vr_idx];
   599		struct vop_info *vi = dev_get_drvdata(&vdev->vpdev->dev);
   600		size_t dma_alignment;
   601		bool x200;
   602		size_t partlen;
   603		bool dma = VOP_USE_DMA && vi->dma_ch;
   604		int err = 0;
   605		void *temp = NULL;
   606	
   607		if (dma) {
   608			dma_alignment = 1 << vi->dma_ch->device->copy_align;
   609			x200 = is_dma_copy_aligned(vi->dma_ch->device, 1, 1, 1);
   610	
   611			if (daddr & (dma_alignment - 1)) {
   612				vdev->tx_dst_unaligned += len;
   613				dma = false;
   614			} else if (ALIGN(len, dma_alignment) > dlen) {
   615				vdev->tx_len_unaligned += len;
   616				dma = false;
   617			}
   618		}
   619	
   620		if (!dma)
   621			goto memcpy;
   622	
   623		/*
   624		 * X100 uses DMA addresses as seen by the card so adding
   625		 * the aperture base is not required for DMA. However x200
   626		 * requires DMA addresses to be an offset into the bar so
   627		 * add the aperture base for x200.
   628		 */
   629		if (x200)
   630			daddr += vpdev->aper->pa;
   631		while (len) {
   632			partlen = min_t(size_t, len, VOP_INT_DMA_BUF_SIZE);
   633	
   634			if (copy_from_user(vvr->buf, ubuf, partlen)) {
   635				err = -EFAULT;
   636				dev_err(vop_dev(vdev), "%s %d err %d\n",
   637					__func__, __LINE__, err);
   638				goto err;
   639			}
   640			err = vop_sync_dma(vdev, daddr, vvr->buf_da,
   641					   ALIGN(partlen, dma_alignment));
   642			if (err) {
   643				dev_err(vop_dev(vdev), "%s %d err %d\n",
   644					__func__, __LINE__, err);
   645				goto err;
   646			}
   647			daddr += partlen;
   648			ubuf += partlen;
   649			dbuf += partlen;
   650			vdev->out_bytes_dma += partlen;
   651			vdev->out_bytes += partlen;
   652			len -= partlen;
   653		}
   654	memcpy:
   655		/*
   656		 * We are copying to IO below and should ideally use something
   657		 * like copy_from_user_toio(..) if it existed.
   658		 */
   659		temp = kmalloc(len, GFP_KERNEL);
   660		if (copy_from_user(temp, ubuf, len)) {
   661			err = -EFAULT;
   662			dev_err(vop_dev(vdev), "%s %d err %d\n",
   663				__func__, __LINE__, err);
   664			goto err;
   665		}
 > 666		memcpy_toio((void __force *)dbuf, temp, len);
   667		kfree(temp);
   668		vdev->out_bytes += len;
   669		err = 0;
   670	err:
   671		vpdev->hw_ops->unmap(vpdev, dbuf);
   672		dev_dbg(vop_dev(vdev),
   673			"%s: ubuf %p dbuf %p len 0x%zx vr_idx 0x%x\n",
   674			__func__, ubuf, dbuf, len, vr_idx);
   675		return err;
   676	}
   677	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 29373 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2020-09-25 11:05 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-25  7:18 [PATCH 0/4] Fix some bugs of the vop driver and mpssd user space tool Sherry Sun
2020-09-25  7:18 ` [PATCH 1/4] samples: mpssd: fix the build errors when enable DEBUG in mpssd.c Sherry Sun
2020-09-25  7:18 ` [PATCH 2/4] misc: vop: build VOP based on CONFIG_VOP Sherry Sun
2020-09-25  7:18 ` [PATCH 3/4] misc: vop: add round_up(x,4) for vring_size to avoid kernel panic Sherry Sun
2020-09-25  7:18 ` [PATCH 4/4] mic: vop: copy data to kernel space then write to io memory Sherry Sun
2020-09-25  7:32   ` Arnd Bergmann
2020-09-25  7:50     ` Sherry Sun
2020-09-25 10:55   ` kernel test robot
2020-09-25 11:03   ` kernel test robot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).