Lines Matching refs:bdi
48 struct backing_dev_info *bdi = m->private; in bdi_debug_stats_show() local
49 struct bdi_writeback *wb = &bdi->wb; in bdi_debug_stats_show()
100 !list_empty(&bdi->bdi_list), bdi->wb.state); in bdi_debug_stats_show()
118 static void bdi_debug_register(struct backing_dev_info *bdi, const char *name) in bdi_debug_register() argument
120 bdi->debug_dir = debugfs_create_dir(name, bdi_debug_root); in bdi_debug_register()
121 bdi->debug_stats = debugfs_create_file("stats", 0444, bdi->debug_dir, in bdi_debug_register()
122 bdi, &bdi_debug_stats_fops); in bdi_debug_register()
125 static void bdi_debug_unregister(struct backing_dev_info *bdi) in bdi_debug_unregister() argument
127 debugfs_remove(bdi->debug_stats); in bdi_debug_unregister()
128 debugfs_remove(bdi->debug_dir); in bdi_debug_unregister()
134 static inline void bdi_debug_register(struct backing_dev_info *bdi, in bdi_debug_register() argument
138 static inline void bdi_debug_unregister(struct backing_dev_info *bdi) in bdi_debug_unregister() argument
147 struct backing_dev_info *bdi = dev_get_drvdata(dev); in read_ahead_kb_store() local
155 bdi->ra_pages = read_ahead_kb >> (PAGE_SHIFT - 10); in read_ahead_kb_store()
166 struct backing_dev_info *bdi = dev_get_drvdata(dev); \
172 BDI_SHOW(read_ahead_kb, K(bdi->ra_pages))
177 struct backing_dev_info *bdi = dev_get_drvdata(dev); in min_ratio_store() local
185 ret = bdi_set_min_ratio(bdi, ratio); in min_ratio_store()
191 BDI_SHOW(min_ratio, bdi->min_ratio)
196 struct backing_dev_info *bdi = dev_get_drvdata(dev); in max_ratio_store() local
204 ret = bdi_set_max_ratio(bdi, ratio); in max_ratio_store()
210 BDI_SHOW(max_ratio, bdi->max_ratio)
216 struct backing_dev_info *bdi = dev_get_drvdata(dev); in stable_pages_required_show() local
219 bdi_cap_stable_pages_required(bdi) ? 1 : 0); in stable_pages_required_show()
289 static int wb_init(struct bdi_writeback *wb, struct backing_dev_info *bdi, in wb_init() argument
296 wb->bdi = bdi; in wb_init()
314 wb->congested = wb_congested_get_create(bdi, blkcg_id, gfp); in wb_init()
399 wb_congested_get_create(struct backing_dev_info *bdi, int blkcg_id, gfp_t gfp) in wb_congested_get_create() argument
407 node = &bdi->cgwb_congested_tree.rb_node; in wb_congested_get_create()
427 rb_insert_color(&congested->rb_node, &bdi->cgwb_congested_tree); in wb_congested_get_create()
439 new_congested->bdi = bdi; in wb_congested_get_create()
467 if (congested->bdi) { in wb_congested_put()
469 &congested->bdi->cgwb_congested_tree); in wb_congested_put()
470 congested->bdi = NULL; in wb_congested_put()
481 struct backing_dev_info *bdi = wb->bdi; in cgwb_release_workfn() local
497 if (atomic_dec_and_test(&bdi->usage_cnt)) in cgwb_release_workfn()
512 WARN_ON(!radix_tree_delete(&wb->bdi->cgwb_tree, wb->memcg_css->id)); in cgwb_kill()
518 static int cgwb_create(struct backing_dev_info *bdi, in cgwb_create() argument
537 wb = radix_tree_lookup(&bdi->cgwb_tree, memcg_css->id); in cgwb_create()
551 ret = wb_init(wb, bdi, blkcg_css->id, gfp); in cgwb_create()
576 if (test_bit(WB_registered, &bdi->wb.state) && in cgwb_create()
579 ret = radix_tree_insert(&bdi->cgwb_tree, memcg_css->id, wb); in cgwb_create()
581 atomic_inc(&bdi->usage_cnt); in cgwb_create()
582 list_add_tail_rcu(&wb->bdi_node, &bdi->wb_list); in cgwb_create()
634 struct bdi_writeback *wb_get_create(struct backing_dev_info *bdi, in wb_get_create() argument
643 return &bdi->wb; in wb_get_create()
647 wb = radix_tree_lookup(&bdi->cgwb_tree, memcg_css->id); in wb_get_create()
660 } while (!wb && !cgwb_create(bdi, memcg_css, gfp)); in wb_get_create()
665 static int cgwb_bdi_init(struct backing_dev_info *bdi) in cgwb_bdi_init() argument
669 INIT_RADIX_TREE(&bdi->cgwb_tree, GFP_ATOMIC); in cgwb_bdi_init()
670 bdi->cgwb_congested_tree = RB_ROOT; in cgwb_bdi_init()
671 atomic_set(&bdi->usage_cnt, 1); in cgwb_bdi_init()
673 ret = wb_init(&bdi->wb, bdi, 1, GFP_KERNEL); in cgwb_bdi_init()
675 bdi->wb.memcg_css = mem_cgroup_root_css; in cgwb_bdi_init()
676 bdi->wb.blkcg_css = blkcg_root_css; in cgwb_bdi_init()
681 static void cgwb_bdi_destroy(struct backing_dev_info *bdi) in cgwb_bdi_destroy() argument
687 WARN_ON(test_bit(WB_registered, &bdi->wb.state)); in cgwb_bdi_destroy()
691 radix_tree_for_each_slot(slot, &bdi->cgwb_tree, &iter, 0) in cgwb_bdi_destroy()
694 while ((rbn = rb_first(&bdi->cgwb_congested_tree))) { in cgwb_bdi_destroy()
698 rb_erase(rbn, &bdi->cgwb_congested_tree); in cgwb_bdi_destroy()
699 congested->bdi = NULL; /* mark @congested unlinked */ in cgwb_bdi_destroy()
709 atomic_dec(&bdi->usage_cnt); in cgwb_bdi_destroy()
710 wait_event(cgwb_release_wait, !atomic_read(&bdi->usage_cnt)); in cgwb_bdi_destroy()
752 static int cgwb_bdi_init(struct backing_dev_info *bdi) in cgwb_bdi_init() argument
756 bdi->wb_congested = kzalloc(sizeof(*bdi->wb_congested), GFP_KERNEL); in cgwb_bdi_init()
757 if (!bdi->wb_congested) in cgwb_bdi_init()
760 err = wb_init(&bdi->wb, bdi, 1, GFP_KERNEL); in cgwb_bdi_init()
762 kfree(bdi->wb_congested); in cgwb_bdi_init()
768 static void cgwb_bdi_destroy(struct backing_dev_info *bdi) { } in cgwb_bdi_destroy() argument
772 int bdi_init(struct backing_dev_info *bdi) in bdi_init() argument
776 bdi->dev = NULL; in bdi_init()
778 bdi->min_ratio = 0; in bdi_init()
779 bdi->max_ratio = 100; in bdi_init()
780 bdi->max_prop_frac = FPROP_FRAC_BASE; in bdi_init()
781 INIT_LIST_HEAD(&bdi->bdi_list); in bdi_init()
782 INIT_LIST_HEAD(&bdi->wb_list); in bdi_init()
783 init_waitqueue_head(&bdi->wb_waitq); in bdi_init()
785 ret = cgwb_bdi_init(bdi); in bdi_init()
787 list_add_tail_rcu(&bdi->wb.bdi_node, &bdi->wb_list); in bdi_init()
793 int bdi_register(struct backing_dev_info *bdi, struct device *parent, in bdi_register() argument
799 if (bdi->dev) /* The driver needs to use separate queues per device */ in bdi_register()
803 dev = device_create_vargs(bdi_class, parent, MKDEV(0, 0), bdi, fmt, args); in bdi_register()
808 bdi->dev = dev; in bdi_register()
810 bdi_debug_register(bdi, dev_name(dev)); in bdi_register()
811 set_bit(WB_registered, &bdi->wb.state); in bdi_register()
814 list_add_tail_rcu(&bdi->bdi_list, &bdi_list); in bdi_register()
817 trace_writeback_bdi_register(bdi); in bdi_register()
822 int bdi_register_dev(struct backing_dev_info *bdi, dev_t dev) in bdi_register_dev() argument
824 return bdi_register(bdi, NULL, "%u:%u", MAJOR(dev), MINOR(dev)); in bdi_register_dev()
831 static void bdi_remove_from_list(struct backing_dev_info *bdi) in bdi_remove_from_list() argument
834 list_del_rcu(&bdi->bdi_list); in bdi_remove_from_list()
840 void bdi_unregister(struct backing_dev_info *bdi) in bdi_unregister() argument
843 bdi_remove_from_list(bdi); in bdi_unregister()
844 wb_shutdown(&bdi->wb); in bdi_unregister()
845 cgwb_bdi_destroy(bdi); in bdi_unregister()
847 if (bdi->dev) { in bdi_unregister()
848 bdi_debug_unregister(bdi); in bdi_unregister()
849 device_unregister(bdi->dev); in bdi_unregister()
850 bdi->dev = NULL; in bdi_unregister()
854 void bdi_exit(struct backing_dev_info *bdi) in bdi_exit() argument
856 WARN_ON_ONCE(bdi->dev); in bdi_exit()
857 wb_exit(&bdi->wb); in bdi_exit()
860 void bdi_destroy(struct backing_dev_info *bdi) in bdi_destroy() argument
862 bdi_unregister(bdi); in bdi_destroy()
863 bdi_exit(bdi); in bdi_destroy()
871 int bdi_setup_and_register(struct backing_dev_info *bdi, char *name) in bdi_setup_and_register() argument
875 bdi->name = name; in bdi_setup_and_register()
876 bdi->capabilities = 0; in bdi_setup_and_register()
877 err = bdi_init(bdi); in bdi_setup_and_register()
881 err = bdi_register(bdi, NULL, "%.28s-%ld", name, in bdi_setup_and_register()
884 bdi_destroy(bdi); in bdi_setup_and_register()