diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-07-12 18:13:55 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-07-12 18:13:55 -0400 |
commit | 9e3a25dc992dd9f3170fb643bdd95da5ca9c5576 (patch) | |
tree | f636ae59fa83c83e837a6668b2693175a6e39f3a /lib/genalloc.c | |
parent | 9787aed57dd33ba5c15a713c2c50e78baeb5052d (diff) | |
parent | 15ffe5e1acf5fe1512e98b20702e46ce9f25e2f7 (diff) |
Merge tag 'dma-mapping-5.3' of git://git.infradead.org/users/hch/dma-mapping
Pull dma-mapping updates from Christoph Hellwig:
- move the USB special case that bounced DMA through a device bar into
the USB code instead of handling it in the common DMA code (Laurentiu
Tudor and Fredrik Noring)
- don't dip into the global CMA pool for single page allocations
(Nicolin Chen)
- fix a crash when allocating memory for the atomic pool failed during
boot (Florian Fainelli)
- move support for MIPS-style uncached segments to the common code and
use that for MIPS and nios2 (me)
- make support for DMA_ATTR_NON_CONSISTENT and
DMA_ATTR_NO_KERNEL_MAPPING generic (me)
- convert nds32 to the generic remapping allocator (me)
* tag 'dma-mapping-5.3' of git://git.infradead.org/users/hch/dma-mapping: (29 commits)
dma-mapping: mark dma_alloc_need_uncached as __always_inline
MIPS: only select ARCH_HAS_UNCACHED_SEGMENT for non-coherent platforms
usb: host: Fix excessive alignment restriction for local memory allocations
lib/genalloc.c: Add algorithm, align and zeroed family of DMA allocators
nios2: use the generic uncached segment support in dma-direct
nds32: use the generic remapping allocator for coherent DMA allocations
arc: use the generic remapping allocator for coherent DMA allocations
dma-direct: handle DMA_ATTR_NO_KERNEL_MAPPING in common code
dma-direct: handle DMA_ATTR_NON_CONSISTENT in common code
dma-mapping: add a dma_alloc_need_uncached helper
openrisc: remove the partial DMA_ATTR_NON_CONSISTENT support
arc: remove the partial DMA_ATTR_NON_CONSISTENT support
arm-nommu: remove the partial DMA_ATTR_NON_CONSISTENT support
ARM: dma-mapping: allow larger DMA mask than supported
dma-mapping: truncate dma masks to what dma_addr_t can hold
iommu/dma: Apply dma_{alloc,free}_contiguous functions
dma-remap: Avoid de-referencing NULL atomic_pool
MIPS: use the generic uncached segment support in dma-direct
dma-direct: provide generic support for uncached kernel segments
au1100fb: fix DMA API abuse
...
Diffstat (limited to 'lib/genalloc.c')
-rw-r--r-- | lib/genalloc.c | 125 |
1 files changed, 122 insertions, 3 deletions
diff --git a/lib/genalloc.c b/lib/genalloc.c index 5257f74fccf3..9fc31292cfa1 100644 --- a/lib/genalloc.c +++ b/lib/genalloc.c | |||
@@ -327,21 +327,45 @@ EXPORT_SYMBOL(gen_pool_alloc_algo_owner); | |||
327 | * gen_pool_dma_alloc - allocate special memory from the pool for DMA usage | 327 | * gen_pool_dma_alloc - allocate special memory from the pool for DMA usage |
328 | * @pool: pool to allocate from | 328 | * @pool: pool to allocate from |
329 | * @size: number of bytes to allocate from the pool | 329 | * @size: number of bytes to allocate from the pool |
330 | * @dma: dma-view physical address return value. Use NULL if unneeded. | 330 | * @dma: dma-view physical address return value. Use %NULL if unneeded. |
331 | * | 331 | * |
332 | * Allocate the requested number of bytes from the specified pool. | 332 | * Allocate the requested number of bytes from the specified pool. |
333 | * Uses the pool allocation function (with first-fit algorithm by default). | 333 | * Uses the pool allocation function (with first-fit algorithm by default). |
334 | * Can not be used in NMI handler on architectures without | 334 | * Can not be used in NMI handler on architectures without |
335 | * NMI-safe cmpxchg implementation. | 335 | * NMI-safe cmpxchg implementation. |
336 | * | ||
337 | * Return: virtual address of the allocated memory, or %NULL on failure | ||
336 | */ | 338 | */ |
337 | void *gen_pool_dma_alloc(struct gen_pool *pool, size_t size, dma_addr_t *dma) | 339 | void *gen_pool_dma_alloc(struct gen_pool *pool, size_t size, dma_addr_t *dma) |
338 | { | 340 | { |
341 | return gen_pool_dma_alloc_algo(pool, size, dma, pool->algo, pool->data); | ||
342 | } | ||
343 | EXPORT_SYMBOL(gen_pool_dma_alloc); | ||
344 | |||
345 | /** | ||
346 | * gen_pool_dma_alloc_algo - allocate special memory from the pool for DMA | ||
347 | * usage with the given pool algorithm | ||
348 | * @pool: pool to allocate from | ||
349 | * @size: number of bytes to allocate from the pool | ||
350 | * @dma: DMA-view physical address return value. Use %NULL if unneeded. | ||
351 | * @algo: algorithm passed from caller | ||
352 | * @data: data passed to algorithm | ||
353 | * | ||
354 | * Allocate the requested number of bytes from the specified pool. Uses the | ||
355 | * given pool allocation function. Can not be used in NMI handler on | ||
356 | * architectures without NMI-safe cmpxchg implementation. | ||
357 | * | ||
358 | * Return: virtual address of the allocated memory, or %NULL on failure | ||
359 | */ | ||
360 | void *gen_pool_dma_alloc_algo(struct gen_pool *pool, size_t size, | ||
361 | dma_addr_t *dma, genpool_algo_t algo, void *data) | ||
362 | { | ||
339 | unsigned long vaddr; | 363 | unsigned long vaddr; |
340 | 364 | ||
341 | if (!pool) | 365 | if (!pool) |
342 | return NULL; | 366 | return NULL; |
343 | 367 | ||
344 | vaddr = gen_pool_alloc(pool, size); | 368 | vaddr = gen_pool_alloc_algo(pool, size, algo, data); |
345 | if (!vaddr) | 369 | if (!vaddr) |
346 | return NULL; | 370 | return NULL; |
347 | 371 | ||
@@ -350,7 +374,102 @@ void *gen_pool_dma_alloc(struct gen_pool *pool, size_t size, dma_addr_t *dma) | |||
350 | 374 | ||
351 | return (void *)vaddr; | 375 | return (void *)vaddr; |
352 | } | 376 | } |
353 | EXPORT_SYMBOL(gen_pool_dma_alloc); | 377 | EXPORT_SYMBOL(gen_pool_dma_alloc_algo); |
378 | |||
379 | /** | ||
380 | * gen_pool_dma_alloc_align - allocate special memory from the pool for DMA | ||
381 | * usage with the given alignment | ||
382 | * @pool: pool to allocate from | ||
383 | * @size: number of bytes to allocate from the pool | ||
384 | * @dma: DMA-view physical address return value. Use %NULL if unneeded. | ||
385 | * @align: alignment in bytes for starting address | ||
386 | * | ||
387 | * Allocate the requested number bytes from the specified pool, with the given | ||
388 | * alignment restriction. Can not be used in NMI handler on architectures | ||
389 | * without NMI-safe cmpxchg implementation. | ||
390 | * | ||
391 | * Return: virtual address of the allocated memory, or %NULL on failure | ||
392 | */ | ||
393 | void *gen_pool_dma_alloc_align(struct gen_pool *pool, size_t size, | ||
394 | dma_addr_t *dma, int align) | ||
395 | { | ||
396 | struct genpool_data_align data = { .align = align }; | ||
397 | |||
398 | return gen_pool_dma_alloc_algo(pool, size, dma, | ||
399 | gen_pool_first_fit_align, &data); | ||
400 | } | ||
401 | EXPORT_SYMBOL(gen_pool_dma_alloc_align); | ||
402 | |||
403 | /** | ||
404 | * gen_pool_dma_zalloc - allocate special zeroed memory from the pool for | ||
405 | * DMA usage | ||
406 | * @pool: pool to allocate from | ||
407 | * @size: number of bytes to allocate from the pool | ||
408 | * @dma: dma-view physical address return value. Use %NULL if unneeded. | ||
409 | * | ||
410 | * Allocate the requested number of zeroed bytes from the specified pool. | ||
411 | * Uses the pool allocation function (with first-fit algorithm by default). | ||
412 | * Can not be used in NMI handler on architectures without | ||
413 | * NMI-safe cmpxchg implementation. | ||
414 | * | ||
415 | * Return: virtual address of the allocated zeroed memory, or %NULL on failure | ||
416 | */ | ||
417 | void *gen_pool_dma_zalloc(struct gen_pool *pool, size_t size, dma_addr_t *dma) | ||
418 | { | ||
419 | return gen_pool_dma_zalloc_algo(pool, size, dma, pool->algo, pool->data); | ||
420 | } | ||
421 | EXPORT_SYMBOL(gen_pool_dma_zalloc); | ||
422 | |||
423 | /** | ||
424 | * gen_pool_dma_zalloc_algo - allocate special zeroed memory from the pool for | ||
425 | * DMA usage with the given pool algorithm | ||
426 | * @pool: pool to allocate from | ||
427 | * @size: number of bytes to allocate from the pool | ||
428 | * @dma: DMA-view physical address return value. Use %NULL if unneeded. | ||
429 | * @algo: algorithm passed from caller | ||
430 | * @data: data passed to algorithm | ||
431 | * | ||
432 | * Allocate the requested number of zeroed bytes from the specified pool. Uses | ||
433 | * the given pool allocation function. Can not be used in NMI handler on | ||
434 | * architectures without NMI-safe cmpxchg implementation. | ||
435 | * | ||
436 | * Return: virtual address of the allocated zeroed memory, or %NULL on failure | ||
437 | */ | ||
438 | void *gen_pool_dma_zalloc_algo(struct gen_pool *pool, size_t size, | ||
439 | dma_addr_t *dma, genpool_algo_t algo, void *data) | ||
440 | { | ||
441 | void *vaddr = gen_pool_dma_alloc_algo(pool, size, dma, algo, data); | ||
442 | |||
443 | if (vaddr) | ||
444 | memset(vaddr, 0, size); | ||
445 | |||
446 | return vaddr; | ||
447 | } | ||
448 | EXPORT_SYMBOL(gen_pool_dma_zalloc_algo); | ||
449 | |||
450 | /** | ||
451 | * gen_pool_dma_zalloc_align - allocate special zeroed memory from the pool for | ||
452 | * DMA usage with the given alignment | ||
453 | * @pool: pool to allocate from | ||
454 | * @size: number of bytes to allocate from the pool | ||
455 | * @dma: DMA-view physical address return value. Use %NULL if unneeded. | ||
456 | * @align: alignment in bytes for starting address | ||
457 | * | ||
458 | * Allocate the requested number of zeroed bytes from the specified pool, | ||
459 | * with the given alignment restriction. Can not be used in NMI handler on | ||
460 | * architectures without NMI-safe cmpxchg implementation. | ||
461 | * | ||
462 | * Return: virtual address of the allocated zeroed memory, or %NULL on failure | ||
463 | */ | ||
464 | void *gen_pool_dma_zalloc_align(struct gen_pool *pool, size_t size, | ||
465 | dma_addr_t *dma, int align) | ||
466 | { | ||
467 | struct genpool_data_align data = { .align = align }; | ||
468 | |||
469 | return gen_pool_dma_zalloc_algo(pool, size, dma, | ||
470 | gen_pool_first_fit_align, &data); | ||
471 | } | ||
472 | EXPORT_SYMBOL(gen_pool_dma_zalloc_align); | ||
354 | 473 | ||
355 | /** | 474 | /** |
356 | * gen_pool_free - free allocated special memory back to the pool | 475 | * gen_pool_free - free allocated special memory back to the pool |