On 17/07/14 16:59, Lars-Peter Clausen wrote:
ALIGN() only works correctly if the alignment is a power of two. Some drivers use 3 bytes for the storage size of the word in which case ALIGN() will cause incorrect results. Use the more generic roundup() instead. Signed-off-by: Lars-Peter Clausen <lars@xxxxxxxxxx>
Gah. Which driver is using a non power of two storage size? I thought I'd caught all of those at review. As you've noted it's a very bad idea. From a quick dubious grep I have: dac/ad5791.c (not effected as such given we aren't using this stuff for output) pressure/st_pressure_core.c I'd be tempted to fix those up rather than change this and introduce the fun you've pointed out below. What do you think?
--- This at least makes the rules for alignment predictable and consistent. But mixing 3 bytes words with other word sizes will still result in strange layouts. E.g. 4-byte word, 3-byte word will result in 4-byte word, 2-byte alignment gap, 3-byte word.
--- drivers/iio/industrialio-buffer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c index 0472ee2..6da5272 100644 --- a/drivers/iio/industrialio-buffer.c +++ b/drivers/iio/industrialio-buffer.c @@ -486,7 +486,7 @@ static int iio_compute_scan_bytes(struct iio_dev *indio_dev, ch->scan_type.repeat; else length = ch->scan_type.storagebits / 8; - bytes = ALIGN(bytes, length); + bytes = roundup(bytes, length); bytes += length; } if (timestamp) { @@ -497,7 +497,7 @@ static int iio_compute_scan_bytes(struct iio_dev *indio_dev, ch->scan_type.repeat; else length = ch->scan_type.storagebits / 8; - bytes = ALIGN(bytes, length); + bytes = roundup(bytes, length); bytes += length; } return bytes;
-- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html