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: Shaohua Li <shli@fusionio.com> Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
851c30c9ba
commit
b721420e87
|
@ -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 = {
|
||||||
|
|
Loading…
Reference in a new issue