diff options
-rw-r--r-- | kernel/workqueue.c | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 72c1adbf7632..80190755a3c4 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c | |||
@@ -4954,18 +4954,22 @@ static ssize_t wq_nice_store(struct device *dev, struct device_attribute *attr, | |||
4954 | { | 4954 | { |
4955 | struct workqueue_struct *wq = dev_to_wq(dev); | 4955 | struct workqueue_struct *wq = dev_to_wq(dev); |
4956 | struct workqueue_attrs *attrs; | 4956 | struct workqueue_attrs *attrs; |
4957 | int ret; | 4957 | int ret = -ENOMEM; |
4958 | |||
4959 | apply_wqattrs_lock(); | ||
4958 | 4960 | ||
4959 | attrs = wq_sysfs_prep_attrs(wq); | 4961 | attrs = wq_sysfs_prep_attrs(wq); |
4960 | if (!attrs) | 4962 | if (!attrs) |
4961 | return -ENOMEM; | 4963 | goto out_unlock; |
4962 | 4964 | ||
4963 | if (sscanf(buf, "%d", &attrs->nice) == 1 && | 4965 | if (sscanf(buf, "%d", &attrs->nice) == 1 && |
4964 | attrs->nice >= MIN_NICE && attrs->nice <= MAX_NICE) | 4966 | attrs->nice >= MIN_NICE && attrs->nice <= MAX_NICE) |
4965 | ret = apply_workqueue_attrs(wq, attrs); | 4967 | ret = apply_workqueue_attrs_locked(wq, attrs); |
4966 | else | 4968 | else |
4967 | ret = -EINVAL; | 4969 | ret = -EINVAL; |
4968 | 4970 | ||
4971 | out_unlock: | ||
4972 | apply_wqattrs_unlock(); | ||
4969 | free_workqueue_attrs(attrs); | 4973 | free_workqueue_attrs(attrs); |
4970 | return ret ?: count; | 4974 | return ret ?: count; |
4971 | } | 4975 | } |
@@ -4989,16 +4993,20 @@ static ssize_t wq_cpumask_store(struct device *dev, | |||
4989 | { | 4993 | { |
4990 | struct workqueue_struct *wq = dev_to_wq(dev); | 4994 | struct workqueue_struct *wq = dev_to_wq(dev); |
4991 | struct workqueue_attrs *attrs; | 4995 | struct workqueue_attrs *attrs; |
4992 | int ret; | 4996 | int ret = -ENOMEM; |
4997 | |||
4998 | apply_wqattrs_lock(); | ||
4993 | 4999 | ||
4994 | attrs = wq_sysfs_prep_attrs(wq); | 5000 | attrs = wq_sysfs_prep_attrs(wq); |
4995 | if (!attrs) | 5001 | if (!attrs) |
4996 | return -ENOMEM; | 5002 | goto out_unlock; |
4997 | 5003 | ||
4998 | ret = cpumask_parse(buf, attrs->cpumask); | 5004 | ret = cpumask_parse(buf, attrs->cpumask); |
4999 | if (!ret) | 5005 | if (!ret) |
5000 | ret = apply_workqueue_attrs(wq, attrs); | 5006 | ret = apply_workqueue_attrs_locked(wq, attrs); |
5001 | 5007 | ||
5008 | out_unlock: | ||
5009 | apply_wqattrs_unlock(); | ||
5002 | free_workqueue_attrs(attrs); | 5010 | free_workqueue_attrs(attrs); |
5003 | return ret ?: count; | 5011 | return ret ?: count; |
5004 | } | 5012 | } |
@@ -5022,18 +5030,22 @@ static ssize_t wq_numa_store(struct device *dev, struct device_attribute *attr, | |||
5022 | { | 5030 | { |
5023 | struct workqueue_struct *wq = dev_to_wq(dev); | 5031 | struct workqueue_struct *wq = dev_to_wq(dev); |
5024 | struct workqueue_attrs *attrs; | 5032 | struct workqueue_attrs *attrs; |
5025 | int v, ret; | 5033 | int v, ret = -ENOMEM; |
5034 | |||
5035 | apply_wqattrs_lock(); | ||
5026 | 5036 | ||
5027 | attrs = wq_sysfs_prep_attrs(wq); | 5037 | attrs = wq_sysfs_prep_attrs(wq); |
5028 | if (!attrs) | 5038 | if (!attrs) |
5029 | return -ENOMEM; | 5039 | goto out_unlock; |
5030 | 5040 | ||
5031 | ret = -EINVAL; | 5041 | ret = -EINVAL; |
5032 | if (sscanf(buf, "%d", &v) == 1) { | 5042 | if (sscanf(buf, "%d", &v) == 1) { |
5033 | attrs->no_numa = !v; | 5043 | attrs->no_numa = !v; |
5034 | ret = apply_workqueue_attrs(wq, attrs); | 5044 | ret = apply_workqueue_attrs_locked(wq, attrs); |
5035 | } | 5045 | } |
5036 | 5046 | ||
5047 | out_unlock: | ||
5048 | apply_wqattrs_unlock(); | ||
5037 | free_workqueue_attrs(attrs); | 5049 | free_workqueue_attrs(attrs); |
5038 | return ret ?: count; | 5050 | return ret ?: count; |
5039 | } | 5051 | } |