From: Thomas Zimmermann <tzimmermann@suse.de>
To: Lucas De Marchi <lucas.demarchi@intel.com>
Cc: intel-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org,
dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org,
"Christian König" <christian.koenig@amd.com>,
linux-media@vger.kernel.org
Subject: Re: [Intel-gfx] [PATCH 02/19] dma-buf-map: Add helper to initialize second map
Date: Fri, 28 Jan 2022 09:15:44 +0100 [thread overview]
Message-ID: <f033228e-c914-efb0-534c-41fc3344f272@suse.de> (raw)
In-Reply-To: <20220127155913.vt7a74zmsglghzom@ldmartin-desk2>
[-- Attachment #1.1: Type: text/plain, Size: 5878 bytes --]
Hi
Am 27.01.22 um 16:59 schrieb Lucas De Marchi:
> On Thu, Jan 27, 2022 at 03:33:12PM +0100, Thomas Zimmermann wrote:
>>
>>
>> Am 26.01.22 um 21:36 schrieb Lucas De Marchi:
>>> When dma_buf_map struct is passed around, it's useful to be able to
>>> initialize a second map that takes care of reading/writing to an offset
>>> of the original map.
>>>
>>> Add a helper that copies the struct and add the offset to the proper
>>> address.
>>>
>>> Cc: Sumit Semwal <sumit.semwal@linaro.org>
>>> Cc: Christian König <christian.koenig@amd.com>
>>> Cc: linux-media@vger.kernel.org
>>> Cc: dri-devel@lists.freedesktop.org
>>> Cc: linaro-mm-sig@lists.linaro.org
>>> Cc: linux-kernel@vger.kernel.org
>>> Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
>>> ---
>>> include/linux/dma-buf-map.h | 29 +++++++++++++++++++++++++++++
>>> 1 file changed, 29 insertions(+)
>>>
>>> diff --git a/include/linux/dma-buf-map.h b/include/linux/dma-buf-map.h
>>> index 65e927d9ce33..3514a859f628 100644
>>> --- a/include/linux/dma-buf-map.h
>>> +++ b/include/linux/dma-buf-map.h
>>> @@ -131,6 +131,35 @@ struct dma_buf_map {
>>> .is_iomem = false, \
>>> }
>>> +/**
>>> + * DMA_BUF_MAP_INIT_OFFSET - Initializes struct dma_buf_map from
>>> another dma_buf_map
>>> + * @map_: The dma-buf mapping structure to copy from
>>> + * @offset: Offset to add to the other mapping
>>> + *
>>> + * Initializes a new dma_buf_struct based on another. This is the
>>> equivalent of doing:
>>> + *
>>> + * .. code-block: c
>>> + *
>>> + * dma_buf_map map = other_map;
>>> + * dma_buf_map_incr(&map, &offset);
>>> + *
>>> + * Example usage:
>>> + *
>>> + * .. code-block: c
>>> + *
>>> + * void foo(struct device *dev, struct dma_buf_map *base_map)
>>> + * {
>>> + * ...
>>> + * struct dma_buf_map = DMA_BUF_MAP_INIT_OFFSET(base_map,
>>> FIELD_OFFSET);
>>> + * ...
>>> + * }
>>> + */
>>> +#define DMA_BUF_MAP_INIT_OFFSET(map_, offset_) (struct
>>> dma_buf_map) \
>>> + { \
>>> + .vaddr = (map_)->vaddr + (offset_), \
>>> + .is_iomem = (map_)->is_iomem, \
>>> + }
>>> +
>>
>> It's illegal to access .vaddr with raw pointer. Always use a
>> dma_buf_memcpy_() interface. So why would you need this macro when you
>> have dma_buf_memcpy_*() with an offset parameter?
>
> I did a better job with an example in
> 20220127093332.wnkd2qy4tvwg5i5l@ldmartin-desk2
>
> While doing this series I had code like this when using the API in a
> function to
> parse/update part of the struct mapped:
>
> int bla_parse_foo(struct dma_buf_map *bla_map)
> {
> struct dma_buf_map foo_map = *bla_map;
> ...
>
> dma_buf_map_incr(&foo_map, offsetof(struct bla, foo));
>
> ...
> }
>
> Pasting the rest of the reply here:
>
> I had exactly this code above, but after writting quite a few patches
> using it, particularly with functions that have to write to 2 maps (see
> patch 6 for example), it felt much better to have something to
> initialize correctly from the start
>
> struct dma_buf_map other_map = *bla_map;
> /* poor Lucas forgetting dma_buf_map_incr(map, offsetof(...)); */
>
> is error prone and hard to debug since you will be reading/writting
> from/to another location rather than exploding
Indeed. We have soem very specific use cases in graphics code, when
dma_buf_map_incr() makes sense. But it's really bad for others. I guess
that the docs should talk about this.
>
> While with the construct below
>
> other_map;
> ...
> other_map = INITIALIZER()
>
> I can rely on the compiler complaining about uninitialized var. And
> in most of the cases I can just have this single line in the beggining
> of the
> function when the offset is constant:
>
> struct dma_buf_map other_map = INITIALIZER(bla_map, offsetof(..));
>
>
> This is useful when you have several small functions in charge of
> updating/reading inner struct members.
You won't need an extra variable or the initializer macro if you add an
offset parameter to dma_buf_memcpy_{from,to}. Simple pass offsetof(..)
to that parameter and it will do the right thing.
It avoids the problems of the current macro and is even more flexible.
On top of that, you can build whatever convenience macros you need for i915.
Best regards
Thomas
>
>>
>> I've also been very careful to distinguish between .vaddr and
>> .vaddr_iomem, even in places where I wouldn't have to. This macro
>> breaks the assumption.
>
> That's one reason I think if we have this macro, it should be in the
> dma_buf_map.h header (or whatever we rename these APIs to). It's the
> only place where we can safely add code that relies on the implementation
> of the "private" fields in struct dma_buf_map.
>
> Lucas De Marchi
>
>>
>> Best regards
>> Thomas
>>
>>> /**
>>> * dma_buf_map_set_vaddr - Sets a dma-buf mapping structure to an
>>> address in system memory
>>> * @map: The dma-buf mapping structure
>>
>> --
>> Thomas Zimmermann
>> Graphics Driver Developer
>> SUSE Software Solutions Germany GmbH
>> Maxfeldstr. 5, 90409 Nürnberg, Germany
>> (HRB 36809, AG Nürnberg)
>> Geschäftsführer: Ivo Totev
>
>
>
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Maxfeldstr. 5, 90409 Nürnberg, Germany
(HRB 36809, AG Nürnberg)
Geschäftsführer: Ivo Totev
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 840 bytes --]
next prev parent reply other threads:[~2022-01-28 8:15 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-26 20:36 [PATCH 00/19] drm/i915/guc: Refactor ADS access to use dma_buf_map Lucas De Marchi
2022-01-26 20:36 ` [PATCH 01/19] dma-buf-map: Add read/write helpers Lucas De Marchi
2022-01-27 7:24 ` Christian König
2022-01-27 7:36 ` Matthew Brost
2022-01-27 7:59 ` Christian König
2022-01-27 9:02 ` [Intel-gfx] " Daniel Vetter
2022-01-27 14:26 ` Thomas Zimmermann
2022-01-27 16:34 ` Lucas De Marchi
2022-01-28 8:32 ` Thomas Zimmermann
2022-01-26 20:36 ` [PATCH 02/19] dma-buf-map: Add helper to initialize second map Lucas De Marchi
2022-01-27 7:27 ` Christian König
2022-01-27 7:57 ` Lucas De Marchi
2022-01-27 8:02 ` Christian König
2022-01-27 8:18 ` [Intel-gfx] " Lucas De Marchi
2022-01-27 8:55 ` Christian König
2022-01-27 9:12 ` Lucas De Marchi
2022-01-27 9:21 ` Christian König
2022-01-27 8:57 ` Daniel Vetter
2022-01-27 9:33 ` [Intel-gfx] " Lucas De Marchi
2022-01-27 10:00 ` Daniel Vetter
2022-01-27 10:21 ` Christian König
2022-01-27 11:16 ` Daniel Vetter
2022-01-27 11:44 ` [Linaro-mm-sig] " Christian König
2022-01-27 11:56 ` Daniel Vetter
2022-01-27 16:13 ` Lucas De Marchi
2022-01-27 14:52 ` Thomas Zimmermann
2022-01-27 16:12 ` Lucas De Marchi
2022-01-27 14:33 ` Thomas Zimmermann
2022-01-27 15:59 ` [Intel-gfx] " Lucas De Marchi
2022-01-28 8:15 ` Thomas Zimmermann [this message]
2022-01-28 8:34 ` Thomas Zimmermann
2022-01-26 20:36 ` [PATCH 09/19] dma-buf-map: Add wrapper over memset Lucas De Marchi
2022-01-27 7:28 ` Christian König
2022-01-27 14:54 ` Thomas Zimmermann
2022-01-27 15:38 ` [Intel-gfx] " Lucas De Marchi
2022-01-27 15:47 ` Thomas Zimmermann
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=f033228e-c914-efb0-534c-41fc3344f272@suse.de \
--to=tzimmermann@suse.de \
--cc=christian.koenig@amd.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=intel-gfx@lists.freedesktop.org \
--cc=linaro-mm-sig@lists.linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=lucas.demarchi@intel.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox