Re: [PATCH v2 7/8] iio: core: simplify alloc alignment code
From: Jonathan Cameron <jic23@kernel.org>
Date: 2020-05-16 17:30:48
Also in:
linux-iio, lkml
On Fri, 15 May 2020 12:37:28 +0000 "Sa, Nuno" [off-list ref] wrote:
quoted
From: Ardelean, Alexandru <redacted> Sent: Freitag, 15. Mai 2020 13:48 To: linux-arm-kernel@lists.infradead.org; linux-stm32@st-md- mailman.stormreply.com; Sa, Nuno [off-list ref]; linux- kernel@vger.kernel.org; linux-iio@vger.kernel.org Cc: ludovic.desroches@microchip.com; nicolas.ferre@microchip.com; alexandre.torgue@st.com; ak@it-klinger.de; jic23@kernel.org; eugen.hristev@microchip.com; mcoquelin.stm32@gmail.com; alexandre.belloni@bootlin.com Subject: Re: [PATCH v2 7/8] iio: core: simplify alloc alignment code On Fri, 2020-05-15 at 07:12 +0000, Sa, Nuno wrote:quoted
Hey Alex, Just a small question...quoted
From: linux-iio-owner@vger.kernel.org <linux-iio-owner@vger.kernel.org>quoted
quoted
On Behalf Of Alexandru Ardelean Sent: Donnerstag, 14. Mai 2020 15:17 To: linux-iio@vger.kernel.org; linux-arm-kernel@lists.infradead.org;linux-quoted
quoted
stm32@st-md-mailman.stormreply.com; linux-kernel@vger.kernel.org Cc: ludovic.desroches@microchip.com; eugen.hristev@microchip.com; jic23@kernel.org; nicolas.ferre@microchip.com; alexandre.belloni@bootlin.com; alexandre.torgue@st.com; mcoquelin.stm32@gmail.com; ak@it-klinger.de; Ardelean, Alexandru [off-list ref] Subject: [PATCH v2 7/8] iio: core: simplify alloc alignment code There was a recent discussion about this code: https://urldefense.com/v3/__https://lore.kernel.org/linux-iio/20200322165317.0b1f0674@archlinux/__;!!A3Ni8CS0y2Y!pgdUSayJCfxMiEquoted
quoted
w8Fpv0LkEZurCSkX0sEcLnXeDSCLmhpu1xont6-vBQj3ZbCw$ This looks like a good time to rework this, since any issues about it should pop-up under testing, because the iio_dev is having a bit of an overhaul and stuff being moved to iio_dev_priv. Signed-off-by: Alexandru Ardelean <redacted> --- drivers/iio/industrialio-core.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-)diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c index a1b29e0f8fd6..7671d36efae7 100644--- a/drivers/iio/industrialio-core.c +++ b/drivers/iio/industrialio-core.c@@ -1514,13 +1514,9 @@ struct iio_dev *iio_device_alloc(intsizeof_priv)quoted
quoted
struct iio_dev *dev; size_t alloc_size; - alloc_size = sizeof(struct iio_dev_opaque); - if (sizeof_priv) { - alloc_size = ALIGN(alloc_size, IIO_ALIGN); - alloc_size += sizeof_priv; - } - /* ensure 32-byte alignment of whole construct ? */ - alloc_size += IIO_ALIGN - 1; + alloc_size = ALIGN(sizeof(struct iio_dev_opaque), IIO_ALIGN); + if (sizeof_priv) + alloc_size += ALIGN(sizeof_priv, IIO_ALIGN);Do we actually need to do the `ALIGN` again? It seems to me that`alloc_sizequoted
+= sizeof_priv` would be enough or am I missing something obvious?Well, it's not always clear what value 'sizeof_priv' has, and whether it is provided already aligned. The requirement is usually that this data be cacheline aligned. So, sizeof(struct iio_dev_opaque) is aligned already a few lines above, but the private information should also be aligned [given that it's an unknown value provided by the driver]. I think this is mostly important, if we need to do DMA access to buffers allocated on the driver's state-struct, which is allocated here, and which is usually provided as sizeof_priv.Yes, AFAIU this is to guarantee that the priv struct will start at an address that is DMA safe (cacheline-aligned). Hence, if there is any data in 'priv' that needs to be DMA safe, we are fine... Well, I was also misreading the code. Still, I think it should look something like: ```` alloc_size = sizeof(struct iio_dev_opaque) if (sizeof_priv) alloc_size += ALIGN(alloc_size, IIO_ALIGN); ```` If there is no priv, I think we don't need the padding bytes...
Agreed - no need to guarantee alignment of something that doesn't exist :)
- Nuno Sá
_______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel