From: kernel test robot <lkp@intel.com> To: kbuild-all@lists.01.org Subject: [cgroup:for-next 1/5] kernel/cgroup/misc.c:61 valid_type() warn: unsigned 'type' is never less than zero. Date: Tue, 13 Apr 2021 12:30:50 +0800 [thread overview] Message-ID: <202104131244.3qFwbTtx-lkp@intel.com> (raw) [-- Attachment #1: Type: text/plain, Size: 8801 bytes --] tree: https://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git for-next head: d95af61df072a7d70b311a11c0c24cf7d8ccebd9 commit: a72232eabdfcfe365a05a3eb392288b78d25a5ca [1/5] cgroup: Add misc cgroup controller config: parisc-randconfig-m031-20210413 (attached as .config) compiler: hppa-linux-gcc (GCC) 9.3.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> smatch warnings: kernel/cgroup/misc.c:61 valid_type() warn: unsigned 'type' is never less than zero. kernel/cgroup/misc.c:210 misc_cg_max_show() warn: we never enter this loop kernel/cgroup/misc.c:257 misc_cg_max_write() warn: we never enter this loop kernel/cgroup/misc.c:299 misc_cg_current_show() warn: we never enter this loop kernel/cgroup/misc.c:323 misc_cg_capacity_show() warn: we never enter this loop kernel/cgroup/misc.c:376 misc_cg_alloc() warn: we never enter this loop kernel/cgroup/misc.c:376 misc_cg_alloc() warn: unsigned 'i' is never less than zero. kernel/cgroup/misc.c:376 misc_cg_alloc() warn: unsigned 'i' is never less than zero. vim +/type +61 kernel/cgroup/misc.c 49 50 /** 51 * valid_type() - Check if @type is valid or not. 52 * @type: misc res type. 53 * 54 * Context: Any context. 55 * Return: 56 * * true - If valid type. 57 * * false - If not valid type. 58 */ 59 static inline bool valid_type(enum misc_res_type type) 60 { > 61 return type >= 0 && type < MISC_CG_RES_TYPES; 62 } 63 64 /** 65 * misc_cg_res_total_usage() - Get the current total usage of the resource. 66 * @type: misc res type. 67 * 68 * Context: Any context. 69 * Return: Current total usage of the resource. 70 */ 71 unsigned long misc_cg_res_total_usage(enum misc_res_type type) 72 { 73 if (valid_type(type)) 74 return atomic_long_read(&root_cg.res[type].usage); 75 76 return 0; 77 } 78 EXPORT_SYMBOL_GPL(misc_cg_res_total_usage); 79 80 /** 81 * misc_cg_set_capacity() - Set the capacity of the misc cgroup res. 82 * @type: Type of the misc res. 83 * @capacity: Supported capacity of the misc res on the host. 84 * 85 * If capacity is 0 then the charging a misc cgroup fails for that type. 86 * 87 * Context: Any context. 88 * Return: 89 * * %0 - Successfully registered the capacity. 90 * * %-EINVAL - If @type is invalid. 91 */ 92 int misc_cg_set_capacity(enum misc_res_type type, unsigned long capacity) 93 { 94 if (!valid_type(type)) 95 return -EINVAL; 96 97 WRITE_ONCE(misc_res_capacity[type], capacity); 98 return 0; 99 } 100 EXPORT_SYMBOL_GPL(misc_cg_set_capacity); 101 102 /** 103 * misc_cg_cancel_charge() - Cancel the charge from the misc cgroup. 104 * @type: Misc res type in misc cg to cancel the charge from. 105 * @cg: Misc cgroup to cancel charge from. 106 * @amount: Amount to cancel. 107 * 108 * Context: Any context. 109 */ 110 static void misc_cg_cancel_charge(enum misc_res_type type, struct misc_cg *cg, 111 unsigned long amount) 112 { 113 WARN_ONCE(atomic_long_add_negative(-amount, &cg->res[type].usage), 114 "misc cgroup resource %s became less than 0", 115 misc_res_name[type]); 116 } 117 118 /** 119 * misc_cg_try_charge() - Try charging the misc cgroup. 120 * @type: Misc res type to charge. 121 * @cg: Misc cgroup which will be charged. 122 * @amount: Amount to charge. 123 * 124 * Charge @amount to the misc cgroup. Caller must use the same cgroup during 125 * the uncharge call. 126 * 127 * Context: Any context. 128 * Return: 129 * * %0 - If successfully charged. 130 * * -EINVAL - If @type is invalid or misc res has 0 capacity. 131 * * -EBUSY - If max limit will be crossed or total usage will be more than the 132 * capacity. 133 */ 134 int misc_cg_try_charge(enum misc_res_type type, struct misc_cg *cg, 135 unsigned long amount) 136 { 137 struct misc_cg *i, *j; 138 int ret; 139 struct misc_res *res; 140 int new_usage; 141 142 if (!(valid_type(type) && cg && READ_ONCE(misc_res_capacity[type]))) 143 return -EINVAL; 144 145 if (!amount) 146 return 0; 147 148 for (i = cg; i; i = parent_misc(i)) { 149 res = &i->res[type]; 150 151 new_usage = atomic_long_add_return(amount, &res->usage); 152 if (new_usage > READ_ONCE(res->max) || 153 new_usage > READ_ONCE(misc_res_capacity[type])) { 154 if (!res->failed) { 155 pr_info("cgroup: charge rejected by the misc controller for %s resource in ", 156 misc_res_name[type]); 157 pr_cont_cgroup_path(i->css.cgroup); 158 pr_cont("\n"); 159 res->failed = true; 160 } 161 ret = -EBUSY; 162 goto err_charge; 163 } 164 } 165 return 0; 166 167 err_charge: 168 for (j = cg; j != i; j = parent_misc(j)) 169 misc_cg_cancel_charge(type, j, amount); 170 misc_cg_cancel_charge(type, i, amount); 171 return ret; 172 } 173 EXPORT_SYMBOL_GPL(misc_cg_try_charge); 174 175 /** 176 * misc_cg_uncharge() - Uncharge the misc cgroup. 177 * @type: Misc res type which was charged. 178 * @cg: Misc cgroup which will be uncharged. 179 * @amount: Charged amount. 180 * 181 * Context: Any context. 182 */ 183 void misc_cg_uncharge(enum misc_res_type type, struct misc_cg *cg, 184 unsigned long amount) 185 { 186 struct misc_cg *i; 187 188 if (!(amount && valid_type(type) && cg)) 189 return; 190 191 for (i = cg; i; i = parent_misc(i)) 192 misc_cg_cancel_charge(type, i, amount); 193 } 194 EXPORT_SYMBOL_GPL(misc_cg_uncharge); 195 196 /** 197 * misc_cg_max_show() - Show the misc cgroup max limit. 198 * @sf: Interface file 199 * @v: Arguments passed 200 * 201 * Context: Any context. 202 * Return: 0 to denote successful print. 203 */ 204 static int misc_cg_max_show(struct seq_file *sf, void *v) 205 { 206 int i; 207 struct misc_cg *cg = css_misc(seq_css(sf)); 208 unsigned long max; 209 > 210 for (i = 0; i < MISC_CG_RES_TYPES; i++) { 211 if (READ_ONCE(misc_res_capacity[i])) { 212 max = READ_ONCE(cg->res[i].max); 213 if (max == MAX_NUM) 214 seq_printf(sf, "%s max\n", misc_res_name[i]); 215 else 216 seq_printf(sf, "%s %lu\n", misc_res_name[i], 217 max); 218 } 219 } 220 221 return 0; 222 } 223 224 /** 225 * misc_cg_max_write() - Update the maximum limit of the cgroup. 226 * @of: Handler for the file. 227 * @buf: Data from the user. It should be either "max", 0, or a positive 228 * integer. 229 * @nbytes: Number of bytes of the data. 230 * @off: Offset in the file. 231 * 232 * User can pass data like: 233 * echo sev 23 > misc.max, OR 234 * echo sev max > misc.max 235 * 236 * Context: Any context. 237 * Return: 238 * * >= 0 - Number of bytes processed in the input. 239 * * -EINVAL - If buf is not valid. 240 * * -ERANGE - If number is bigger than the unsigned long capacity. 241 */ 242 static ssize_t misc_cg_max_write(struct kernfs_open_file *of, char *buf, 243 size_t nbytes, loff_t off) 244 { 245 struct misc_cg *cg; 246 unsigned long max; 247 int ret = 0, i; 248 enum misc_res_type type = MISC_CG_RES_TYPES; 249 char *token; 250 251 buf = strstrip(buf); 252 token = strsep(&buf, " "); 253 254 if (!token || !buf) 255 return -EINVAL; 256 > 257 for (i = 0; i < MISC_CG_RES_TYPES; i++) { 258 if (!strcmp(misc_res_name[i], token)) { 259 type = i; 260 break; 261 } 262 } 263 264 if (type == MISC_CG_RES_TYPES) 265 return -EINVAL; 266 267 if (!strcmp(MAX_STR, buf)) { 268 max = MAX_NUM; 269 } else { 270 ret = kstrtoul(buf, 0, &max); 271 if (ret) 272 return ret; 273 } 274 275 cg = css_misc(of_css(of)); 276 277 if (READ_ONCE(misc_res_capacity[type])) 278 WRITE_ONCE(cg->res[type].max, max); 279 else 280 ret = -EINVAL; 281 282 return ret ? ret : nbytes; 283 } 284 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org [-- Attachment #2: config.gz --] [-- Type: application/gzip, Size: 28316 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> To: Vipin Sharma <vipinsh-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org> Cc: kbuild-all-hn68Rpc1hR1g9hUCZPvPmw@public.gmane.org, cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>, David Rientjes <rientjes-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org> Subject: [cgroup:for-next 1/5] kernel/cgroup/misc.c:61 valid_type() warn: unsigned 'type' is never less than zero. Date: Tue, 13 Apr 2021 12:30:50 +0800 [thread overview] Message-ID: <202104131244.3qFwbTtx-lkp@intel.com> (raw) [-- Attachment #1: Type: text/plain, Size: 8595 bytes --] tree: https://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git for-next head: d95af61df072a7d70b311a11c0c24cf7d8ccebd9 commit: a72232eabdfcfe365a05a3eb392288b78d25a5ca [1/5] cgroup: Add misc cgroup controller config: parisc-randconfig-m031-20210413 (attached as .config) compiler: hppa-linux-gcc (GCC) 9.3.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> smatch warnings: kernel/cgroup/misc.c:61 valid_type() warn: unsigned 'type' is never less than zero. kernel/cgroup/misc.c:210 misc_cg_max_show() warn: we never enter this loop kernel/cgroup/misc.c:257 misc_cg_max_write() warn: we never enter this loop kernel/cgroup/misc.c:299 misc_cg_current_show() warn: we never enter this loop kernel/cgroup/misc.c:323 misc_cg_capacity_show() warn: we never enter this loop kernel/cgroup/misc.c:376 misc_cg_alloc() warn: we never enter this loop kernel/cgroup/misc.c:376 misc_cg_alloc() warn: unsigned 'i' is never less than zero. kernel/cgroup/misc.c:376 misc_cg_alloc() warn: unsigned 'i' is never less than zero. vim +/type +61 kernel/cgroup/misc.c 49 50 /** 51 * valid_type() - Check if @type is valid or not. 52 * @type: misc res type. 53 * 54 * Context: Any context. 55 * Return: 56 * * true - If valid type. 57 * * false - If not valid type. 58 */ 59 static inline bool valid_type(enum misc_res_type type) 60 { > 61 return type >= 0 && type < MISC_CG_RES_TYPES; 62 } 63 64 /** 65 * misc_cg_res_total_usage() - Get the current total usage of the resource. 66 * @type: misc res type. 67 * 68 * Context: Any context. 69 * Return: Current total usage of the resource. 70 */ 71 unsigned long misc_cg_res_total_usage(enum misc_res_type type) 72 { 73 if (valid_type(type)) 74 return atomic_long_read(&root_cg.res[type].usage); 75 76 return 0; 77 } 78 EXPORT_SYMBOL_GPL(misc_cg_res_total_usage); 79 80 /** 81 * misc_cg_set_capacity() - Set the capacity of the misc cgroup res. 82 * @type: Type of the misc res. 83 * @capacity: Supported capacity of the misc res on the host. 84 * 85 * If capacity is 0 then the charging a misc cgroup fails for that type. 86 * 87 * Context: Any context. 88 * Return: 89 * * %0 - Successfully registered the capacity. 90 * * %-EINVAL - If @type is invalid. 91 */ 92 int misc_cg_set_capacity(enum misc_res_type type, unsigned long capacity) 93 { 94 if (!valid_type(type)) 95 return -EINVAL; 96 97 WRITE_ONCE(misc_res_capacity[type], capacity); 98 return 0; 99 } 100 EXPORT_SYMBOL_GPL(misc_cg_set_capacity); 101 102 /** 103 * misc_cg_cancel_charge() - Cancel the charge from the misc cgroup. 104 * @type: Misc res type in misc cg to cancel the charge from. 105 * @cg: Misc cgroup to cancel charge from. 106 * @amount: Amount to cancel. 107 * 108 * Context: Any context. 109 */ 110 static void misc_cg_cancel_charge(enum misc_res_type type, struct misc_cg *cg, 111 unsigned long amount) 112 { 113 WARN_ONCE(atomic_long_add_negative(-amount, &cg->res[type].usage), 114 "misc cgroup resource %s became less than 0", 115 misc_res_name[type]); 116 } 117 118 /** 119 * misc_cg_try_charge() - Try charging the misc cgroup. 120 * @type: Misc res type to charge. 121 * @cg: Misc cgroup which will be charged. 122 * @amount: Amount to charge. 123 * 124 * Charge @amount to the misc cgroup. Caller must use the same cgroup during 125 * the uncharge call. 126 * 127 * Context: Any context. 128 * Return: 129 * * %0 - If successfully charged. 130 * * -EINVAL - If @type is invalid or misc res has 0 capacity. 131 * * -EBUSY - If max limit will be crossed or total usage will be more than the 132 * capacity. 133 */ 134 int misc_cg_try_charge(enum misc_res_type type, struct misc_cg *cg, 135 unsigned long amount) 136 { 137 struct misc_cg *i, *j; 138 int ret; 139 struct misc_res *res; 140 int new_usage; 141 142 if (!(valid_type(type) && cg && READ_ONCE(misc_res_capacity[type]))) 143 return -EINVAL; 144 145 if (!amount) 146 return 0; 147 148 for (i = cg; i; i = parent_misc(i)) { 149 res = &i->res[type]; 150 151 new_usage = atomic_long_add_return(amount, &res->usage); 152 if (new_usage > READ_ONCE(res->max) || 153 new_usage > READ_ONCE(misc_res_capacity[type])) { 154 if (!res->failed) { 155 pr_info("cgroup: charge rejected by the misc controller for %s resource in ", 156 misc_res_name[type]); 157 pr_cont_cgroup_path(i->css.cgroup); 158 pr_cont("\n"); 159 res->failed = true; 160 } 161 ret = -EBUSY; 162 goto err_charge; 163 } 164 } 165 return 0; 166 167 err_charge: 168 for (j = cg; j != i; j = parent_misc(j)) 169 misc_cg_cancel_charge(type, j, amount); 170 misc_cg_cancel_charge(type, i, amount); 171 return ret; 172 } 173 EXPORT_SYMBOL_GPL(misc_cg_try_charge); 174 175 /** 176 * misc_cg_uncharge() - Uncharge the misc cgroup. 177 * @type: Misc res type which was charged. 178 * @cg: Misc cgroup which will be uncharged. 179 * @amount: Charged amount. 180 * 181 * Context: Any context. 182 */ 183 void misc_cg_uncharge(enum misc_res_type type, struct misc_cg *cg, 184 unsigned long amount) 185 { 186 struct misc_cg *i; 187 188 if (!(amount && valid_type(type) && cg)) 189 return; 190 191 for (i = cg; i; i = parent_misc(i)) 192 misc_cg_cancel_charge(type, i, amount); 193 } 194 EXPORT_SYMBOL_GPL(misc_cg_uncharge); 195 196 /** 197 * misc_cg_max_show() - Show the misc cgroup max limit. 198 * @sf: Interface file 199 * @v: Arguments passed 200 * 201 * Context: Any context. 202 * Return: 0 to denote successful print. 203 */ 204 static int misc_cg_max_show(struct seq_file *sf, void *v) 205 { 206 int i; 207 struct misc_cg *cg = css_misc(seq_css(sf)); 208 unsigned long max; 209 > 210 for (i = 0; i < MISC_CG_RES_TYPES; i++) { 211 if (READ_ONCE(misc_res_capacity[i])) { 212 max = READ_ONCE(cg->res[i].max); 213 if (max == MAX_NUM) 214 seq_printf(sf, "%s max\n", misc_res_name[i]); 215 else 216 seq_printf(sf, "%s %lu\n", misc_res_name[i], 217 max); 218 } 219 } 220 221 return 0; 222 } 223 224 /** 225 * misc_cg_max_write() - Update the maximum limit of the cgroup. 226 * @of: Handler for the file. 227 * @buf: Data from the user. It should be either "max", 0, or a positive 228 * integer. 229 * @nbytes: Number of bytes of the data. 230 * @off: Offset in the file. 231 * 232 * User can pass data like: 233 * echo sev 23 > misc.max, OR 234 * echo sev max > misc.max 235 * 236 * Context: Any context. 237 * Return: 238 * * >= 0 - Number of bytes processed in the input. 239 * * -EINVAL - If buf is not valid. 240 * * -ERANGE - If number is bigger than the unsigned long capacity. 241 */ 242 static ssize_t misc_cg_max_write(struct kernfs_open_file *of, char *buf, 243 size_t nbytes, loff_t off) 244 { 245 struct misc_cg *cg; 246 unsigned long max; 247 int ret = 0, i; 248 enum misc_res_type type = MISC_CG_RES_TYPES; 249 char *token; 250 251 buf = strstrip(buf); 252 token = strsep(&buf, " "); 253 254 if (!token || !buf) 255 return -EINVAL; 256 > 257 for (i = 0; i < MISC_CG_RES_TYPES; i++) { 258 if (!strcmp(misc_res_name[i], token)) { 259 type = i; 260 break; 261 } 262 } 263 264 if (type == MISC_CG_RES_TYPES) 265 return -EINVAL; 266 267 if (!strcmp(MAX_STR, buf)) { 268 max = MAX_NUM; 269 } else { 270 ret = kstrtoul(buf, 0, &max); 271 if (ret) 272 return ret; 273 } 274 275 cg = css_misc(of_css(of)); 276 277 if (READ_ONCE(misc_res_capacity[type])) 278 WRITE_ONCE(cg->res[type].max, max); 279 else 280 ret = -EINVAL; 281 282 return ret ? ret : nbytes; 283 } 284 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all-hn68Rpc1hR1g9hUCZPvPmw@public.gmane.org [-- Attachment #2: .config.gz --] [-- Type: application/gzip, Size: 28316 bytes --]
next reply other threads:[~2021-04-13 4:30 UTC|newest] Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-04-13 4:30 kernel test robot [this message] 2021-04-13 4:30 ` [cgroup:for-next 1/5] kernel/cgroup/misc.c:61 valid_type() warn: unsigned 'type' is never less than zero kernel test robot 2021-04-13 6:21 ` Vipin Sharma 2021-04-13 6:21 ` Vipin Sharma 2021-04-16 20:42 ` Tejun Heo 2021-04-16 20:42 ` Tejun Heo
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=202104131244.3qFwbTtx-lkp@intel.com \ --to=lkp@intel.com \ --cc=kbuild-all@lists.01.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.