diff mbox series

counter: fix privdata alignment

Message ID 20240205-counter-align-fix-v1-1-4821ced960ab@analog.com (mailing list archive)
State Changes Requested
Headers show
Series counter: fix privdata alignment | expand

Commit Message

Nuno Sa via B4 Relay Feb. 5, 2024, 3:58 p.m. UTC
From: Nuno Sa <nuno.sa@analog.com>

Aligning to the L1 cache does guarantee the same alignment as kmallocing
an object [1]. Furthermore, in some platforms, that alignment is not
sufficient for DMA safety (in case someone wants to have a DMA safe
buffer in privdata) [2].

Sometime ago, we had the same fixes in IIO.

[1]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/base/devres.c#n35
[2]: https://lore.kernel.org/linux-iio/20220508175712.647246-2-jic23@kernel.org/

Fixes: c18e2760308e ("counter: Provide alternative counter registration functions")
Signed-off-by: Nuno Sa <nuno.sa@analog.com>
---
William, if you prefer, we can do something like in IIO and add a
specific COUNTER_DMA_MINALIGN define
---
 drivers/counter/counter-core.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)


---
base-commit: 6613476e225e090cc9aad49be7fa504e290dd33d
change-id: 20240205-counter-align-fix-3faebfb572af
--

Thanks!
- Nuno Sá

Comments

William Breathitt Gray Feb. 8, 2024, 6:34 p.m. UTC | #1
On Mon, Feb 05, 2024 at 04:58:14PM +0100, Nuno Sa via B4 Relay wrote:
> From: Nuno Sa <nuno.sa@analog.com>
> 
> Aligning to the L1 cache does guarantee the same alignment as kmallocing
> an object [1]. Furthermore, in some platforms, that alignment is not
> sufficient for DMA safety (in case someone wants to have a DMA safe
> buffer in privdata) [2].
> 
> Sometime ago, we had the same fixes in IIO.
> 
> [1]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/base/devres.c#n35
> [2]: https://lore.kernel.org/linux-iio/20220508175712.647246-2-jic23@kernel.org/
> 
> Fixes: c18e2760308e ("counter: Provide alternative counter registration functions")
> Signed-off-by: Nuno Sa <nuno.sa@analog.com>
> ---
> William, if you prefer, we can do something like in IIO and add a
> specific COUNTER_DMA_MINALIGN define
> ---
>  drivers/counter/counter-core.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/counter/counter-core.c b/drivers/counter/counter-core.c
> index 09c77afb33ca..073bf6b67a57 100644
> --- a/drivers/counter/counter-core.c
> +++ b/drivers/counter/counter-core.c
> @@ -34,7 +34,7 @@ struct counter_device_allochelper {
>  	 * This is cache line aligned to ensure private data behaves like if it
>  	 * were kmalloced separately.
>  	 */
> -	unsigned long privdata[] ____cacheline_aligned;
> +	unsigned long privdata[] __aligned(ARCH_DMA_MINALIGN);
>  };
>  
>  static void counter_device_release(struct device *dev)
> 
> ---
> base-commit: 6613476e225e090cc9aad49be7fa504e290dd33d
> change-id: 20240205-counter-align-fix-3faebfb572af
> --
> 
> Thanks!
> - Nuno Sá

Hi Nunon,

This change sounds reasonable, but should the comment block above
privdata be updated to reflect the change?

Sincerely,

William Breathitt Gray
Nuno Sá Feb. 9, 2024, 7:42 a.m. UTC | #2
On Thu, 2024-02-08 at 13:34 -0500, William Breathitt Gray wrote:
> On Mon, Feb 05, 2024 at 04:58:14PM +0100, Nuno Sa via B4 Relay wrote:
> > From: Nuno Sa <nuno.sa@analog.com>
> > 
> > Aligning to the L1 cache does guarantee the same alignment as kmallocing
> > an object [1]. Furthermore, in some platforms, that alignment is not
> > sufficient for DMA safety (in case someone wants to have a DMA safe
> > buffer in privdata) [2].
> > 
> > Sometime ago, we had the same fixes in IIO.
> > 
> > [1]:
> > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/base/devres.c#n35
> > [2]:
> > https://lore.kernel.org/linux-iio/20220508175712.647246-2-jic23@kernel.org/
> > 
> > Fixes: c18e2760308e ("counter: Provide alternative counter registration
> > functions")
> > Signed-off-by: Nuno Sa <nuno.sa@analog.com>
> > ---
> > William, if you prefer, we can do something like in IIO and add a
> > specific COUNTER_DMA_MINALIGN define
> > ---
> >  drivers/counter/counter-core.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/drivers/counter/counter-core.c b/drivers/counter/counter-core.c
> > index 09c77afb33ca..073bf6b67a57 100644
> > --- a/drivers/counter/counter-core.c
> > +++ b/drivers/counter/counter-core.c
> > @@ -34,7 +34,7 @@ struct counter_device_allochelper {
> >  	 * This is cache line aligned to ensure private data behaves like
> > if it
> >  	 * were kmalloced separately.
> >  	 */
> > -	unsigned long privdata[] ____cacheline_aligned;
> > +	unsigned long privdata[] __aligned(ARCH_DMA_MINALIGN);
> >  };
> >  
> >  static void counter_device_release(struct device *dev)
> > 
> > ---
> > base-commit: 6613476e225e090cc9aad49be7fa504e290dd33d
> > change-id: 20240205-counter-align-fix-3faebfb572af
> > --
> > 
> > Thanks!
> > - Nuno Sá
> 
> Hi Nunon,
> 
> This change sounds reasonable, but should the comment block above
> privdata be updated to reflect the change?
> 
> 
Hi William,

Yeah, maybe. I can spin a new version with that... To be sure, you mean (in the
comment) private -> privdata, right?

Also realized a typo in the commit message:

"Aligning to the L1 cache does guarantee..." - Obviously, I meant "does
*not*...".

Thanks!
- Nuno Sá
Uwe Kleine-König Feb. 9, 2024, 8:30 a.m. UTC | #3
Hi Nuno,

On Fri, Feb 09, 2024 at 08:42:02AM +0100, Nuno Sá wrote:
> On Thu, 2024-02-08 at 13:34 -0500, William Breathitt Gray wrote:
> > On Mon, Feb 05, 2024 at 04:58:14PM +0100, Nuno Sa via B4 Relay wrote:
> > > diff --git a/drivers/counter/counter-core.c b/drivers/counter/counter-core.c
> > > index 09c77afb33ca..073bf6b67a57 100644
> > > --- a/drivers/counter/counter-core.c
> > > +++ b/drivers/counter/counter-core.c
> > > @@ -34,7 +34,7 @@ struct counter_device_allochelper {
> > >  	 * This is cache line aligned to ensure private data behaves like if it
> > >  	 * were kmalloced separately.
> > >  	 */
> > > -	unsigned long privdata[] ____cacheline_aligned;
> > > +	unsigned long privdata[] __aligned(ARCH_DMA_MINALIGN);
> > >  };
> > >  
> > >  static void counter_device_release(struct device *dev)
> > > 
> > 
> > This change sounds reasonable, but should the comment block above
> > privdata be updated to reflect the change?
> 
> Yeah, maybe. I can spin a new version with that... To be sure, you mean (in the
> comment) private -> privdata, right?

I guess he means: "This is cache line aligned to ensure private data
behaves like if it were kmalloced separately." After your change it's
not cache line aligned any more. IMHO keeping "private" is fine.

Best regards
Uwe
Nuno Sá Feb. 9, 2024, 9:07 a.m. UTC | #4
On Fri, 2024-02-09 at 09:30 +0100, Uwe Kleine-König wrote:
> Hi Nuno,
> 
> On Fri, Feb 09, 2024 at 08:42:02AM +0100, Nuno Sá wrote:
> > On Thu, 2024-02-08 at 13:34 -0500, William Breathitt Gray wrote:
> > > On Mon, Feb 05, 2024 at 04:58:14PM +0100, Nuno Sa via B4 Relay wrote:
> > > > diff --git a/drivers/counter/counter-core.c b/drivers/counter/counter-
> > > > core.c
> > > > index 09c77afb33ca..073bf6b67a57 100644
> > > > --- a/drivers/counter/counter-core.c
> > > > +++ b/drivers/counter/counter-core.c
> > > > @@ -34,7 +34,7 @@ struct counter_device_allochelper {
> > > >  	 * This is cache line aligned to ensure private data behaves
> > > > like if it
> > > >  	 * were kmalloced separately.
> > > >  	 */
> > > > -	unsigned long privdata[] ____cacheline_aligned;
> > > > +	unsigned long privdata[] __aligned(ARCH_DMA_MINALIGN);
> > > >  };
> > > >  
> > > >  static void counter_device_release(struct device *dev)
> > > > 
> > > 
> > > This change sounds reasonable, but should the comment block above
> > > privdata be updated to reflect the change?
> > 
> > Yeah, maybe. I can spin a new version with that... To be sure, you mean (in
> > the
> > comment) private -> privdata, right?
> 
> I guess he means: "This is cache line aligned to ensure private data
> behaves like if it were kmalloced separately." After your change it's
> not cache line aligned any more. IMHO keeping "private" is fine.
> 
> 

Oh yeah...

Yeah, it will depend on the platform. In some, it will still be cache aligned
but in others (as x86 which is DMA coeherent I think), it won't be and we can
actually safe some memory.

- Nuno Sá
William Breathitt Gray Feb. 9, 2024, 9:53 a.m. UTC | #5
On Fri, Feb 09, 2024 at 10:07:19AM +0100, Nuno Sá wrote:
> On Fri, 2024-02-09 at 09:30 +0100, Uwe Kleine-König wrote:
> > Hi Nuno,
> > 
> > On Fri, Feb 09, 2024 at 08:42:02AM +0100, Nuno Sá wrote:
> > > On Thu, 2024-02-08 at 13:34 -0500, William Breathitt Gray wrote:
> > > > On Mon, Feb 05, 2024 at 04:58:14PM +0100, Nuno Sa via B4 Relay wrote:
> > > > > diff --git a/drivers/counter/counter-core.c b/drivers/counter/counter-
> > > > > core.c
> > > > > index 09c77afb33ca..073bf6b67a57 100644
> > > > > --- a/drivers/counter/counter-core.c
> > > > > +++ b/drivers/counter/counter-core.c
> > > > > @@ -34,7 +34,7 @@ struct counter_device_allochelper {
> > > > >  	 * This is cache line aligned to ensure private data behaves
> > > > > like if it
> > > > >  	 * were kmalloced separately.
> > > > >  	 */
> > > > > -	unsigned long privdata[] ____cacheline_aligned;
> > > > > +	unsigned long privdata[] __aligned(ARCH_DMA_MINALIGN);
> > > > >  };
> > > > >  
> > > > >  static void counter_device_release(struct device *dev)
> > > > > 
> > > > 
> > > > This change sounds reasonable, but should the comment block above
> > > > privdata be updated to reflect the change?
> > > 
> > > Yeah, maybe. I can spin a new version with that... To be sure, you mean (in
> > > the
> > > comment) private -> privdata, right?
> > 
> > I guess he means: "This is cache line aligned to ensure private data
> > behaves like if it were kmalloced separately." After your change it's
> > not cache line aligned any more. IMHO keeping "private" is fine.
> > 
> > 
> 
> Oh yeah...
> 
> Yeah, it will depend on the platform. In some, it will still be cache aligned
> but in others (as x86 which is DMA coeherent I think), it won't be and we can
> actually safe some memory.
> 
> - Nuno Sá

Yes, I was referring to the possibility that it won't be cache aligned
anymore in some platforms as you mentioned, so a different comment would
be better there now. You can keep the "private" wording if you like, or
use "privdata" if you think it's clearer.

Thanks,

William Breathitt Gray
diff mbox series

Patch

diff --git a/drivers/counter/counter-core.c b/drivers/counter/counter-core.c
index 09c77afb33ca..073bf6b67a57 100644
--- a/drivers/counter/counter-core.c
+++ b/drivers/counter/counter-core.c
@@ -34,7 +34,7 @@  struct counter_device_allochelper {
 	 * This is cache line aligned to ensure private data behaves like if it
 	 * were kmalloced separately.
 	 */
-	unsigned long privdata[] ____cacheline_aligned;
+	unsigned long privdata[] __aligned(ARCH_DMA_MINALIGN);
 };
 
 static void counter_device_release(struct device *dev)