diff options
author | Xiaochen Shen <xiaochen.shen@intel.com> | 2018-09-15 17:58:19 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2018-09-18 17:38:05 -0400 |
commit | 753694a8df318f204a0ac1303de136def16f2e9c (patch) | |
tree | 97ad6969ff38d68cbb26ad8496cc5f46cba7efc1 /arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c | |
parent | 6a1cac56f41f9ea94e440dfcc1cac44b41a1b194 (diff) |
x86/intel_rdt: Fix data type in parsing callbacks
Each resource is associated with a parsing callback to parse the data
provided from user space when writing schemata file.
The 'data' parameter in the callbacks is defined as a void pointer which
is error prone due to lack of type check.
parse_bw() processes the 'data' parameter as a string while its caller
actually passes the parameter as a pointer to struct rdt_cbm_parse_data.
Thus, parse_bw() takes wrong data and causes failure of parsing MBA
throttle value.
To fix the issue, the 'data' parameter in all parsing callbacks is defined
and handled as a pointer to struct rdt_parse_data (renamed from struct
rdt_cbm_parse_data).
Fixes: 7604df6e16ae ("x86/intel_rdt: Support flexible data to parsing callbacks")
Fixes: 9ab9aa15c309 ("x86/intel_rdt: Ensure requested schemata respects mode")
Signed-off-by: Xiaochen Shen <xiaochen.shen@intel.com>
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: "H Peter Anvin" <hpa@zytor.com>
Cc: "Tony Luck" <tony.luck@intel.com>
Cc: "Chen Yu" <yu.c.chen@intel.com>
Link: https://lkml.kernel.org/r/1537048707-76280-2-git-send-email-fenghua.yu@intel.com
Diffstat (limited to 'arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c')
-rw-r--r-- | arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c | 21 |
1 files changed, 8 insertions, 13 deletions
diff --git a/arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c b/arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c index af358ca05160..edd5761f7336 100644 --- a/arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c +++ b/arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c | |||
@@ -64,19 +64,19 @@ static bool bw_validate(char *buf, unsigned long *data, struct rdt_resource *r) | |||
64 | return true; | 64 | return true; |
65 | } | 65 | } |
66 | 66 | ||
67 | int parse_bw(void *_buf, struct rdt_resource *r, struct rdt_domain *d) | 67 | int parse_bw(struct rdt_parse_data *data, struct rdt_resource *r, |
68 | struct rdt_domain *d) | ||
68 | { | 69 | { |
69 | unsigned long data; | 70 | unsigned long bw_val; |
70 | char *buf = _buf; | ||
71 | 71 | ||
72 | if (d->have_new_ctrl) { | 72 | if (d->have_new_ctrl) { |
73 | rdt_last_cmd_printf("duplicate domain %d\n", d->id); | 73 | rdt_last_cmd_printf("duplicate domain %d\n", d->id); |
74 | return -EINVAL; | 74 | return -EINVAL; |
75 | } | 75 | } |
76 | 76 | ||
77 | if (!bw_validate(buf, &data, r)) | 77 | if (!bw_validate(data->buf, &bw_val, r)) |
78 | return -EINVAL; | 78 | return -EINVAL; |
79 | d->new_ctrl = data; | 79 | d->new_ctrl = bw_val; |
80 | d->have_new_ctrl = true; | 80 | d->have_new_ctrl = true; |
81 | 81 | ||
82 | return 0; | 82 | return 0; |
@@ -123,18 +123,13 @@ static bool cbm_validate(char *buf, u32 *data, struct rdt_resource *r) | |||
123 | return true; | 123 | return true; |
124 | } | 124 | } |
125 | 125 | ||
126 | struct rdt_cbm_parse_data { | ||
127 | struct rdtgroup *rdtgrp; | ||
128 | char *buf; | ||
129 | }; | ||
130 | |||
131 | /* | 126 | /* |
132 | * Read one cache bit mask (hex). Check that it is valid for the current | 127 | * Read one cache bit mask (hex). Check that it is valid for the current |
133 | * resource type. | 128 | * resource type. |
134 | */ | 129 | */ |
135 | int parse_cbm(void *_data, struct rdt_resource *r, struct rdt_domain *d) | 130 | int parse_cbm(struct rdt_parse_data *data, struct rdt_resource *r, |
131 | struct rdt_domain *d) | ||
136 | { | 132 | { |
137 | struct rdt_cbm_parse_data *data = _data; | ||
138 | struct rdtgroup *rdtgrp = data->rdtgrp; | 133 | struct rdtgroup *rdtgrp = data->rdtgrp; |
139 | u32 cbm_val; | 134 | u32 cbm_val; |
140 | 135 | ||
@@ -195,7 +190,7 @@ int parse_cbm(void *_data, struct rdt_resource *r, struct rdt_domain *d) | |||
195 | static int parse_line(char *line, struct rdt_resource *r, | 190 | static int parse_line(char *line, struct rdt_resource *r, |
196 | struct rdtgroup *rdtgrp) | 191 | struct rdtgroup *rdtgrp) |
197 | { | 192 | { |
198 | struct rdt_cbm_parse_data data; | 193 | struct rdt_parse_data data; |
199 | char *dom = NULL, *id; | 194 | char *dom = NULL, *id; |
200 | struct rdt_domain *d; | 195 | struct rdt_domain *d; |
201 | unsigned long dom_id; | 196 | unsigned long dom_id; |