Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp4359045imm; Mon, 11 Jun 2018 10:58:40 -0700 (PDT) X-Google-Smtp-Source: ADUXVKJiBgQk81E+N6+P7OfA7S2pIRXcnXTlIFnrylbael5AaEfy4bMssG5m+SG8qN38+0u3+DlM X-Received: by 2002:a17:902:8a8c:: with SMTP id p12-v6mr231766plo.94.1528739920686; Mon, 11 Jun 2018 10:58:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1528739920; cv=none; d=google.com; s=arc-20160816; b=rnywA6Be2n2EBZie3eJzNJJ9mYgQGDmJth95ZA/yArmWabJ5uMB46GW4JgLNL9PGgx G1H1R02wdN07bsnPnsftKTNzL5At94SObNENlAH+ePMoYSK+3eMBe3hDxDUHNaqXZf8I sIHN5pJULvXyyuibNQA3caZ4d5utrMwFVtBD9zIVjY60gAqwAqIFg3zCFewjZcZsJDMI tRAo9F+/wpQ9b2/24QSaBq7URDQCN+JZORN1r0SLJn6fArYrHmuYAWHx33cyrQgZbbQN 50l97VaO35c1Tz++5UVplLptmsz74KtrvwlT1Ez3eGz+xzPQAG8S/SE6FcbiOfrCYIp4 LODA== 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 :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:arc-authentication-results; bh=yaFT8aOWhUcUrUoh8OJSxYQiczhs8e1N1FQPgz+6HGQ=; b=arWIFslNvDsqaKDKX1VidJchrLwBrm4HUSb9X/R1MpmvuSiF+3qic625aB7ddqshxl J4qgzqKaDpYDSSrHimRviPnNgQwLgn+RMGgBMwCmaBnZ3cSbk/rjDS5lid3mPbTD5byM 598rzQiBjLm0WjgBzZc4lbAYEz9wgUQJ+jUEL1G8xuOEqsc5l4uT3286lYT7vqMpEHz4 hIKuwLYkJRlVDQnU+CGRsj9XMuFzM7o9oA2TZZVL8w9D/1kKfnbU4UcG7vkDTb8MHgpz v20MfZGfSX0wyEFwv7o7JwX3tz2jd9a/w74JGLuns69QmRJpipbr0NcssxdXXkXKH02X pTmg== 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 e7-v6si27923492pgp.386.2018.06.11.10.58.26; Mon, 11 Jun 2018 10:58:40 -0700 (PDT) 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 S933908AbeFKR5K (ORCPT + 99 others); Mon, 11 Jun 2018 13:57:10 -0400 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70]:54522 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932292AbeFKR5J (ORCPT ); Mon, 11 Jun 2018 13:57:09 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id AC1811435; Mon, 11 Jun 2018 10:57:08 -0700 (PDT) Received: from [192.168.43.63] (usa-sjc-mx-foss1.foss.arm.com [217.140.101.70]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id A5C303F59D; Mon, 11 Jun 2018 10:57:01 -0700 (PDT) Subject: Re: [Xen-devel] [PATCH v2 5/9] xen/gntdev: Allow mappings for DMA buffers To: Oleksandr Andrushchenko , Stefano Stabellini , Oleksandr Andrushchenko Cc: jgross@suse.com, dongwon.kim@intel.com, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, daniel.vetter@intel.com, xen-devel@lists.xenproject.org, Boris Ostrovsky , matthew.d.roper@intel.com, linux-media@vger.kernel.org References: <20180601114132.22596-1-andr2000@gmail.com> <20180601114132.22596-6-andr2000@gmail.com> <64facf05-0a51-c3d9-9d3b-780893248628@oracle.com> <84217eac-b83b-710f-39ab-c93cad65bf9a@gmail.com> <30fa03c0-1b75-c0b1-b14f-8b52ea584e20@gmail.com> <78dc2fc4-cdac-05b7-2c34-22b69e7e009c@oracle.com> <4be24882-185d-01e3-6aa1-751e341433c7@gmail.com> <06eff3fe-3ffc-47f6-6bd6-d8f2f823b382@gmail.com> <33984b9b-966a-78bb-0472-37af23b8ba9d@arm.com> From: Julien Grall Message-ID: Date: Mon, 11 Jun 2018 18:56:57 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.8.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, On 06/11/2018 06:49 PM, Oleksandr Andrushchenko wrote: > On 06/11/2018 08:46 PM, Julien Grall wrote: >> Hi, >> >> On 06/11/2018 06:16 PM, Oleksandr Andrushchenko wrote: >>> On 06/11/2018 07:51 PM, Stefano Stabellini wrote: >>>> On Mon, 11 Jun 2018, Oleksandr Andrushchenko wrote: >>>>> On 06/08/2018 10:21 PM, Boris Ostrovsky wrote: >>>>>> On 06/08/2018 01:59 PM, Stefano Stabellini wrote: >>>>>>>>>>>>>>       @@ -325,6 +401,14 @@ static int map_grant_pages(struct >>>>>>>>>>>>>> grant_map >>>>>>>>>>>>>> *map) >>>>>>>>>>>>>>               map->unmap_ops[i].handle = >>>>>>>>>>>>>> map->map_ops[i].handle; >>>>>>>>>>>>>>               if (use_ptemod) >>>>>>>>>>>>>> map->kunmap_ops[i].handle = >>>>>>>>>>>>>> map->kmap_ops[i].handle; >>>>>>>>>>>>>> +#ifdef CONFIG_XEN_GRANT_DMA_ALLOC >>>>>>>>>>>>>> +        else if (map->dma_vaddr) { >>>>>>>>>>>>>> +            unsigned long mfn; >>>>>>>>>>>>>> + >>>>>>>>>>>>>> +            mfn = __pfn_to_mfn(page_to_pfn(map->pages[i])); >>>>>>>>>>>>> Not pfn_to_mfn()? >>>>>>>>>>>> I'd love to, but pfn_to_mfn is only defined for x86, not ARM: >>>>>>>>>>>> [1] >>>>>>>>>>>> and [2] >>>>>>>>>>>> Thus, >>>>>>>>>>>> >>>>>>>>>>>> drivers/xen/gntdev.c:408:10: error: implicit declaration of >>>>>>>>>>>> function >>>>>>>>>>>> ‘pfn_to_mfn’ [-Werror=implicit-function-declaration] >>>>>>>>>>>>         mfn = pfn_to_mfn(page_to_pfn(map->pages[i])); >>>>>>>>>>>> >>>>>>>>>>>> So, I'll keep __pfn_to_mfn >>>>>>>>>>> How will this work on non-PV x86? >>>>>>>>>> So, you mean I need: >>>>>>>>>> #ifdef CONFIG_X86 >>>>>>>>>> mfn = pfn_to_mfn(page_to_pfn(map->pages[i])); >>>>>>>>>> #else >>>>>>>>>> mfn = __pfn_to_mfn(page_to_pfn(map->pages[i])); >>>>>>>>>> #endif >>>>>>>>>> >>>>>>>>> I'd rather fix it in ARM code. Stefano, why does ARM uses the >>>>>>>>> underscored version? >>>>>>>> Do you want me to add one more patch for ARM to wrap __pfn_to_mfn >>>>>>>> with static inline for ARM? e.g. >>>>>>>> static inline ...pfn_to_mfn(...) >>>>>>>> { >>>>>>>>       __pfn_to_mfn(); >>>>>>>> } >>>>>>> A Xen on ARM guest doesn't actually know the mfns behind its own >>>>>>> pseudo-physical pages. This is why we stopped using pfn_to_mfn and >>>>>>> started using pfn_to_bfn instead, which will generally return "pfn", >>>>>>> unless the page is a foreign grant. See include/xen/arm/page.h. >>>>>>> pfn_to_bfn was also introduced on x86. For example, see the usage of >>>>>>> pfn_to_bfn in drivers/xen/swiotlb-xen.c. Otherwise, if you don't >>>>>>> care >>>>>>> about other mapped grants, you can just use pfn_to_gfn, that always >>>>>>> returns pfn. >>>>>> I think then this code needs to use pfn_to_bfn(). >>>>> Ok >>>>>> >>>>>>> Also, for your information, we support different page >>>>>>> granularities in >>>>>>> Linux as a Xen guest, see the comment at include/xen/arm/page.h: >>>>>>> >>>>>>>     /* >>>>>>>      * The pseudo-physical frame (pfn) used in all the helpers is >>>>>>> always >>>>>>> based >>>>>>>      * on Xen page granularity (i.e 4KB). >>>>>>>      * >>>>>>>      * A Linux page may be split across multiple non-contiguous >>>>>>> Xen page so >>>>>>> we >>>>>>>      * have to keep track with frame based on 4KB page granularity. >>>>>>>      * >>>>>>>      * PV drivers should never make a direct usage of those helpers >>>>>>> (particularly >>>>>>>      * pfn_to_gfn and gfn_to_pfn). >>>>>>>      */ >>>>>>> >>>>>>> A Linux page could be 64K, but a Xen page is always 4K. A granted >>>>>>> page >>>>>>> is also 4K. We have helpers to take into account the offsets to map >>>>>>> multiple Xen grants in a single Linux page, see for example >>>>>>> drivers/xen/grant-table.c:gnttab_foreach_grant. Most PV drivers have >>>>>>> been converted to be able to work with 64K pages correctly, but if I >>>>>>> remember correctly gntdev.c is the only remaining driver that >>>>>>> doesn't >>>>>>> support 64K pages yet, so you don't have to deal with it if you >>>>>>> don't >>>>>>> want to. >>>>>> I believe somewhere in this series there is a test for PAGE_SIZE vs. >>>>>> XEN_PAGE_SIZE. Right, Oleksandr? >>>>> Not in gntdev. You might have seen this in xen-drmfront/xen-sndfront, >>>>> but I didn't touch gntdev for that. Do you want me to add yet >>>>> another patch >>>>> in the series to check for that? >>>> gntdev.c is already not capable of handling PAGE_SIZE != XEN_PAGE_SIZE, >>>> so you are not going to break anything that is not already broken >>>> :-) If >>>> your new gntdev.c code relies on PAGE_SIZE == XEN_PAGE_SIZE, it >>>> might be >>>> good to add an in-code comment about it, just to make it easier to fix >>>> the whole of gntdev.c in the future. >>>> >>> Yes, I just mean I can add something like [1] as a separate patch to >>> the series, >>> so we are on the safe side here >> >> See my comment on Stefano's e-mail. I believe gntdev is able to handle >> PAGE_SIZE != XEN_PAGE_SIZE. So I would rather keep the behavior we >> have today for such case. >> > Sure, with a note that we waste most of a 64KiB page ;) That's the second definition of "64KB page" ;). In the case of grants, it is actually quite hard to merge them in a single page. So quite a few places still allocate 64KB but only map the first 4KB. You would need to rework most the grant framework (not only gntdev) to avoid that waste. Patches are welcomed. Cheers, -- Julien Grall