Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cf0ca9fe authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Linus Torvalds
Browse files

mm: bdi: export BDI attributes in sysfs



Provide a place in sysfs (/sys/class/bdi) for the backing_dev_info object.
This allows us to see and set the various BDI specific variables.

In particular this properly exposes the read-ahead window for all relevant
users and /sys/block/<block>/queue/read_ahead_kb should be deprecated.

With patient help from Kay Sievers and Greg KH

[mszeredi@suse.cz]

 - split off NFS and FUSE changes into separate patches
 - document new sysfs attributes under Documentation/ABI
 - do bdi_class_init as a core_initcall, otherwise the "default" BDI
   won't be initialized
 - remove bdi_init_fmt macro, it's not used very much

[akpm@linux-foundation.org: fix ia64 warning]
Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Acked-by: default avatarGreg KH <greg@kroah.com>
Cc: Trond Myklebust <trond.myklebust@fys.uio.no>
Signed-off-by: default avatarMiklos Szeredi <mszeredi@suse.cz>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent caafa432
Loading
Loading
Loading
Loading
+46 −0
Original line number Diff line number Diff line
What:		/sys/class/bdi/<bdi>/
Date:		January 2008
Contact:	Peter Zijlstra <a.p.zijlstra@chello.nl>
Description:

Provide a place in sysfs for the backing_dev_info object.
This allows us to see and set the various BDI specific variables.

The <bdi> identifier can be either of the following:

MAJOR:MINOR

	Device number for block devices, or value of st_dev on
	non-block filesystems which provide their own BDI, such as NFS
	and FUSE.

default

	The default backing dev, used for non-block device backed
	filesystems which do not provide their own BDI.

Files under /sys/class/bdi/<bdi>/
---------------------------------

read_ahead_kb (read-write)

	Size of the read-ahead window in kilobytes

reclaimable_kb (read-only)

	Reclaimable (dirty or unstable) memory destined for writeback
	to this device

writeback_kb (read-only)

	Memory currently under writeback to this device

dirty_kb (read-only)

	Global threshold for reclaimable + writeback memory

bdi_dirty_kb (read-only)

	Current threshold on this BDI for reclaimable + writeback
	memory
+8 −0
Original line number Diff line number Diff line
@@ -182,11 +182,17 @@ static int exact_lock(dev_t devt, void *data)
 */
void add_disk(struct gendisk *disk)
{
	struct backing_dev_info *bdi;

	disk->flags |= GENHD_FL_UP;
	blk_register_region(MKDEV(disk->major, disk->first_minor),
			    disk->minors, NULL, exact_match, exact_lock, disk);
	register_disk(disk);
	blk_register_queue(disk);

	bdi = &disk->queue->backing_dev_info;
	bdi_register_dev(bdi, MKDEV(disk->major, disk->first_minor));
	sysfs_create_link(&disk->dev.kobj, &bdi->dev->kobj, "bdi");
}

EXPORT_SYMBOL(add_disk);
@@ -194,6 +200,8 @@ EXPORT_SYMBOL(del_gendisk); /* in partitions/check.c */

void unlink_gendisk(struct gendisk *disk)
{
	sysfs_remove_link(&disk->dev.kobj, "bdi");
	bdi_unregister(&disk->queue->backing_dev_info);
	blk_unregister_queue(disk);
	blk_unregister_region(MKDEV(disk->major, disk->first_minor),
			      disk->minors);
+9 −0
Original line number Diff line number Diff line
@@ -11,9 +11,11 @@
#include <linux/percpu_counter.h>
#include <linux/log2.h>
#include <linux/proportions.h>
#include <linux/kernel.h>
#include <asm/atomic.h>

struct page;
struct device;

/*
 * Bits in backing_dev_info.state
@@ -48,11 +50,18 @@ struct backing_dev_info {

	struct prop_local_percpu completions;
	int dirty_exceeded;

	struct device *dev;
};

int bdi_init(struct backing_dev_info *bdi);
void bdi_destroy(struct backing_dev_info *bdi);

int bdi_register(struct backing_dev_info *bdi, struct device *parent,
		const char *fmt, ...);
int bdi_register_dev(struct backing_dev_info *bdi, dev_t dev);
void bdi_unregister(struct backing_dev_info *bdi);

static inline void __add_bdi_stat(struct backing_dev_info *bdi,
		enum bdi_stat_item item, s64 amount)
{
+3 −0
Original line number Diff line number Diff line
@@ -114,6 +114,9 @@ struct file;
int dirty_writeback_centisecs_handler(struct ctl_table *, int, struct file *,
				      void __user *, size_t *, loff_t *);

void get_dirty_limits(long *pbackground, long *pdirty, long *pbdi_dirty,
		 struct backing_dev_info *bdi);

void page_writeback_init(void);
void balance_dirty_pages_ratelimited_nr(struct address_space *mapping,
					unsigned long nr_pages_dirtied);
+1 −0
Original line number Diff line number Diff line
@@ -102,6 +102,7 @@ void percpu_counter_destroy(struct percpu_counter *fbc)
		return;

	free_percpu(fbc->counters);
	fbc->counters = NULL;
#ifdef CONFIG_HOTPLUG_CPU
	mutex_lock(&percpu_counters_lock);
	list_del(&fbc->list);
Loading