diff options
Diffstat (limited to 'lib/sbitmap.c')
| -rw-r--r-- | lib/sbitmap.c | 29 | 
1 files changed, 26 insertions, 3 deletions
| diff --git a/lib/sbitmap.c b/lib/sbitmap.c index 2709ab825499..09d293c30fd2 100644 --- a/lib/sbitmap.c +++ b/lib/sbitmap.c @@ -457,10 +457,9 @@ int sbitmap_queue_init_node(struct sbitmap_queue *sbq, unsigned int depth,  }  EXPORT_SYMBOL_GPL(sbitmap_queue_init_node); -static void sbitmap_queue_update_wake_batch(struct sbitmap_queue *sbq, -					    unsigned int depth) +static inline void __sbitmap_queue_update_wake_batch(struct sbitmap_queue *sbq, +					    unsigned int wake_batch)  { -	unsigned int wake_batch = sbq_calc_wake_batch(sbq, depth);  	int i;  	if (sbq->wake_batch != wake_batch) { @@ -476,6 +475,30 @@ static void sbitmap_queue_update_wake_batch(struct sbitmap_queue *sbq,  	}  } +static void sbitmap_queue_update_wake_batch(struct sbitmap_queue *sbq, +					    unsigned int depth) +{ +	unsigned int wake_batch; + +	wake_batch = sbq_calc_wake_batch(sbq, depth); +	__sbitmap_queue_update_wake_batch(sbq, wake_batch); +} + +void sbitmap_queue_recalculate_wake_batch(struct sbitmap_queue *sbq, +					    unsigned int users) +{ +	unsigned int wake_batch; +	unsigned int min_batch; +	unsigned int depth = (sbq->sb.depth + users - 1) / users; + +	min_batch = sbq->sb.depth >= (4 * SBQ_WAIT_QUEUES) ? 4 : 1; + +	wake_batch = clamp_val(depth / SBQ_WAIT_QUEUES, +			min_batch, SBQ_WAKE_BATCH); +	__sbitmap_queue_update_wake_batch(sbq, wake_batch); +} +EXPORT_SYMBOL_GPL(sbitmap_queue_recalculate_wake_batch); +  void sbitmap_queue_resize(struct sbitmap_queue *sbq, unsigned int depth)  {  	sbitmap_queue_update_wake_batch(sbq, depth); |