Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp3661958imu; Tue, 18 Dec 2018 02:00:29 -0800 (PST) X-Google-Smtp-Source: AFSGD/WmAZBONrlkKpczwsLzczRLScjduWJOFSbnJUXgVpevb87PPnrH7W/6YZdZIGLD8zAY8AFW X-Received: by 2002:a63:ea15:: with SMTP id c21mr14387514pgi.361.1545127229395; Tue, 18 Dec 2018 02:00:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1545127229; cv=none; d=google.com; s=arc-20160816; b=et2A3tgAFHZI8Xm0LkYx24ON6/HzFcYr9lJwtYsITpqBtwlqoB4w1xkcltEeRCqSGp klgoi199Z/Gq3stLxOgB9ssJYqAUKNLv1IVqFyBbcv7njuefnAwacLOGi3dMsMCQaHXA aurjAn21sSlFzFHucpdWT0Tprs6j+0U6jDZz24n0x7pNXDIY35LLqlMahfff5cCnEoJ6 Z6Z38ntpQwHAbZS0/8AbMvXis9+EVvTRCOVdYgYLC71HtH0FBotMlSJMMdIwqNszbz+r f0W6NdE+CUX95AnSxh0/zvmtYwlB5zM6kBBlIMXkHQLRcbQGpTk92qAMRqrIkPPhNw4I YzeA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature; bh=iHiwr/FMFw5Dm9zasFmVTSZRnXhmdru9eEi/AXWWkTY=; b=0/DfETKm77McYR1FNd/vJZcaaRNYEhLMg9OW9jTMM8gD00GlQG+s28aoLOJz7bT88q EcrqAkxKMpQS07i+DC/6+TQqXEQbSGY4VHBbbSPQoWc8etplSlsnLS38R0YA4c24zVCy ypCGJS1TvhgdAtD1nrq5bI94smVnLPBJMf2AE4X8eot6pOEBhccqvk9yCqtJu/rXjbMW fYzxFrxjtn0aNb5pZPWkruadarprnmfEQiPuDz2nG3fOo/aroz4re41UFN0jwyrLM1+u MVmd2VD9/ja3PmwUWf1/BCHl9RsBWB+z9y1DC92bm+FYDgv3abBb1skjA9dcvN0TePLC DsUA== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@armlinux.org.uk header.s=pandora-2014 header.b=MFKQYu7l; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=armlinux.org.uk Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b2si12499036pgq.275.2018.12.18.02.00.13; Tue, 18 Dec 2018 02:00:29 -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; dkim=fail header.i=@armlinux.org.uk header.s=pandora-2014 header.b=MFKQYu7l; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=armlinux.org.uk Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726443AbeLRJ5v (ORCPT + 99 others); Tue, 18 Dec 2018 04:57:51 -0500 Received: from pandora.armlinux.org.uk ([78.32.30.218]:39402 "EHLO pandora.armlinux.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726364AbeLRJ5v (ORCPT ); Tue, 18 Dec 2018 04:57:51 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=armlinux.org.uk; s=pandora-2014; h=Sender:In-Reply-To:Content-Type: MIME-Version:References:Message-ID:Subject:Cc:To:From:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=iHiwr/FMFw5Dm9zasFmVTSZRnXhmdru9eEi/AXWWkTY=; b=MFKQYu7lJ/BehPNauB8d8s6A0 BkI+YWIQjK+zik026CH/G8bw3sROaM0SZtvrln7+qazrQ/TU1xPwwyq9XjGeHgqO/6zWEiWwV7Qms ljKjzrjnOZAOZclTfZIW3kQT9AMvvtSRgSc12Gld5qPmGmqC99mM3ipsdpMj3WbX0vEXw=; Received: from n2100.armlinux.org.uk ([2001:4d48:ad52:3201:214:fdff:fe10:4f86]:55758) by pandora.armlinux.org.uk with esmtpsa (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.90_1) (envelope-from ) id 1gZC7t-0005RJ-53; Tue, 18 Dec 2018 09:57:21 +0000 Received: from linux by n2100.armlinux.org.uk with local (Exim 4.90_1) (envelope-from ) id 1gZC7l-0005fh-Dp; Tue, 18 Dec 2018 09:57:13 +0000 Date: Tue, 18 Dec 2018 09:57:09 +0000 From: Russell King - ARM Linux To: Souptick Joarder Cc: akpm@linux-foundation.org, willy@infradead.org, mhocko@suse.com, hjc@rock-chips.com, heiko@sntech.de, airlied@linux.ie, linux-mm@kvack.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org Subject: Re: [PATCH v4 4/9] drm/rockchip/rockchip_drm_gem.c: Convert to use vm_insert_range Message-ID: <20181218095709.GJ26090@n2100.armlinux.org.uk> References: <20181217202334.GA11758@jordon-HP-15-Notebook-PC> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20181217202334.GA11758@jordon-HP-15-Notebook-PC> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Dec 18, 2018 at 01:53:34AM +0530, Souptick Joarder wrote: > Convert to use vm_insert_range() to map range of kernel > memory to user vma. > > Signed-off-by: Souptick Joarder > Tested-by: Heiko Stuebner > Acked-by: Heiko Stuebner > --- > drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 19 ++----------------- > 1 file changed, 2 insertions(+), 17 deletions(-) > > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c > index a8db758..8279084 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c > @@ -221,26 +221,11 @@ static int rockchip_drm_gem_object_mmap_iommu(struct drm_gem_object *obj, > struct vm_area_struct *vma) > { > struct rockchip_gem_object *rk_obj = to_rockchip_obj(obj); > - unsigned int i, count = obj->size >> PAGE_SHIFT; > unsigned long user_count = vma_pages(vma); > - unsigned long uaddr = vma->vm_start; > unsigned long offset = vma->vm_pgoff; > - unsigned long end = user_count + offset; > - int ret; > - > - if (user_count == 0) > - return -ENXIO; > - if (end > count) > - return -ENXIO; > > - for (i = offset; i < end; i++) { > - ret = vm_insert_page(vma, uaddr, rk_obj->pages[i]); > - if (ret) > - return ret; > - uaddr += PAGE_SIZE; > - } > - > - return 0; > + return vm_insert_range(vma, vma->vm_start, rk_obj->pages + offset, > + user_count - offset); This looks like a change in behaviour. If user_count is zero, and offset is zero, then we pass into vm_insert_range() a page_count of zero, and vm_insert_range() does nothing and returns zero. However, as we can see from the above code, the original behaviour was to return -ENXIO in that case. The other thing that I'm wondering is that if (eg) count is 8 (the object is 8 pages), offset is 2, and the user requests mapping 6 pages (user_count = 6), then we call vm_insert_range() with a pages of rk_obj->pages + 2, and a pages_count of 6 - 2 = 4. So we end up inserting four pages. The original code would calculate end = 6 + 2 = 8. i would iterate from 2 through 8, inserting six pages. (I hadn't spotted that second issue until I'd gone through the calculations manually - which is worrying.) I don't have patches 5 through 9 to look at, but I'm concerned that similar issues also exist in those patches. I'm concerned that this series seems to be introducing subtle bugs, it seems to be unnecessarily difficult to use this function correctly. I think your existing proposal for vm_insert_range() provides an interface that is way too easy to get wrong, and, therefore, is the wrong interface. I think it would be way better to have vm_insert_range() take the object page array without any offset adjustment, and the object page_count again without any adjustment, and have vm_insert_range() itself handle the offsetting and VMA size validation. That would then give a simple interface and probably give a further reduction in code at each call site. Thanks. -- RMK's Patch system: http://www.armlinux.org.uk/developer/patches/ FTTC broadband for 0.8mile line in suburbia: sync at 12.1Mbps down 622kbps up According to speedtest.net: 11.9Mbps down 500kbps up