2018-11-05 03:29:05

by Sabyasachi Gupta

[permalink] [raw]
Subject: [PATCH] arch/powerpc: Use dma_zalloc_coherent

Replaced dma_alloc_coherent + memset with dma_zalloc_coherent

Signed-off-by: Sabyasachi Gupta <[email protected]>
---
arch/powerpc/platforms/pasemi/dma_lib.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/arch/powerpc/platforms/pasemi/dma_lib.c b/arch/powerpc/platforms/pasemi/dma_lib.c
index 53384eb..d18d164 100644
--- a/arch/powerpc/platforms/pasemi/dma_lib.c
+++ b/arch/powerpc/platforms/pasemi/dma_lib.c
@@ -255,15 +255,13 @@ int pasemi_dma_alloc_ring(struct pasemi_dmachan *chan, int ring_size)

chan->ring_size = ring_size;

- chan->ring_virt = dma_alloc_coherent(&dma_pdev->dev,
+ chan->ring_virt = dma_zalloc_coherent(&dma_pdev->dev,
ring_size * sizeof(u64),
&chan->ring_dma, GFP_KERNEL);

if (!chan->ring_virt)
return -ENOMEM;

- memset(chan->ring_virt, 0, ring_size * sizeof(u64));
-
return 0;
}
EXPORT_SYMBOL(pasemi_dma_alloc_ring);
--
2.7.4



2018-11-15 18:03:16

by Sabyasachi Gupta

[permalink] [raw]
Subject: Re: [PATCH] arch/powerpc: Use dma_zalloc_coherent

On Mon, Nov 5, 2018 at 8:58 AM Sabyasachi Gupta
<[email protected]> wrote:
>
> Replaced dma_alloc_coherent + memset with dma_zalloc_coherent
>
> Signed-off-by: Sabyasachi Gupta <[email protected]>

Any comment on this patch?

> ---
> arch/powerpc/platforms/pasemi/dma_lib.c | 4 +---
> 1 file changed, 1 insertion(+), 3 deletions(-)
>
> diff --git a/arch/powerpc/platforms/pasemi/dma_lib.c b/arch/powerpc/platforms/pasemi/dma_lib.c
> index 53384eb..d18d164 100644
> --- a/arch/powerpc/platforms/pasemi/dma_lib.c
> +++ b/arch/powerpc/platforms/pasemi/dma_lib.c
> @@ -255,15 +255,13 @@ int pasemi_dma_alloc_ring(struct pasemi_dmachan *chan, int ring_size)
>
> chan->ring_size = ring_size;
>
> - chan->ring_virt = dma_alloc_coherent(&dma_pdev->dev,
> + chan->ring_virt = dma_zalloc_coherent(&dma_pdev->dev,
> ring_size * sizeof(u64),
> &chan->ring_dma, GFP_KERNEL);
>
> if (!chan->ring_virt)
> return -ENOMEM;
>
> - memset(chan->ring_virt, 0, ring_size * sizeof(u64));
> -
> return 0;
> }
> EXPORT_SYMBOL(pasemi_dma_alloc_ring);
> --
> 2.7.4
>

2018-11-15 19:27:44

by Joe Perches

[permalink] [raw]
Subject: Re: [PATCH] arch/powerpc: Use dma_zalloc_coherent

On Thu, 2018-11-15 at 23:29 +0530, Sabyasachi Gupta wrote:
> On Mon, Nov 5, 2018 at 8:58 AM Sabyasachi Gupta
> <[email protected]> wrote:
> > Replaced dma_alloc_coherent + memset with dma_zalloc_coherent
> >
> > Signed-off-by: Sabyasachi Gupta <[email protected]>
>
> Any comment on this patch?

It's obviously correct.

You might realign the arguments on the next lines
to the open parenthesis.

Perhaps there should be new function calls
added for symmetry to the other alloc functions
for multiplication overflow protection.

Perhaps:

void *dma_alloc_array_coherent()
void *dma_calloc_coherent()

Something like
---
include/linux/dma-mapping.h | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)

diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
index 15bd41447025..95bebf8883b1 100644
--- a/include/linux/dma-mapping.h
+++ b/include/linux/dma-mapping.h
@@ -565,6 +565,25 @@ static inline void *dma_alloc_coherent(struct device *dev, size_t size,
(gfp & __GFP_NOWARN) ? DMA_ATTR_NO_WARN : 0);
}

+static inline void *dma_alloc_array_coherent(struct device *dev,
+ size_t n, size_t size,
+ dma_addr_t *dma_handle, gfp_t gfp)
+{
+ size_t bytes;
+
+ if (unlikely(check_mul_overflow(n, size, &bytes)))
+ return NULL;
+ return dma_alloc_coherent(dev, bytes, dma_handle, gfp);
+}
+
+static inline void *dma_calloc_coherent(struct device *dev,
+ size_t n, size_t size,
+ dma_addr_t *dma_handle, gfp_t gfp)
+{
+ return dma_alloc_array_coherent(dev, n, size, dma_handle,
+ gfp | __GFP_ZERO);
+}
+
static inline void dma_free_coherent(struct device *dev, size_t size,
void *cpu_addr, dma_addr_t dma_handle)
{

---
> > diff --git a/arch/powerpc/platforms/pasemi/dma_lib.c b/arch/powerpc/platforms/pasemi/dma_lib.c
[]
> > @@ -255,15 +255,13 @@ int pasemi_dma_alloc_ring(struct pasemi_dmachan *chan, int ring_size)
> >
> > chan->ring_size = ring_size;
> >
> > - chan->ring_virt = dma_alloc_coherent(&dma_pdev->dev,
> > + chan->ring_virt = dma_zalloc_coherent(&dma_pdev->dev,
> > ring_size * sizeof(u64),
> > &chan->ring_dma, GFP_KERNEL);
> > en
> > if (!chan->ring_virt)
> > return -ENOMEM;
> >
> > - memset(chan->ring_virt, 0, ring_size * sizeof(u64));
> > -
> > return 0;
> > }
> > EXPORT_SYMBOL(pasemi_dma_alloc_ring);



2018-11-16 10:08:58

by Michael Ellerman

[permalink] [raw]
Subject: Re: [PATCH] arch/powerpc: Use dma_zalloc_coherent

Sabyasachi Gupta <[email protected]> writes:

> On Mon, Nov 5, 2018 at 8:58 AM Sabyasachi Gupta
> <[email protected]> wrote:
>>
>> Replaced dma_alloc_coherent + memset with dma_zalloc_coherent
>>
>> Signed-off-by: Sabyasachi Gupta <[email protected]>
>
> Any comment on this patch?

Wait longer :)

I'm still chasing bugs in 4.20-rc2, I haven't started merging many
patches for 4.21 yet.

Your patches are tracked in patchwork here:
https://patchwork.ozlabs.org/project/linuxppc-dev/list/?submitter=75253


If they're still in "new" state around rc5 then feel free to ping me
again.

cheers


>> diff --git a/arch/powerpc/platforms/pasemi/dma_lib.c b/arch/powerpc/platforms/pasemi/dma_lib.c
>> index 53384eb..d18d164 100644
>> --- a/arch/powerpc/platforms/pasemi/dma_lib.c
>> +++ b/arch/powerpc/platforms/pasemi/dma_lib.c
>> @@ -255,15 +255,13 @@ int pasemi_dma_alloc_ring(struct pasemi_dmachan *chan, int ring_size)
>>
>> chan->ring_size = ring_size;
>>
>> - chan->ring_virt = dma_alloc_coherent(&dma_pdev->dev,
>> + chan->ring_virt = dma_zalloc_coherent(&dma_pdev->dev,
>> ring_size * sizeof(u64),
>> &chan->ring_dma, GFP_KERNEL);
>>
>> if (!chan->ring_virt)
>> return -ENOMEM;
>>
>> - memset(chan->ring_virt, 0, ring_size * sizeof(u64));
>> -
>> return 0;
>> }
>> EXPORT_SYMBOL(pasemi_dma_alloc_ring);
>> --
>> 2.7.4
>>

2018-11-17 07:08:55

by Souptick Joarder

[permalink] [raw]
Subject: Re: [PATCH] arch/powerpc: Use dma_zalloc_coherent

Hi Joe,

On Fri, Nov 16, 2018 at 12:55 AM Joe Perches <[email protected]> wrote:
>
> On Thu, 2018-11-15 at 23:29 +0530, Sabyasachi Gupta wrote:
> > On Mon, Nov 5, 2018 at 8:58 AM Sabyasachi Gupta
> > <[email protected]> wrote:
> > > Replaced dma_alloc_coherent + memset with dma_zalloc_coherent
> > >
> > > Signed-off-by: Sabyasachi Gupta <[email protected]>
> >
> > Any comment on this patch?
>
> It's obviously correct.
>
> You might realign the arguments on the next lines
> to the open parenthesis.
>
> Perhaps there should be new function calls
> added for symmetry to the other alloc functions
> for multiplication overflow protection.
>
> Perhaps:
>
> void *dma_alloc_array_coherent()
> void *dma_calloc_coherent()
>
> Something like
> ---
> include/linux/dma-mapping.h | 19 +++++++++++++++++++
> 1 file changed, 19 insertions(+)
>
> diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
> index 15bd41447025..95bebf8883b1 100644
> --- a/include/linux/dma-mapping.h
> +++ b/include/linux/dma-mapping.h
> @@ -565,6 +565,25 @@ static inline void *dma_alloc_coherent(struct device *dev, size_t size,
> (gfp & __GFP_NOWARN) ? DMA_ATTR_NO_WARN : 0);
> }
>
> +static inline void *dma_alloc_array_coherent(struct device *dev,
> + size_t n, size_t size,
> + dma_addr_t *dma_handle, gfp_t gfp)
> +{
> + size_t bytes;
> +
> + if (unlikely(check_mul_overflow(n, size, &bytes)))
> + return NULL;
> + return dma_alloc_coherent(dev, bytes, dma_handle, gfp);
> +}
> +
> +static inline void *dma_calloc_coherent(struct device *dev,
> + size_t n, size_t size,
> + dma_addr_t *dma_handle, gfp_t gfp)
> +{
> + return dma_alloc_array_coherent(dev, n, size, dma_handle,
> + gfp | __GFP_ZERO);
> +}
> +

If I understood correctly, you are talking about adding these 2 new inline
functions. We can do that.

Can you please help to understand the consumers of these 2 new inline ?

> static inline void dma_free_coherent(struct device *dev, size_t size,
> void *cpu_addr, dma_addr_t dma_handle)
> {
>
> ---
> > > diff --git a/arch/powerpc/platforms/pasemi/dma_lib.c b/arch/powerpc/platforms/pasemi/dma_lib.c
> []
> > > @@ -255,15 +255,13 @@ int pasemi_dma_alloc_ring(struct pasemi_dmachan *chan, int ring_size)
> > >
> > > chan->ring_size = ring_size;
> > >
> > > - chan->ring_virt = dma_alloc_coherent(&dma_pdev->dev,
> > > + chan->ring_virt = dma_zalloc_coherent(&dma_pdev->dev,
> > > ring_size * sizeof(u64),
> > > &chan->ring_dma, GFP_KERNEL);
> > > en
> > > if (!chan->ring_virt)
> > > return -ENOMEM;
> > >
> > > - memset(chan->ring_virt, 0, ring_size * sizeof(u64));
> > > -
> > > return 0;
> > > }
> > > EXPORT_SYMBOL(pasemi_dma_alloc_ring);
>
>

2018-11-17 08:27:33

by Joe Perches

[permalink] [raw]
Subject: Re: [PATCH] arch/powerpc: Use dma_zalloc_coherent

On Sat, 2018-11-17 at 12:40 +0530, Souptick Joarder wrote:
> Hi Joe,

Hi back.

> On Fri, Nov 16, 2018 at 12:55 AM Joe Perches <[email protected]> wrote:
> > On Thu, 2018-11-15 at 23:29 +0530, Sabyasachi Gupta wrote:
> > > On Mon, Nov 5, 2018 at 8:58 AM Sabyasachi Gupta
> > > <[email protected]> wrote:
> > > > Replaced dma_alloc_coherent + memset with dma_zalloc_coherent
> > > >
> > > > Signed-off-by: Sabyasachi Gupta <[email protected]>
> > >
> > > Any comment on this patch?
> >
> > It's obviously correct.
> >
> > You might realign the arguments on the next lines
> > to the open parenthesis.
> >
> > Perhaps there should be new function calls
> > added for symmetry to the other alloc functions
> > for multiplication overflow protection.
> >
> > Perhaps:
> >
> > void *dma_alloc_array_coherent()
> > void *dma_calloc_coherent()
> >
> > Something like
> > ---
> > include/linux/dma-mapping.h | 19 +++++++++++++++++++
> > 1 file changed, 19 insertions(+)
> >
> > diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
> > index 15bd41447025..95bebf8883b1 100644
> > --- a/include/linux/dma-mapping.h
> > +++ b/include/linux/dma-mapping.h
> > @@ -565,6 +565,25 @@ static inline void *dma_alloc_coherent(struct device *dev, size_t size,
> > (gfp & __GFP_NOWARN) ? DMA_ATTR_NO_WARN : 0);
> > }
> >
> > +static inline void *dma_alloc_array_coherent(struct device *dev,
> > + size_t n, size_t size,
> > + dma_addr_t *dma_handle, gfp_t gfp)
> > +{
> > + size_t bytes;
> > +
> > + if (unlikely(check_mul_overflow(n, size, &bytes)))
> > + return NULL;
> > + return dma_alloc_coherent(dev, bytes, dma_handle, gfp);
> > +}
> > +
> > +static inline void *dma_calloc_coherent(struct device *dev,
> > + size_t n, size_t size,
> > + dma_addr_t *dma_handle, gfp_t gfp)
> > +{
> > + return dma_alloc_array_coherent(dev, n, size, dma_handle,
> > + gfp | __GFP_ZERO);
> > +}
> > +
>
> If I understood correctly, you are talking about adding these 2 new inline
> functions. We can do that.
>
> Can you please help to understand the consumers of these 2 new inline ?

Any call to dma_alloc_coherent with a multiply
_might_overflow the multiplication. The
check_mul_overflow simply avoids the overflow.



2018-11-27 13:03:45

by Michael Ellerman

[permalink] [raw]
Subject: Re: arch/powerpc: Use dma_zalloc_coherent

On Mon, 2018-11-05 at 03:28:23 UTC, Sabyasachi Gupta wrote:
> Replaced dma_alloc_coherent + memset with dma_zalloc_coherent
>
> Signed-off-by: Sabyasachi Gupta <[email protected]>

Applied to powerpc next, thanks.

https://git.kernel.org/powerpc/c/c3d6a64bd1e82ea486bff46b17d540

cheers