From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: "Jonathan Cameron" <jic23@kernel.org>,
"Lars-Peter Clausen" <lars@metafoo.de>,
"Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>,
"Nuno Sa" <nuno.sa@analog.com>
Subject: [PATCH v2 1/8] iio: core: Add opaque_struct_size() helper and use it
Date: Fri, 21 Jul 2023 20:00:15 +0300 [thread overview]
Message-ID: <20230721170022.3461-2-andriy.shevchenko@linux.intel.com> (raw)
In-Reply-To: <20230721170022.3461-1-andriy.shevchenko@linux.intel.com>
Introduce opaque_struct_size() helper, which may be moved
to overflow.h in the future, and use it in the IIO core.
Cc: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Nuno Sa <nuno.sa@analog.com>
---
drivers/iio/industrialio-core.c | 32 ++++++++++++++++++++++++--------
1 file changed, 24 insertions(+), 8 deletions(-)
diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c
index c117f50d0cf3..6cca86fd0ef9 100644
--- a/drivers/iio/industrialio-core.c
+++ b/drivers/iio/industrialio-core.c
@@ -1617,6 +1617,28 @@ const struct device_type iio_device_type = {
.release = iio_dev_release,
};
+/**
+ * opaque_struct_size() - Calculate size of opaque structure with trailing aligned data.
+ * @p: Pointer to the opaque structure.
+ * @a: Alignment in bytes before trailing data.
+ * @s: Data size in bytes (can be 0).
+ *
+ * Calculates size of memory needed for structure of @p followed by the aligned data
+ * of size @s. When @s is 0, the alignment @a is not taken into account and the result
+ * is an equivalent to sizeof(*(@p)).
+ *
+ * Returns: Number of bytes needed or SIZE_MAX on overflow.
+ */
+#define opaque_struct_size(p, a, s) ({ \
+ size_t _psize = sizeof(*(p)); \
+ size_t _asize = ALIGN(_psize, (a)); \
+ size_t _ssize = s; \
+ _ssize ? size_add(_asize, _ssize) : _psize; \
+})
+
+#define opaque_struct_data(p, a) \
+ ((void *)(p) + ALIGN(sizeof(*(p)), (a)))
+
/**
* iio_device_alloc() - allocate an iio_dev from a driver
* @parent: Parent device.
@@ -1628,19 +1650,13 @@ struct iio_dev *iio_device_alloc(struct device *parent, int sizeof_priv)
struct iio_dev *indio_dev;
size_t alloc_size;
- alloc_size = sizeof(struct iio_dev_opaque);
- if (sizeof_priv) {
- alloc_size = ALIGN(alloc_size, IIO_DMA_MINALIGN);
- alloc_size += sizeof_priv;
- }
-
+ alloc_size = opaque_struct_size(iio_dev_opaque, IIO_DMA_MINALIGN, sizeof_priv);
iio_dev_opaque = kzalloc(alloc_size, GFP_KERNEL);
if (!iio_dev_opaque)
return NULL;
indio_dev = &iio_dev_opaque->indio_dev;
- indio_dev->priv = (char *)iio_dev_opaque +
- ALIGN(sizeof(struct iio_dev_opaque), IIO_DMA_MINALIGN);
+ indio_dev->priv = opaque_struct_data(iio_dev_opaque, IIO_DMA_MINALIGN);
indio_dev->dev.parent = parent;
indio_dev->dev.type = &iio_device_type;
--
2.40.0.1.gaa8946217a0b
next prev parent reply other threads:[~2023-07-21 17:00 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-21 17:00 [PATCH v2 0/8] iio: core: A few code cleanups and documentation fixes Andy Shevchenko
2023-07-21 17:00 ` Andy Shevchenko [this message]
2023-07-21 17:22 ` [PATCH v2 1/8] iio: core: Add opaque_struct_size() helper and use it Andy Shevchenko
2023-07-21 17:25 ` Andy Shevchenko
2023-07-21 17:27 ` Andy Shevchenko
2023-07-21 18:12 ` Uwe Kleine-König
2023-07-21 17:00 ` [PATCH v2 2/8] iio: core: Use sysfs_match_string() helper Andy Shevchenko
2023-07-22 17:11 ` Jonathan Cameron
2023-07-21 17:00 ` [PATCH v2 3/8] iio: core: Switch to krealloc_array() Andy Shevchenko
2023-07-22 17:28 ` Jonathan Cameron
2023-07-24 10:37 ` Andy Shevchenko
2023-07-21 17:00 ` [PATCH v2 4/8] iio: core: Use min() instead of min_t() to make code more robust Andy Shevchenko
2023-07-23 9:14 ` Jonathan Cameron
2023-07-21 17:00 ` [PATCH v2 5/8] iio: core: Get rid of redundant 'else' Andy Shevchenko
2023-07-23 9:16 ` Jonathan Cameron
2023-07-21 17:00 ` [PATCH v2 6/8] iio: core: Fix issues and style of the comments Andy Shevchenko
2023-07-21 20:48 ` Randy Dunlap
2023-07-21 21:37 ` andy.shevchenko
2023-07-23 9:21 ` Jonathan Cameron
2023-07-21 17:00 ` [PATCH v2 7/8] iio: core: Move initcalls closer to the respective calls Andy Shevchenko
2023-07-23 9:23 ` Jonathan Cameron
2023-07-24 10:53 ` Andy Shevchenko
2023-07-21 17:00 ` [PATCH v2 8/8] iio: core: Improve indentation in a few places Andy Shevchenko
2023-07-23 9:24 ` Jonathan Cameron
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=20230721170022.3461-2-andriy.shevchenko@linux.intel.com \
--to=andriy.shevchenko@linux.intel.com \
--cc=jic23@kernel.org \
--cc=lars@metafoo.de \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=nuno.sa@analog.com \
--cc=u.kleine-koenig@pengutronix.de \
/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.