Lines Matching refs:pcache

12 void pcache_defer_reqs_kick(struct dm_pcache *pcache)  in pcache_defer_reqs_kick()  argument
14 struct pcache_cache *cache = &pcache->cache; in pcache_defer_reqs_kick()
18 queue_work(pcache->task_wq, &pcache->defered_req_work); in pcache_defer_reqs_kick()
24 struct dm_pcache *pcache = pcache_req->pcache; in defer_req() local
28 spin_lock(&pcache->defered_req_list_lock); in defer_req()
29 list_add(&pcache_req->list_node, &pcache->defered_req_list); in defer_req()
30 pcache_defer_reqs_kick(pcache); in defer_req()
31 spin_unlock(&pcache->defered_req_list_lock); in defer_req()
36 struct dm_pcache *pcache = container_of(work, struct dm_pcache, defered_req_work); in defered_req_fn() local
41 if (pcache_is_stopping(pcache)) in defered_req_fn()
44 spin_lock(&pcache->defered_req_list_lock); in defered_req_fn()
45 list_splice_init(&pcache->defered_req_list, &tmp_list); in defered_req_fn()
46 spin_unlock(&pcache->defered_req_list_lock); in defered_req_fn()
53 ret = pcache_cache_handle_req(&pcache->cache, pcache_req); in defered_req_fn()
69 struct dm_pcache *pcache = pcache_req->pcache; in end_req() local
80 if (atomic_dec_and_test(&pcache->inflight_reqs)) in end_req()
81 wake_up(&pcache->inflight_wq); in end_req()
104 static int parse_cache_dev(struct dm_pcache *pcache, struct dm_arg_set *as, in parse_cache_dev() argument
111 ret = dm_get_device(pcache->ti, dm_shift_arg(as), in parse_cache_dev()
113 &pcache->cache_dev.dm_dev); in parse_cache_dev()
122 static int parse_backing_dev(struct dm_pcache *pcache, struct dm_arg_set *as, in parse_backing_dev() argument
130 ret = dm_get_device(pcache->ti, dm_shift_arg(as), in parse_backing_dev()
132 &pcache->backing_dev.dm_dev); in parse_backing_dev()
147 static int parse_cache_opts(struct dm_pcache *pcache, struct dm_arg_set *as, in parse_cache_opts() argument
150 struct pcache_cache_options *opts = &pcache->opts; in parse_cache_opts()
199 static int pcache_start(struct dm_pcache *pcache, char **error) in pcache_start() argument
203 ret = cache_dev_start(pcache); in pcache_start()
209 ret = backing_dev_start(pcache); in pcache_start()
215 ret = pcache_cache_start(pcache); in pcache_start()
223 backing_dev_stop(pcache); in pcache_start()
225 cache_dev_stop(pcache); in pcache_start()
230 static void pcache_destroy_args(struct dm_pcache *pcache) in pcache_destroy_args() argument
232 if (pcache->cache_dev.dm_dev) in pcache_destroy_args()
233 dm_put_device(pcache->ti, pcache->cache_dev.dm_dev); in pcache_destroy_args()
234 if (pcache->backing_dev.dm_dev) in pcache_destroy_args()
235 dm_put_device(pcache->ti, pcache->backing_dev.dm_dev); in pcache_destroy_args()
238 static int pcache_parse_args(struct dm_pcache *pcache, unsigned int argc, char **argv, in pcache_parse_args() argument
250 ret = parse_cache_dev(pcache, &as, error); in pcache_parse_args()
256 ret = parse_backing_dev(pcache, &as, error); in pcache_parse_args()
262 ret = parse_cache_opts(pcache, &as, error); in pcache_parse_args()
268 pcache_destroy_args(pcache); in pcache_parse_args()
275 struct dm_pcache *pcache; in dm_pcache_ctr() local
284 pcache = kzalloc_obj(struct dm_pcache); in dm_pcache_ctr()
285 if (!pcache) in dm_pcache_ctr()
288 pcache->task_wq = alloc_workqueue("pcache-%s-wq", WQ_UNBOUND | WQ_MEM_RECLAIM, in dm_pcache_ctr()
290 if (!pcache->task_wq) { in dm_pcache_ctr()
295 spin_lock_init(&pcache->defered_req_list_lock); in dm_pcache_ctr()
296 INIT_LIST_HEAD(&pcache->defered_req_list); in dm_pcache_ctr()
297 INIT_WORK(&pcache->defered_req_work, defered_req_fn); in dm_pcache_ctr()
298 pcache->ti = ti; in dm_pcache_ctr()
300 ret = pcache_parse_args(pcache, argc, argv, &ti->error); in dm_pcache_ctr()
304 ret = pcache_start(pcache, &ti->error); in dm_pcache_ctr()
311 ti->private = pcache; in dm_pcache_ctr()
312 atomic_set(&pcache->inflight_reqs, 0); in dm_pcache_ctr()
313 atomic_set(&pcache->state, PCACHE_STATE_RUNNING); in dm_pcache_ctr()
314 init_waitqueue_head(&pcache->inflight_wq); in dm_pcache_ctr()
318 pcache_destroy_args(pcache); in dm_pcache_ctr()
320 destroy_workqueue(pcache->task_wq); in dm_pcache_ctr()
322 kfree(pcache); in dm_pcache_ctr()
327 static void defer_req_stop(struct dm_pcache *pcache) in defer_req_stop() argument
332 flush_work(&pcache->defered_req_work); in defer_req_stop()
334 spin_lock(&pcache->defered_req_list_lock); in defer_req_stop()
335 list_splice_init(&pcache->defered_req_list, &tmp_list); in defer_req_stop()
336 spin_unlock(&pcache->defered_req_list_lock); in defer_req_stop()
348 struct dm_pcache *pcache; in dm_pcache_dtr() local
350 pcache = ti->private; in dm_pcache_dtr()
351 atomic_set(&pcache->state, PCACHE_STATE_STOPPING); in dm_pcache_dtr()
352 defer_req_stop(pcache); in dm_pcache_dtr()
354 wait_event(pcache->inflight_wq, in dm_pcache_dtr()
355 atomic_read(&pcache->inflight_reqs) == 0); in dm_pcache_dtr()
357 pcache_cache_stop(pcache); in dm_pcache_dtr()
358 backing_dev_stop(pcache); in dm_pcache_dtr()
359 cache_dev_stop(pcache); in dm_pcache_dtr()
361 pcache_destroy_args(pcache); in dm_pcache_dtr()
362 drain_workqueue(pcache->task_wq); in dm_pcache_dtr()
363 destroy_workqueue(pcache->task_wq); in dm_pcache_dtr()
365 kfree(pcache); in dm_pcache_dtr()
371 struct dm_pcache *pcache = ti->private; in dm_pcache_map_bio() local
374 pcache_req->pcache = pcache; in dm_pcache_map_bio()
381 atomic_inc(&pcache->inflight_reqs); in dm_pcache_map_bio()
383 ret = pcache_cache_handle_req(&pcache->cache, pcache_req); in dm_pcache_map_bio()
396 struct dm_pcache *pcache = ti->private; in dm_pcache_status() local
397 struct pcache_cache_dev *cache_dev = &pcache->cache_dev; in dm_pcache_status()
398 struct pcache_backing_dev *backing_dev = &pcache->backing_dev; in dm_pcache_status()
399 struct pcache_cache *cache = &pcache->cache; in dm_pcache_status()
433 struct dm_pcache *pcache = ti->private; in dm_pcache_message() local
443 return pcache_cache_set_gc_percent(&pcache->cache, val); in dm_pcache_message()