Nicolin Chen
1e9d90dbed
dma-mapping: introduce dma_get_seg_boundary_nr_pages()
...
We found that callers of dma_get_seg_boundary mostly do an ALIGN
with page mask and then do a page shift to get number of pages:
ALIGN(boundary + 1, 1 << shift) >> shift
However, the boundary might be as large as ULONG_MAX, which means
that a device has no specific boundary limit. So either "+ 1" or
passing it to ALIGN() would potentially overflow.
According to kernel defines:
#define ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask))
#define ALIGN(x, a) ALIGN_MASK(x, (typeof(x))(a) - 1)
We can simplify the logic here into a helper function doing:
ALIGN(boundary + 1, 1 << shift) >> shift
= ALIGN_MASK(b + 1, (1 << s) - 1) >> s
= {[b + 1 + (1 << s) - 1] & ~[(1 << s) - 1]} >> s
= [b + 1 + (1 << s) - 1] >> s
= [b + (1 << s)] >> s
= (b >> s) + 1
This patch introduces and applies dma_get_seg_boundary_nr_pages()
as an overflow-free helper for the dma_get_seg_boundary() callers
to get numbers of pages. It also takes care of the NULL dev case
for non-DMA API callers.
Suggested-by: Christoph Hellwig <hch@lst.de >
Signed-off-by: Nicolin Chen <nicoleotsuka@gmail.com >
Acked-by: Niklas Schnelle <schnelle@linux.ibm.com >
Acked-by: Michael Ellerman <mpe@ellerman.id.au > (powerpc)
Signed-off-by: Christoph Hellwig <hch@lst.de >
2020-09-03 18:12:15 +02:00
..
2020-08-14 19:56:56 -07:00
2020-03-25 11:50:48 +01:00
2019-06-19 17:09:52 +02:00
2017-11-02 11:10:55 +01:00
2017-11-02 11:10:55 +01:00
2017-11-02 11:10:55 +01:00
2017-11-02 11:10:55 +01:00
2020-08-23 17:36:59 -05:00
2017-11-02 11:10:55 +01:00
2020-08-23 17:36:59 -05:00
2017-11-02 11:10:55 +01:00
2019-05-21 10:50:45 +02:00
2017-11-02 11:10:55 +01:00
2020-06-09 09:39:13 -07:00
2020-05-07 18:49:04 -07:00
2017-11-02 11:10:55 +01:00
2017-11-02 11:10:55 +01:00
2020-05-07 18:49:04 -07:00
2017-11-02 11:10:55 +01:00
2017-11-02 11:10:55 +01:00
2017-11-02 11:10:55 +01:00
2018-03-18 07:38:45 -07:00
2020-06-23 10:49:56 +02:00
2017-11-02 11:10:55 +01:00
2018-03-18 07:38:48 -07:00
2017-11-02 11:10:55 +01:00
2018-11-27 20:31:46 -05:00
2017-11-02 11:10:55 +01:00
2020-05-13 15:32:00 -07:00
2020-06-09 09:39:13 -07:00
2019-05-21 10:50:45 +02:00
2018-01-22 08:17:15 -08:00
2018-01-22 08:17:15 -08:00
2017-11-02 11:10:55 +01:00
2017-11-02 11:10:55 +01:00
2018-12-06 06:56:40 -08:00
2020-09-03 18:12:15 +02:00
2020-09-03 18:12:15 +02:00
2020-04-02 18:11:55 -07:00
2017-11-02 11:10:55 +01:00
2018-11-18 13:35:21 -08:00
2017-11-02 11:10:55 +01:00
2017-11-02 11:10:55 +01:00
2017-11-02 11:10:55 +01:00
2019-01-06 09:46:51 +09:00
2020-06-23 10:49:56 +02:00
2020-08-23 17:36:59 -05:00
2020-08-23 17:36:59 -05:00
2018-06-21 12:33:19 +02:00
2017-11-02 11:10:55 +01:00
2020-06-09 09:39:13 -07:00
2018-05-09 06:54:27 +02:00
2020-02-04 03:05:26 +00:00
2018-11-18 13:35:22 -08:00
2017-11-02 11:10:55 +01:00
2017-11-02 11:10:55 +01:00
2018-05-22 07:54:06 -05:00
2017-11-02 11:10:55 +01:00
2020-08-07 11:33:26 -07:00
2020-06-23 10:49:56 +02:00
2019-06-02 22:15:35 -07:00
2017-11-02 11:10:55 +01:00
2017-11-02 11:10:55 +01:00
2019-05-21 10:50:45 +02:00
2018-11-18 13:35:22 -08:00
2018-11-18 13:35:22 -08:00
2020-04-02 18:11:55 -07:00
2017-11-02 11:10:55 +01:00
2018-05-22 07:54:06 -05:00
2019-03-05 21:07:14 -08:00
2018-02-15 15:07:30 -06:00
2018-05-22 07:54:06 -05:00
2017-11-02 11:10:55 +01:00
2018-11-18 13:35:21 -08:00
2019-03-05 21:07:14 -08:00
2017-11-02 11:10:55 +01:00
2020-09-03 18:12:15 +02:00
2017-11-02 11:10:55 +01:00
2020-06-09 09:39:13 -07:00
2018-05-22 07:54:06 -05:00
2020-08-23 17:36:59 -05:00
2019-06-02 22:16:33 -07:00
2017-11-02 11:10:55 +01:00
2018-11-18 13:35:20 -08:00
2020-08-09 13:33:54 -07:00
2020-08-09 13:33:54 -07:00
2020-07-04 23:41:37 +02:00
2020-08-23 17:36:59 -05:00
2019-05-30 11:26:32 -07:00
2019-05-30 11:26:32 -07:00
2018-11-18 13:35:21 -08:00
2017-11-02 11:10:55 +01:00
2019-03-05 21:07:14 -08:00
2017-11-02 11:10:55 +01:00
2020-07-27 14:31:08 -04:00
2020-07-27 14:31:08 -04:00
2018-11-18 13:35:21 -08:00
2017-11-02 11:10:55 +01:00
2019-12-08 14:37:35 +01:00
2019-03-05 21:07:14 -08:00
2020-07-30 08:22:33 +02:00
2020-07-30 08:22:33 +02:00
2020-08-23 17:36:59 -05:00
2020-08-23 17:36:59 -05:00
2020-08-23 17:36:59 -05:00
2019-01-03 18:57:57 -08:00
2017-11-02 11:10:55 +01:00
2017-11-02 11:10:55 +01:00
2020-08-07 11:33:26 -07:00
2020-08-07 11:33:26 -07:00
2016-08-07 23:55:43 -04:00
2017-11-02 11:10:55 +01:00
2017-11-02 11:10:55 +01:00
2019-05-21 10:50:45 +02:00
2017-11-02 11:10:55 +01:00
2018-11-18 13:35:21 -08:00
2017-11-02 11:10:55 +01:00
2020-08-07 11:33:26 -07:00
2017-11-02 11:10:55 +01:00
2017-11-02 11:10:55 +01:00
2019-06-19 17:09:52 +02:00
2017-11-02 11:10:55 +01:00
2020-07-19 18:16:40 -07:00
2020-06-02 18:41:48 -07:00
2019-05-29 09:31:43 -05:00
2020-02-02 11:54:41 +01:00
2020-06-23 10:49:54 +02:00
2017-11-02 11:10:55 +01:00
2018-11-18 18:52:22 -08:00
2018-11-18 18:52:22 -08:00
2018-03-20 12:05:17 -04:00
2017-11-02 11:10:55 +01:00
2019-05-10 12:20:36 +02:00
2017-11-02 11:10:55 +01:00
2020-06-09 09:39:13 -07:00
2020-06-09 09:39:13 -07:00
2020-06-09 09:39:13 -07:00
2017-11-02 11:10:55 +01:00
2017-11-02 11:10:55 +01:00
2018-03-18 07:38:45 -07:00
2017-11-02 11:10:55 +01:00
2017-11-02 11:10:55 +01:00
2019-01-03 18:57:57 -08:00
2017-11-02 11:10:55 +01:00
2019-05-21 11:28:45 +02:00
2018-03-18 07:38:48 -07:00
2017-11-02 11:10:55 +01:00
2020-08-06 16:13:13 +02:00
2020-05-13 15:35:58 -07:00
2018-10-07 22:42:00 -07:00
2017-11-02 11:10:55 +01:00
2020-01-30 07:36:43 -08:00
2017-11-02 11:10:55 +01:00
2017-11-02 11:10:55 +01:00
2017-11-02 11:10:55 +01:00
2017-11-02 11:10:55 +01:00