Lines Matching refs:mru

127 	struct xfs_mru_cache	*mru,
135 if (!mru->time_zero)
139 while (mru->time_zero <= now - mru->grp_count * mru->grp_time) {
145 lru_list = mru->lists + mru->lru_grp;
147 list_splice_init(lru_list, mru->reap_list.prev);
153 mru->lru_grp = (mru->lru_grp + 1) % mru->grp_count;
154 mru->time_zero += mru->grp_time;
160 if (++migrated == mru->grp_count) {
161 mru->lru_grp = 0;
162 mru->time_zero = 0;
168 for (grp = 0; grp < mru->grp_count; grp++) {
171 lru_list = mru->lists + ((mru->lru_grp + grp) % mru->grp_count);
173 return mru->time_zero +
174 (mru->grp_count + grp) * mru->grp_time;
178 mru->lru_grp = 0;
179 mru->time_zero = 0;
191 struct xfs_mru_cache *mru,
202 if (!_xfs_mru_cache_migrate(mru, now)) {
203 mru->time_zero = now;
204 if (!mru->queued) {
205 mru->queued = 1;
206 queue_delayed_work(xfs_mru_reap_wq, &mru->work,
207 mru->grp_count * mru->grp_time);
210 grp = (now - mru->time_zero) / mru->grp_time;
211 grp = (mru->lru_grp + grp) % mru->grp_count;
215 list_add_tail(&elem->list_node, mru->lists + grp);
224 * We get called holding the mru->lock, which we drop and then reacquire.
229 struct xfs_mru_cache *mru)
230 __releases(mru->lock) __acquires(mru->lock)
236 list_for_each_entry_safe(elem, next, &mru->reap_list, list_node) {
239 radix_tree_delete(&mru->store, elem->key);
247 spin_unlock(&mru->lock);
251 mru->free_func(mru->data, elem);
254 spin_lock(&mru->lock);
268 struct xfs_mru_cache *mru =
272 ASSERT(mru && mru->lists);
273 if (!mru || !mru->lists)
276 spin_lock(&mru->lock);
277 next = _xfs_mru_cache_migrate(mru, jiffies);
278 _xfs_mru_cache_clear_reap_list(mru);
280 mru->queued = next;
281 if ((mru->queued > 0)) {
287 queue_delayed_work(xfs_mru_reap_wq, &mru->work, next);
290 spin_unlock(&mru->lock);
323 struct xfs_mru_cache *mru = NULL;
336 if (!(mru = kmem_zalloc(sizeof(*mru), 0)))
340 mru->grp_count = grp_count + 1;
341 mru->lists = kmem_zalloc(mru->grp_count * sizeof(*mru->lists), 0);
343 if (!mru->lists) {
348 for (grp = 0; grp < mru->grp_count; grp++)
349 INIT_LIST_HEAD(mru->lists + grp);
355 INIT_RADIX_TREE(&mru->store, GFP_ATOMIC);
356 INIT_LIST_HEAD(&mru->reap_list);
357 spin_lock_init(&mru->lock);
358 INIT_DELAYED_WORK(&mru->work, _xfs_mru_cache_reap);
360 mru->grp_time = grp_time;
361 mru->free_func = free_func;
362 mru->data = data;
363 *mrup = mru;
366 if (err && mru && mru->lists)
367 kmem_free(mru->lists);
368 if (err && mru)
369 kmem_free(mru);
382 struct xfs_mru_cache *mru)
384 if (!mru || !mru->lists)
387 spin_lock(&mru->lock);
388 if (mru->queued) {
389 spin_unlock(&mru->lock);
390 cancel_delayed_work_sync(&mru->work);
391 spin_lock(&mru->lock);
394 _xfs_mru_cache_migrate(mru, jiffies + mru->grp_count * mru->grp_time);
395 _xfs_mru_cache_clear_reap_list(mru);
397 spin_unlock(&mru->lock);
402 struct xfs_mru_cache *mru)
404 if (!mru || !mru->lists)
407 xfs_mru_cache_flush(mru);
409 kmem_free(mru->lists);
410 kmem_free(mru);
420 struct xfs_mru_cache *mru,
426 ASSERT(mru && mru->lists);
427 if (!mru || !mru->lists)
436 spin_lock(&mru->lock);
437 error = radix_tree_insert(&mru->store, key, elem);
440 _xfs_mru_cache_list_insert(mru, elem);
441 spin_unlock(&mru->lock);
454 struct xfs_mru_cache *mru,
459 ASSERT(mru && mru->lists);
460 if (!mru || !mru->lists)
463 spin_lock(&mru->lock);
464 elem = radix_tree_delete(&mru->store, key);
467 spin_unlock(&mru->lock);
478 struct xfs_mru_cache *mru,
483 elem = xfs_mru_cache_remove(mru, key);
485 mru->free_func(mru->data, elem);
510 struct xfs_mru_cache *mru,
515 ASSERT(mru && mru->lists);
516 if (!mru || !mru->lists)
519 spin_lock(&mru->lock);
520 elem = radix_tree_lookup(&mru->store, key);
523 _xfs_mru_cache_list_insert(mru, elem);
526 spin_unlock(&mru->lock);
538 struct xfs_mru_cache *mru)
539 __releases(mru->lock)
541 spin_unlock(&mru->lock);