Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp1219451imu; Wed, 16 Jan 2019 15:04:20 -0800 (PST) X-Google-Smtp-Source: ALg8bN5uW8zGG6XOcuSHYfARbYZWP3s/vxNTD5gJMKJXm4b1ck71J8SJnrALekgECoE162eezqRH X-Received: by 2002:a63:e516:: with SMTP id r22mr11279187pgh.256.1547679860715; Wed, 16 Jan 2019 15:04:20 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1547679860; cv=none; d=google.com; s=arc-20160816; b=xV8kNaAg2L8SKgs6sC9ebrdgro5qdEHpR9wNnpL3Arqiep1XI6Xe/tG0oXzyazhNQo rVnlq1mY9FqeSRl1/rZ3ndwIQ9eFBQCgucTU3wBHlsukb58HHwEkSHg+h5+8GBP7WiJq IRSf4P+B62+f8HzBh0JVuhc0BSbVXNVnB0UJHGOirN5G1oEAHPP7dpVzkSrEMs34gk8V Vw1W4vzpHxVVrqxNyk9YOBPpoVyPW4rDlnjVBTLNZP4ZbSq4NMqLTHYnhjnktw2lmxcc hSnsG0Ijg7CElrttX08p4glKrAPuJM6g5HC3yX3RcGve+zknjaHCEEOZBY4ezTFTSTCl T+VQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=xjGwRPq/GkwNLxVAPa1e2y1pruhnSJ1IpdJ9VMDc1Eg=; b=TkV+sl6iThAVvqD4RAzQQUqIvJ1E68BXZBs1Qw1S59Ttd+HGuROPOgyQ3Lj7ixHG1P ACdsN+n0qJi6UGvuQE7NPAtfAb6w54wOvYYFUG+xWpQkU4sCIUNycWNlbzYb0+FO/cVN GEcXZ4FSw2N++J1GLXdxwSyy2NJg4AVL9jtpfSRLG7+6rzjO/8+dqLv//3ZEpf1MN6Us MEQsfXjVnSxnqdm6Zm25tTfhn2wq1FNvlTScCdmAXUDhsf8BfkjdS0YhTeftRgOhYsJ2 vRS7uNjDu+tstJ82lHgl58g96bOOkUgvELZV1ErmrxZ/xC7acYJDdWPeuPYJyL3Ju9fV M+SQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f10si6666285pgl.528.2019.01.16.15.03.51; Wed, 16 Jan 2019 15:04:20 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2405736AbfAPQdG (ORCPT + 99 others); Wed, 16 Jan 2019 11:33:06 -0500 Received: from bastet.se.axis.com ([195.60.68.11]:42719 "EHLO bastet.se.axis.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732087AbfAPQdD (ORCPT ); Wed, 16 Jan 2019 11:33:03 -0500 Received: from localhost (localhost [127.0.0.1]) by bastet.se.axis.com (Postfix) with ESMTP id 2B06C18511; Wed, 16 Jan 2019 17:33:01 +0100 (CET) X-Axis-User: NO X-Axis-NonUser: YES X-Virus-Scanned: Debian amavisd-new at bastet.se.axis.com Received: from bastet.se.axis.com ([IPv6:::ffff:127.0.0.1]) by localhost (bastet.se.axis.com [::ffff:127.0.0.1]) (amavisd-new, port 10024) with LMTP id fJxCxp0ph8G9; Wed, 16 Jan 2019 17:32:59 +0100 (CET) Received: from boulder02.se.axis.com (boulder02.se.axis.com [10.0.8.16]) by bastet.se.axis.com (Postfix) with ESMTPS id 3CCA81855A; Wed, 16 Jan 2019 17:32:58 +0100 (CET) Received: from boulder02.se.axis.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 277FD1A084; Wed, 16 Jan 2019 17:32:58 +0100 (CET) Received: from boulder02.se.axis.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1947A1A075; Wed, 16 Jan 2019 17:32:58 +0100 (CET) Received: from thoth.se.axis.com (unknown [10.0.2.173]) by boulder02.se.axis.com (Postfix) with ESMTP; Wed, 16 Jan 2019 17:32:58 +0100 (CET) Received: from lnxartpec.se.axis.com (lnxartpec.se.axis.com [10.88.4.9]) by thoth.se.axis.com (Postfix) with ESMTP id 06ACB3126; Wed, 16 Jan 2019 17:32:58 +0100 (CET) Received: by lnxartpec.se.axis.com (Postfix, from userid 10564) id 04A3880B46; Wed, 16 Jan 2019 17:32:58 +0100 (CET) From: Vincent Whitchurch To: sudeep.dutt@intel.com, ashutosh.dixit@intel.com, gregkh@linuxfoundation.org, arnd@arndb.de Cc: linux-kernel@vger.kernel.org, Vincent Whitchurch Subject: [PATCH 5/8] vop: vringh: Do not crash if no DMA channel Date: Wed, 16 Jan 2019 17:32:50 +0100 Message-Id: <20190116163253.23780-6-vincent.whitchurch@axis.com> X-Mailer: git-send-email 2.20.0 In-Reply-To: <20190116163253.23780-1-vincent.whitchurch@axis.com> References: <20190116163253.23780-1-vincent.whitchurch@axis.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-TM-AS-GCONF: 00 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Fallback gracefully if no DMA channel is provided instead of dereferencing NULL pointers. Signed-off-by: Vincent Whitchurch --- drivers/misc/mic/vop/vop_vringh.c | 32 +++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/drivers/misc/mic/vop/vop_vringh.c b/drivers/misc/mic/vop/vop_vringh.c index ccdfbb652123..18d6ecff1834 100644 --- a/drivers/misc/mic/vop/vop_vringh.c +++ b/drivers/misc/mic/vop/vop_vringh.c @@ -531,12 +531,12 @@ static int vop_virtio_copy_to_user(struct vop_vdev *vdev, void __user *ubuf, void __iomem *dbuf = vpdev->hw_ops->ioremap(vpdev, daddr, len); struct vop_vringh *vvr = &vdev->vvr[vr_idx]; struct vop_info *vi = dev_get_drvdata(&vpdev->dev); - size_t dma_alignment = 1 << vi->dma_ch->device->copy_align; - bool x200 = is_dma_copy_aligned(vi->dma_ch->device, 1, 1, 1); + size_t dma_alignment; + bool x200; size_t dma_offset, partlen; int err; - if (!VOP_USE_DMA) { + if (!VOP_USE_DMA || !vi->dma_ch) { if (copy_to_user(ubuf, (void __force *)dbuf, len)) { err = -EFAULT; dev_err(vop_dev(vdev), "%s %d err %d\n", @@ -548,6 +548,9 @@ static int vop_virtio_copy_to_user(struct vop_vdev *vdev, void __user *ubuf, goto err; } + dma_alignment = 1 << vi->dma_ch->device->copy_align; + x200 = is_dma_copy_aligned(vi->dma_ch->device, 1, 1, 1); + dma_offset = daddr - round_down(daddr, dma_alignment); daddr -= dma_offset; len += dma_offset; @@ -606,18 +609,23 @@ static int vop_virtio_copy_from_user(struct vop_vdev *vdev, void __user *ubuf, void __iomem *dbuf = vpdev->hw_ops->ioremap(vpdev, daddr, len); struct vop_vringh *vvr = &vdev->vvr[vr_idx]; struct vop_info *vi = dev_get_drvdata(&vdev->vpdev->dev); - size_t dma_alignment = 1 << vi->dma_ch->device->copy_align; - bool x200 = is_dma_copy_aligned(vi->dma_ch->device, 1, 1, 1); + size_t dma_alignment; + bool x200; size_t partlen; - bool dma = VOP_USE_DMA; + bool dma = VOP_USE_DMA && vi->dma_ch; int err = 0; - if (daddr & (dma_alignment - 1)) { - vdev->tx_dst_unaligned += len; - dma = false; - } else if (ALIGN(len, dma_alignment) > dlen) { - vdev->tx_len_unaligned += len; - dma = false; + if (dma) { + dma_alignment = 1 << vi->dma_ch->device->copy_align; + x200 = is_dma_copy_aligned(vi->dma_ch->device, 1, 1, 1); + + if (daddr & (dma_alignment - 1)) { + vdev->tx_dst_unaligned += len; + dma = false; + } else if (ALIGN(len, dma_alignment) > dlen) { + vdev->tx_len_unaligned += len; + dma = false; + } } if (!dma) -- 2.20.0