mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 20:51:03 +02:00
sbitmap: add __sbitmap_queue_get_batch()
The block layer tag allocation batching still calls into sbitmap to get each tag, but we can improve on that. Add __sbitmap_queue_get_batch(), which returns a mask of tags all at once, along with an offset for those tags. An example return would be 0xff, where bits 0..7 are set, with tag_offset == 128. The valid tags in this case would be 128..135. A batch is specific to an individual sbitmap_map, hence it cannot be larger than that. The requested number of tags is automatically reduced to the max that can be satisfied with a single map. On failure, 0 is returned. Caller should fall back to single tag allocation at that point/ Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
@@ -426,6 +426,19 @@ void sbitmap_queue_resize(struct sbitmap_queue *sbq, unsigned int depth);
|
||||
*/
|
||||
int __sbitmap_queue_get(struct sbitmap_queue *sbq);
|
||||
|
||||
/**
|
||||
* __sbitmap_queue_get_batch() - Try to allocate a batch of free bits
|
||||
* @sbq: Bitmap queue to allocate from.
|
||||
* @nr_tags: number of tags requested
|
||||
* @offset: offset to add to returned bits
|
||||
*
|
||||
* Return: Mask of allocated tags, 0 if none are found. Each tag allocated is
|
||||
* a bit in the mask returned, and the caller must add @offset to the value to
|
||||
* get the absolute tag value.
|
||||
*/
|
||||
unsigned long __sbitmap_queue_get_batch(struct sbitmap_queue *sbq, int nr_tags,
|
||||
unsigned int *offset);
|
||||
|
||||
/**
|
||||
* __sbitmap_queue_get_shallow() - Try to allocate a free bit from a &struct
|
||||
* sbitmap_queue, limiting the depth used from each word, with preemption
|
||||
|
Reference in New Issue
Block a user