Skip to content

Commit 6f36ede

Browse files
SherrySun5gregkh
authored andcommitted
mic: vop: copy data to kernel space then write to io memory
[ Upstream commit 675f0ad ] 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> Link: https://lore.kernel.org/r/20200929091106.24624-5-sherry.sun@nxp.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 40cd98e commit 6f36ede

1 file changed

Lines changed: 14 additions & 6 deletions

File tree

drivers/misc/mic/vop/vop_vringh.c

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,7 @@ static int vop_virtio_copy_from_user(struct vop_vdev *vdev, void __user *ubuf,
602602
size_t partlen;
603603
bool dma = VOP_USE_DMA && vi->dma_ch;
604604
int err = 0;
605+
size_t offset = 0;
605606

606607
if (dma) {
607608
dma_alignment = 1 << vi->dma_ch->device->copy_align;
@@ -655,13 +656,20 @@ static int vop_virtio_copy_from_user(struct vop_vdev *vdev, void __user *ubuf,
655656
* We are copying to IO below and should ideally use something
656657
* like copy_from_user_toio(..) if it existed.
657658
*/
658-
if (copy_from_user((void __force *)dbuf, ubuf, len)) {
659-
err = -EFAULT;
660-
dev_err(vop_dev(vdev), "%s %d err %d\n",
661-
__func__, __LINE__, err);
662-
goto err;
659+
while (len) {
660+
partlen = min_t(size_t, len, VOP_INT_DMA_BUF_SIZE);
661+
662+
if (copy_from_user(vvr->buf, ubuf + offset, partlen)) {
663+
err = -EFAULT;
664+
dev_err(vop_dev(vdev), "%s %d err %d\n",
665+
__func__, __LINE__, err);
666+
goto err;
667+
}
668+
memcpy_toio(dbuf + offset, vvr->buf, partlen);
669+
offset += partlen;
670+
vdev->out_bytes += partlen;
671+
len -= partlen;
663672
}
664-
vdev->out_bytes += len;
665673
err = 0;
666674
err:
667675
vpdev->hw_ops->unmap(vpdev, dbuf);

0 commit comments

Comments
 (0)