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

Commit b721420e authored by Shaohua Li's avatar Shaohua Li Committed by NeilBrown
Browse files

raid5: sysfs entry to control worker thread number



Add a sysfs entry to control running workqueue thread number. If
group_thread_cnt is set to 0, we will disable workqueue offload handling of
stripes.

Signed-off-by: default avatarShaohua Li <shli@fusionio.com>
Signed-off-by: default avatarNeilBrown <neilb@suse.de>
parent 851c30c9
Loading
Loading
Loading
Loading
+60 −0
Original line number Original line Diff line number Diff line
@@ -5145,10 +5145,70 @@ stripe_cache_active_show(struct mddev *mddev, char *page)
static struct md_sysfs_entry
static struct md_sysfs_entry
raid5_stripecache_active = __ATTR_RO(stripe_cache_active);
raid5_stripecache_active = __ATTR_RO(stripe_cache_active);


static ssize_t
raid5_show_group_thread_cnt(struct mddev *mddev, char *page)
{
	struct r5conf *conf = mddev->private;
	if (conf)
		return sprintf(page, "%d\n", conf->worker_cnt_per_group);
	else
		return 0;
}

static int alloc_thread_groups(struct r5conf *conf, int cnt);
static ssize_t
raid5_store_group_thread_cnt(struct mddev *mddev, const char *page, size_t len)
{
	struct r5conf *conf = mddev->private;
	unsigned long new;
	int err;
	struct r5worker_group *old_groups;
	int old_group_cnt;

	if (len >= PAGE_SIZE)
		return -EINVAL;
	if (!conf)
		return -ENODEV;

	if (kstrtoul(page, 10, &new))
		return -EINVAL;

	if (new == conf->worker_cnt_per_group)
		return len;

	mddev_suspend(mddev);

	old_groups = conf->worker_groups;
	old_group_cnt = conf->worker_cnt_per_group;

	conf->worker_groups = NULL;
	err = alloc_thread_groups(conf, new);
	if (err) {
		conf->worker_groups = old_groups;
		conf->worker_cnt_per_group = old_group_cnt;
	} else {
		if (old_groups)
			kfree(old_groups[0].workers);
		kfree(old_groups);
	}

	mddev_resume(mddev);

	if (err)
		return err;
	return len;
}

static struct md_sysfs_entry
raid5_group_thread_cnt = __ATTR(group_thread_cnt, S_IRUGO | S_IWUSR,
				raid5_show_group_thread_cnt,
				raid5_store_group_thread_cnt);

static struct attribute *raid5_attrs[] =  {
static struct attribute *raid5_attrs[] =  {
	&raid5_stripecache_size.attr,
	&raid5_stripecache_size.attr,
	&raid5_stripecache_active.attr,
	&raid5_stripecache_active.attr,
	&raid5_preread_bypass_threshold.attr,
	&raid5_preread_bypass_threshold.attr,
	&raid5_group_thread_cnt.attr,
	NULL,
	NULL,
};
};
static struct attribute_group raid5_attrs_group = {
static struct attribute_group raid5_attrs_group = {