All of lore.kernel.org
 help / color / mirror / Atom feed
From: Oleksandr Andrushchenko <andr2000@gmail.com>
To: Boris Ostrovsky <boris.ostrovsky@oracle.com>,
	xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org,
	dri-devel@lists.freedesktop.org, linux-media@vger.kernel.org,
	jgross@suse.com, konrad.wilk@oracle.com,
	Stefano Stabellini <sstabellini@kernel.org>
Cc: daniel.vetter@intel.com, matthew.d.roper@intel.com,
	dongwon.kim@intel.com,
	Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
Subject: Re: [PATCH v2 5/9] xen/gntdev: Allow mappings for DMA buffers
Date: Fri, 8 Jun 2018 14:33:46 +0300	[thread overview]
Message-ID: <4be24882-185d-01e3-6aa1-751e341433c7__40710.0232122049$1528457566$gmane$org@gmail.com> (raw)
In-Reply-To: <78dc2fc4-cdac-05b7-2c34-22b69e7e009c@oracle.com>

On 06/08/2018 12:46 AM, Boris Ostrovsky wrote:
> (Stefano, question for you at the end)
>
> On 06/07/2018 02:39 AM, Oleksandr Andrushchenko wrote:
>> On 06/07/2018 12:19 AM, Boris Ostrovsky wrote:
>>> On 06/06/2018 04:14 AM, Oleksandr Andrushchenko wrote:
>>>> On 06/04/2018 11:12 PM, Boris Ostrovsky wrote:
>>>>> On 06/01/2018 07:41 AM, Oleksandr Andrushchenko wrote:
>>>>> @@ -121,8 +146,27 @@ static void gntdev_free_map(struct grant_map
>>>>> *map)
>>>>>         if (map == NULL)
>>>>>             return;
>>>>>     +#ifdef CONFIG_XEN_GRANT_DMA_ALLOC
>> *Option 1: kfree(map->frames);*
>>>>> +    if (map->dma_vaddr) {
>>>>> +        struct gnttab_dma_alloc_args args;
>>>>> +
>>>>> +        args.dev = map->dma_dev;
>>>>> +        args.coherent = map->dma_flags & GNTDEV_DMA_FLAG_COHERENT;
>>>>> +        args.nr_pages = map->count;
>>>>> +        args.pages = map->pages;
>>>>> +        args.frames = map->frames;
>>>>> +        args.vaddr = map->dma_vaddr;
>>>>> +        args.dev_bus_addr = map->dma_bus_addr;
>>>>> +
>>>>> +        gnttab_dma_free_pages(&args);
>> *Option 2: kfree(map->frames);*
>>>>> +    } else
>>>>> +#endif
>>>>>         if (map->pages)
>>>>>             gnttab_free_pages(map->count, map->pages);
>>>>> +
>>>>> +#ifdef CONFIG_XEN_GRANT_DMA_ALLOC
>>>>> +    kfree(map->frames);
>>>>> +#endif
>>>>>
>>>>> Can this be done under if (map->dma_vaddr) ?
>>>>>     In other words, is it
>>>>> possible for dma_vaddr to be NULL and still have unallocated frames
>>>>> pointer?
>>>> It is possible to have vaddr == NULL and frames != NULL as we
>>>> allocate frames outside of gnttab_dma_alloc_pages which
>>>> may fail. Calling kfree on NULL pointer is safe,
>>> I am not questioning safety of the code, I would like avoid another
>>> ifdef.
>> Ah, I now understand, so you are asking if we can have
>> that kfree(map->frames); in the place *Option 2* I marked above.
>> Unfortunately no: map->frames is allocated before we try to
>> allocate DMA memory, e.g. before dma_vaddr is set:
>> [...]
>>          add->frames = kcalloc(count, sizeof(add->frames[0]),
>>                        GFP_KERNEL);
>>          if (!add->frames)
>>              goto err;
>>
>> [...]
>>          if (gnttab_dma_alloc_pages(&args))
>>              goto err;
>>
>>          add->dma_vaddr = args.vaddr;
>> [...]
>> err:
>>      gntdev_free_map(add);
>>
>> So, it is possible to enter gntdev_free_map with
>> frames != NULL and dma_vaddr == NULL. Option 1 above cannot be used
>> as map->frames is needed for gnttab_dma_free_pages(&args);
>> and Option 2 cannot be used as frames != NULL and dma_vaddr == NULL.
>> Thus, I think that unfortunately we need that #ifdef.
>> Option 3 below can also be considered, but that seems to be not good
>> as we free resources in different places which looks inconsistent.
>
> I was only thinking of option 2. But if it is possible to have frames !=
> NULL and dma_vaddr == NULL then perhaps we indeed will have to live with
> the extra ifdef.
ok
>
>> Sorry if I'm still missing your point.
>>>> so
>>>> I see no reason to change this code.
>>>>>>         kfree(map->pages);
>>>>>>         kfree(map->grants);
>>>>>>         kfree(map->map_ops);
>>>>>> @@ -132,7 +176,8 @@ static void gntdev_free_map(struct grant_map
>>>>>> *map)
>>>>>>         kfree(map);
>>>>>>     }
>>>>>>     -static struct grant_map *gntdev_alloc_map(struct gntdev_priv
>>>>>> *priv, int count)
>>>>>> +static struct grant_map *gntdev_alloc_map(struct gntdev_priv *priv,
>>>>>> int count,
>>>>>> +                      int dma_flags)
>>>>>>     {
>>>>>>         struct grant_map *add;
>>>>>>         int i;
>>>>>> @@ -155,6 +200,37 @@ static struct grant_map
>>>>>> *gntdev_alloc_map(struct gntdev_priv *priv, int count)
>>>>>>             NULL == add->pages)
>>>>>>             goto err;
>>>>>>     +#ifdef CONFIG_XEN_GRANT_DMA_ALLOC
>>>>>> +    add->dma_flags = dma_flags;
>>>>>> +
>>>>>> +    /*
>>>>>> +     * Check if this mapping is requested to be backed
>>>>>> +     * by a DMA buffer.
>>>>>> +     */
>>>>>> +    if (dma_flags & (GNTDEV_DMA_FLAG_WC |
>>>>>> GNTDEV_DMA_FLAG_COHERENT)) {
>>>>>> +        struct gnttab_dma_alloc_args args;
>>>>>> +
>>>>>> +        add->frames = kcalloc(count, sizeof(add->frames[0]),
>>>>>> +                      GFP_KERNEL);
>>>>>> +        if (!add->frames)
>>>>>> +            goto err;
>>>>>> +
>>>>>> +        /* Remember the device, so we can free DMA memory. */
>>>>>> +        add->dma_dev = priv->dma_dev;
>>>>>> +
>>>>>> +        args.dev = priv->dma_dev;
>>>>>> +        args.coherent = dma_flags & GNTDEV_DMA_FLAG_COHERENT;
>>>>>> +        args.nr_pages = count;
>>>>>> +        args.pages = add->pages;
>>>>>> +        args.frames = add->frames;
>>>>>> +
>>>>>> +        if (gnttab_dma_alloc_pages(&args))
>> *Option 3: kfree(map->frames);*
>>>>>> +            goto err;
>>>>>> +
>>>>>> +        add->dma_vaddr = args.vaddr;
>>>>>> +        add->dma_bus_addr = args.dev_bus_addr;
>>>>>> +    } else
>>>>>> +#endif
>>>>>>         if (gnttab_alloc_pages(count, add->pages))
>>>>>>             goto err;
>>>>>>     @@ -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();
}
>
> -boris
>
Thank you,
Oleksandr

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

  parent reply	other threads:[~2018-06-08 11:33 UTC|newest]

Thread overview: 135+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-01 11:41 [PATCH v2 0/9] xen: dma-buf support for grant device Oleksandr Andrushchenko
2018-06-01 11:41 ` Oleksandr Andrushchenko
2018-06-01 11:41 ` [PATCH v2 1/9] xen/grant-table: Export gnttab_{alloc|free}_pages as GPL Oleksandr Andrushchenko
2018-06-01 11:41   ` Oleksandr Andrushchenko
2018-06-04  9:27   ` Juergen Gross
2018-06-04  9:27   ` Juergen Gross
2018-06-19 13:04   ` Juergen Gross
2018-06-19 13:04   ` Juergen Gross
2018-06-01 11:41 ` Oleksandr Andrushchenko
2018-06-01 11:41 ` [PATCH v2 2/9] xen/grant-table: Make set/clear page private code shared Oleksandr Andrushchenko
2018-06-01 11:41   ` Oleksandr Andrushchenko
2018-06-01 11:44   ` Oleksandr Andrushchenko
2018-06-01 11:44   ` Oleksandr Andrushchenko
2018-06-01 11:44     ` Oleksandr Andrushchenko
2018-06-04 15:43   ` Boris Ostrovsky
2018-06-04 15:43   ` Boris Ostrovsky
2018-06-01 11:41 ` Oleksandr Andrushchenko
2018-06-01 11:41 ` [PATCH v2 3/9] xen/balloon: Share common memory reservation routines Oleksandr Andrushchenko
2018-06-01 11:41 ` Oleksandr Andrushchenko
2018-06-01 11:41   ` Oleksandr Andrushchenko
2018-06-04 16:37   ` Boris Ostrovsky
2018-06-04 17:07     ` Oleksandr Andrushchenko
2018-06-04 17:07     ` Oleksandr Andrushchenko
2018-06-04 17:07       ` Oleksandr Andrushchenko
2018-06-06  7:24     ` Oleksandr Andrushchenko
2018-06-06  7:24       ` Oleksandr Andrushchenko
2018-06-06 21:09       ` Boris Ostrovsky
2018-06-07  5:32         ` Oleksandr Andrushchenko
2018-06-07  5:32         ` Oleksandr Andrushchenko
2018-06-07  5:32           ` Oleksandr Andrushchenko
2018-06-06 21:09       ` Boris Ostrovsky
2018-06-06  7:24     ` Oleksandr Andrushchenko
2018-06-04 16:37   ` Boris Ostrovsky
2018-06-01 11:41 ` [PATCH v2 4/9] xen/grant-table: Allow allocating buffers suitable for DMA Oleksandr Andrushchenko
2018-06-01 11:41 ` Oleksandr Andrushchenko
2018-06-01 11:41   ` Oleksandr Andrushchenko
2018-06-04 18:46   ` Boris Ostrovsky
2018-06-06  7:51     ` Oleksandr Andrushchenko
2018-06-06  7:51     ` Oleksandr Andrushchenko
2018-06-06  7:51       ` Oleksandr Andrushchenko
2018-06-04 18:46   ` Boris Ostrovsky
2018-06-01 11:41 ` [PATCH v2 5/9] xen/gntdev: Allow mappings for DMA buffers Oleksandr Andrushchenko
2018-06-01 11:41   ` Oleksandr Andrushchenko
2018-06-04 20:12   ` Boris Ostrovsky
2018-06-04 20:12   ` Boris Ostrovsky
2018-06-06  8:14     ` Oleksandr Andrushchenko
2018-06-06  8:14     ` [Xen-devel] " Oleksandr Andrushchenko
2018-06-06  8:14       ` Oleksandr Andrushchenko
2018-06-06 21:19       ` Boris Ostrovsky
2018-06-06 21:19       ` [Xen-devel] " Boris Ostrovsky
2018-06-07  6:39         ` Oleksandr Andrushchenko
2018-06-07  6:39         ` [Xen-devel] " Oleksandr Andrushchenko
2018-06-07  6:39           ` Oleksandr Andrushchenko
2018-06-07 21:46           ` Boris Ostrovsky
2018-06-08 11:33             ` Oleksandr Andrushchenko
2018-06-08 17:59               ` Stefano Stabellini
2018-06-08 17:59               ` [Xen-devel] " Stefano Stabellini
2018-06-08 17:59                 ` Stefano Stabellini
2018-06-08 19:21                 ` Boris Ostrovsky
2018-06-11 13:13                   ` Oleksandr Andrushchenko
2018-06-11 13:13                     ` Oleksandr Andrushchenko
2018-06-11 16:51                     ` Stefano Stabellini
2018-06-11 16:51                     ` [Xen-devel] " Stefano Stabellini
2018-06-11 16:51                       ` Stefano Stabellini
2018-06-11 17:16                       ` Oleksandr Andrushchenko
2018-06-11 17:16                       ` [Xen-devel] " Oleksandr Andrushchenko
2018-06-11 17:46                         ` Julien Grall
2018-06-11 17:49                           ` Oleksandr Andrushchenko
2018-06-11 17:56                             ` Julien Grall
2018-06-11 17:56                             ` [Xen-devel] " Julien Grall
2018-06-11 17:49                           ` Oleksandr Andrushchenko
2018-06-11 17:46                         ` Julien Grall
2018-06-11 17:41                       ` Julien Grall
2018-06-11 17:41                       ` [Xen-devel] " Julien Grall
2018-06-11 13:13                   ` Oleksandr Andrushchenko
2018-06-08 19:21                 ` Boris Ostrovsky
2018-06-08 11:33             ` Oleksandr Andrushchenko [this message]
2018-06-07 21:46           ` Boris Ostrovsky
2018-06-01 11:41 ` Oleksandr Andrushchenko
2018-06-01 11:41 ` [PATCH v2 6/9] xen/gntdev: Add initial support for dma-buf UAPI Oleksandr Andrushchenko
2018-06-01 11:41 ` Oleksandr Andrushchenko
2018-06-04 20:49   ` Boris Ostrovsky
2018-06-06  9:06     ` Oleksandr Andrushchenko
2018-06-06  9:06     ` Oleksandr Andrushchenko
2018-06-06  9:06       ` Oleksandr Andrushchenko
2018-06-06 21:32       ` Boris Ostrovsky
2018-06-06 21:32       ` Boris Ostrovsky
2018-06-07  7:17         ` Oleksandr Andrushchenko
2018-06-07  7:17         ` Oleksandr Andrushchenko
2018-06-07 22:26           ` Boris Ostrovsky
2018-06-08 11:38             ` Oleksandr Andrushchenko
2018-06-08 11:38             ` Oleksandr Andrushchenko
2018-06-08 11:38               ` Oleksandr Andrushchenko
2018-06-07 22:26           ` Boris Ostrovsky
2018-06-04 20:49   ` Boris Ostrovsky
2018-06-01 11:41 ` [PATCH v2 7/9] xen/gntdev: Implement dma-buf export functionality Oleksandr Andrushchenko
2018-06-01 11:41 ` Oleksandr Andrushchenko
2018-06-01 11:41   ` Oleksandr Andrushchenko
2018-06-04 22:07   ` Boris Ostrovsky
2018-06-06 12:10     ` Oleksandr Andrushchenko
2018-06-06 12:10     ` Oleksandr Andrushchenko
2018-06-06 12:10       ` Oleksandr Andrushchenko
2018-06-06 21:48       ` Boris Ostrovsky
2018-06-06 21:48       ` Boris Ostrovsky
2018-06-07  8:44         ` Oleksandr Andrushchenko
2018-06-07  8:44         ` Oleksandr Andrushchenko
2018-06-07  8:44           ` Oleksandr Andrushchenko
2018-06-07 22:30           ` Boris Ostrovsky
2018-06-07 22:30           ` Boris Ostrovsky
2018-06-08 11:34             ` Oleksandr Andrushchenko
2018-06-08 11:34             ` Oleksandr Andrushchenko
2018-06-08 11:34               ` Oleksandr Andrushchenko
2018-06-04 22:07   ` Boris Ostrovsky
2018-06-01 11:41 ` [PATCH v2 8/9] xen/gntdev: Implement dma-buf import functionality Oleksandr Andrushchenko
2018-06-01 11:41 ` Oleksandr Andrushchenko
2018-06-01 11:41   ` Oleksandr Andrushchenko
2018-06-04 22:28   ` Boris Ostrovsky
2018-06-04 22:28   ` Boris Ostrovsky
2018-06-06 12:38     ` Oleksandr Andrushchenko
2018-06-06 12:38     ` Oleksandr Andrushchenko
2018-06-01 11:41 ` [PATCH v2 9/9] xen/gntdev: Expose gntdev's dma-buf API for in-kernel use Oleksandr Andrushchenko
2018-06-01 11:41 ` Oleksandr Andrushchenko
2018-06-04 22:36   ` Boris Ostrovsky
2018-06-04 22:36   ` Boris Ostrovsky
2018-06-06 12:46     ` Oleksandr Andrushchenko
2018-06-06 12:46     ` Oleksandr Andrushchenko
2018-06-06 12:46       ` Oleksandr Andrushchenko
2018-06-06 21:51       ` Boris Ostrovsky
2018-06-06 21:51       ` [Xen-devel] " Boris Ostrovsky
2018-06-06 22:05         ` Dongwon Kim
2018-06-06 22:05           ` Dongwon Kim
2018-06-07  7:33           ` Oleksandr Andrushchenko
2018-06-07  7:33             ` Oleksandr Andrushchenko
2018-06-07  7:33           ` Oleksandr Andrushchenko
2018-06-06 22:05         ` Dongwon Kim

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='4be24882-185d-01e3-6aa1-751e341433c7__40710.0232122049$1528457566$gmane$org@gmail.com' \
    --to=andr2000@gmail.com \
    --cc=boris.ostrovsky@oracle.com \
    --cc=daniel.vetter@intel.com \
    --cc=dongwon.kim@intel.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=jgross@suse.com \
    --cc=konrad.wilk@oracle.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=matthew.d.roper@intel.com \
    --cc=oleksandr_andrushchenko@epam.com \
    --cc=sstabellini@kernel.org \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.