Lines Matching refs:b
29 struct background_tracker *b = kmalloc(sizeof(*b), GFP_KERNEL); in btracker_create() local
31 if (!b) { in btracker_create()
36 b->max_work = max_work; in btracker_create()
37 atomic_set(&b->pending_promotes, 0); in btracker_create()
38 atomic_set(&b->pending_writebacks, 0); in btracker_create()
39 atomic_set(&b->pending_demotes, 0); in btracker_create()
41 INIT_LIST_HEAD(&b->issued); in btracker_create()
42 INIT_LIST_HEAD(&b->queued); in btracker_create()
44 b->pending = RB_ROOT; in btracker_create()
46 return b; in btracker_create()
50 void btracker_destroy(struct background_tracker *b) in btracker_destroy() argument
54 BUG_ON(!list_empty(&b->issued)); in btracker_destroy()
55 list_for_each_entry_safe (w, tmp, &b->queued, list) { in btracker_destroy()
60 kfree(b); in btracker_destroy()
75 static bool __insert_pending(struct background_tracker *b, in __insert_pending() argument
80 struct rb_node **new = &b->pending.rb_node, *parent = NULL; in __insert_pending()
99 rb_insert_color(&nw->node, &b->pending); in __insert_pending()
104 static struct bt_work *__find_pending(struct background_tracker *b, in __find_pending() argument
109 struct rb_node **new = &b->pending.rb_node; in __find_pending()
129 static void update_stats(struct background_tracker *b, struct policy_work *w, int delta) in update_stats() argument
133 atomic_add(delta, &b->pending_promotes); in update_stats()
137 atomic_add(delta, &b->pending_demotes); in update_stats()
141 atomic_add(delta, &b->pending_writebacks); in update_stats()
146 unsigned int btracker_nr_demotions_queued(struct background_tracker *b) in btracker_nr_demotions_queued() argument
148 return atomic_read(&b->pending_demotes); in btracker_nr_demotions_queued()
152 static bool max_work_reached(struct background_tracker *b) in max_work_reached() argument
154 return atomic_read(&b->pending_promotes) + in max_work_reached()
155 atomic_read(&b->pending_writebacks) + in max_work_reached()
156 atomic_read(&b->pending_demotes) >= b->max_work; in max_work_reached()
159 static struct bt_work *alloc_work(struct background_tracker *b) in alloc_work() argument
161 if (max_work_reached(b)) in alloc_work()
167 int btracker_queue(struct background_tracker *b, in btracker_queue() argument
176 w = alloc_work(b); in btracker_queue()
182 if (!__insert_pending(b, w)) { in btracker_queue()
193 list_add(&w->list, &b->issued); in btracker_queue()
195 list_add(&w->list, &b->queued); in btracker_queue()
196 update_stats(b, &w->work, 1); in btracker_queue()
205 int btracker_issue(struct background_tracker *b, struct policy_work **work) in btracker_issue() argument
209 if (list_empty(&b->queued)) in btracker_issue()
212 w = list_first_entry(&b->queued, struct bt_work, list); in btracker_issue()
213 list_move(&w->list, &b->issued); in btracker_issue()
220 void btracker_complete(struct background_tracker *b, in btracker_complete() argument
225 update_stats(b, &w->work, -1); in btracker_complete()
226 rb_erase(&w->node, &b->pending); in btracker_complete()
232 bool btracker_promotion_already_present(struct background_tracker *b, in btracker_promotion_already_present() argument
235 return __find_pending(b, oblock) != NULL; in btracker_promotion_already_present()