All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: kbuild@lists.01.org
Subject: mm/damon/dbgfs.c:76 dbgfs_attrs_write() warn: passing a valid pointer to 'PTR_ERR'
Date: Fri, 10 Sep 2021 19:07:43 +0800	[thread overview]
Message-ID: <202109101935.eMeXpFdc-lkp@intel.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 13376 bytes --]

CC: kbuild-all(a)lists.01.org
CC: linux-kernel(a)vger.kernel.org
TO: SeongJae Park <sjpark@amazon.de>
CC: Leonard Foerster <foersleo@amazon.de>
CC: Fernand Sieber <sieberf@amazon.com>
CC: Andrew Morton <akpm@linux-foundation.org>
CC: Linux Memory Management List <linux-mm@kvack.org>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   bf9f243f23e6623f310ba03fbb14e10ec3a61290
commit: 4bc05954d0076655cfaf6f0135585bdc20cd6b11 mm/damon: implement a debugfs-based user space interface
date:   2 days ago
:::::: branch date: 12 hours ago
:::::: commit date: 2 days ago
config: i386-randconfig-m031-20210910 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

smatch warnings:
mm/damon/dbgfs.c:76 dbgfs_attrs_write() warn: passing a valid pointer to 'PTR_ERR'
mm/damon/dbgfs.c:196 dbgfs_target_ids_write() warn: passing a valid pointer to 'PTR_ERR'
mm/damon/dbgfs.c:319 dbgfs_monitor_on_write() warn: passing a valid pointer to 'PTR_ERR'

vim +/PTR_ERR +76 mm/damon/dbgfs.c

4bc05954d00766 SeongJae Park 2021-09-07   64  
4bc05954d00766 SeongJae Park 2021-09-07   65  static ssize_t dbgfs_attrs_write(struct file *file,
4bc05954d00766 SeongJae Park 2021-09-07   66  		const char __user *buf, size_t count, loff_t *ppos)
4bc05954d00766 SeongJae Park 2021-09-07   67  {
4bc05954d00766 SeongJae Park 2021-09-07   68  	struct damon_ctx *ctx = file->private_data;
4bc05954d00766 SeongJae Park 2021-09-07   69  	unsigned long s, a, r, minr, maxr;
4bc05954d00766 SeongJae Park 2021-09-07   70  	char *kbuf;
4bc05954d00766 SeongJae Park 2021-09-07   71  	ssize_t ret = count;
4bc05954d00766 SeongJae Park 2021-09-07   72  	int err;
4bc05954d00766 SeongJae Park 2021-09-07   73  
4bc05954d00766 SeongJae Park 2021-09-07   74  	kbuf = user_input_str(buf, count, ppos);
4bc05954d00766 SeongJae Park 2021-09-07   75  	if (IS_ERR(kbuf))
4bc05954d00766 SeongJae Park 2021-09-07  @76  		return PTR_ERR(kbuf);
4bc05954d00766 SeongJae Park 2021-09-07   77  
4bc05954d00766 SeongJae Park 2021-09-07   78  	if (sscanf(kbuf, "%lu %lu %lu %lu %lu",
4bc05954d00766 SeongJae Park 2021-09-07   79  				&s, &a, &r, &minr, &maxr) != 5) {
4bc05954d00766 SeongJae Park 2021-09-07   80  		ret = -EINVAL;
4bc05954d00766 SeongJae Park 2021-09-07   81  		goto out;
4bc05954d00766 SeongJae Park 2021-09-07   82  	}
4bc05954d00766 SeongJae Park 2021-09-07   83  
4bc05954d00766 SeongJae Park 2021-09-07   84  	mutex_lock(&ctx->kdamond_lock);
4bc05954d00766 SeongJae Park 2021-09-07   85  	if (ctx->kdamond) {
4bc05954d00766 SeongJae Park 2021-09-07   86  		ret = -EBUSY;
4bc05954d00766 SeongJae Park 2021-09-07   87  		goto unlock_out;
4bc05954d00766 SeongJae Park 2021-09-07   88  	}
4bc05954d00766 SeongJae Park 2021-09-07   89  
4bc05954d00766 SeongJae Park 2021-09-07   90  	err = damon_set_attrs(ctx, s, a, r, minr, maxr);
4bc05954d00766 SeongJae Park 2021-09-07   91  	if (err)
4bc05954d00766 SeongJae Park 2021-09-07   92  		ret = err;
4bc05954d00766 SeongJae Park 2021-09-07   93  unlock_out:
4bc05954d00766 SeongJae Park 2021-09-07   94  	mutex_unlock(&ctx->kdamond_lock);
4bc05954d00766 SeongJae Park 2021-09-07   95  out:
4bc05954d00766 SeongJae Park 2021-09-07   96  	kfree(kbuf);
4bc05954d00766 SeongJae Park 2021-09-07   97  	return ret;
4bc05954d00766 SeongJae Park 2021-09-07   98  }
4bc05954d00766 SeongJae Park 2021-09-07   99  
4bc05954d00766 SeongJae Park 2021-09-07  100  static inline bool targetid_is_pid(const struct damon_ctx *ctx)
4bc05954d00766 SeongJae Park 2021-09-07  101  {
4bc05954d00766 SeongJae Park 2021-09-07  102  	return ctx->primitive.target_valid == damon_va_target_valid;
4bc05954d00766 SeongJae Park 2021-09-07  103  }
4bc05954d00766 SeongJae Park 2021-09-07  104  
4bc05954d00766 SeongJae Park 2021-09-07  105  static ssize_t sprint_target_ids(struct damon_ctx *ctx, char *buf, ssize_t len)
4bc05954d00766 SeongJae Park 2021-09-07  106  {
4bc05954d00766 SeongJae Park 2021-09-07  107  	struct damon_target *t;
4bc05954d00766 SeongJae Park 2021-09-07  108  	unsigned long id;
4bc05954d00766 SeongJae Park 2021-09-07  109  	int written = 0;
4bc05954d00766 SeongJae Park 2021-09-07  110  	int rc;
4bc05954d00766 SeongJae Park 2021-09-07  111  
4bc05954d00766 SeongJae Park 2021-09-07  112  	damon_for_each_target(t, ctx) {
4bc05954d00766 SeongJae Park 2021-09-07  113  		id = t->id;
4bc05954d00766 SeongJae Park 2021-09-07  114  		if (targetid_is_pid(ctx))
4bc05954d00766 SeongJae Park 2021-09-07  115  			/* Show pid numbers to debugfs users */
4bc05954d00766 SeongJae Park 2021-09-07  116  			id = (unsigned long)pid_vnr((struct pid *)id);
4bc05954d00766 SeongJae Park 2021-09-07  117  
4bc05954d00766 SeongJae Park 2021-09-07  118  		rc = scnprintf(&buf[written], len - written, "%lu ", id);
4bc05954d00766 SeongJae Park 2021-09-07  119  		if (!rc)
4bc05954d00766 SeongJae Park 2021-09-07  120  			return -ENOMEM;
4bc05954d00766 SeongJae Park 2021-09-07  121  		written += rc;
4bc05954d00766 SeongJae Park 2021-09-07  122  	}
4bc05954d00766 SeongJae Park 2021-09-07  123  	if (written)
4bc05954d00766 SeongJae Park 2021-09-07  124  		written -= 1;
4bc05954d00766 SeongJae Park 2021-09-07  125  	written += scnprintf(&buf[written], len - written, "\n");
4bc05954d00766 SeongJae Park 2021-09-07  126  	return written;
4bc05954d00766 SeongJae Park 2021-09-07  127  }
4bc05954d00766 SeongJae Park 2021-09-07  128  
4bc05954d00766 SeongJae Park 2021-09-07  129  static ssize_t dbgfs_target_ids_read(struct file *file,
4bc05954d00766 SeongJae Park 2021-09-07  130  		char __user *buf, size_t count, loff_t *ppos)
4bc05954d00766 SeongJae Park 2021-09-07  131  {
4bc05954d00766 SeongJae Park 2021-09-07  132  	struct damon_ctx *ctx = file->private_data;
4bc05954d00766 SeongJae Park 2021-09-07  133  	ssize_t len;
4bc05954d00766 SeongJae Park 2021-09-07  134  	char ids_buf[320];
4bc05954d00766 SeongJae Park 2021-09-07  135  
4bc05954d00766 SeongJae Park 2021-09-07  136  	mutex_lock(&ctx->kdamond_lock);
4bc05954d00766 SeongJae Park 2021-09-07  137  	len = sprint_target_ids(ctx, ids_buf, 320);
4bc05954d00766 SeongJae Park 2021-09-07  138  	mutex_unlock(&ctx->kdamond_lock);
4bc05954d00766 SeongJae Park 2021-09-07  139  	if (len < 0)
4bc05954d00766 SeongJae Park 2021-09-07  140  		return len;
4bc05954d00766 SeongJae Park 2021-09-07  141  
4bc05954d00766 SeongJae Park 2021-09-07  142  	return simple_read_from_buffer(buf, count, ppos, ids_buf, len);
4bc05954d00766 SeongJae Park 2021-09-07  143  }
4bc05954d00766 SeongJae Park 2021-09-07  144  
4bc05954d00766 SeongJae Park 2021-09-07  145  /*
4bc05954d00766 SeongJae Park 2021-09-07  146   * Converts a string into an array of unsigned long integers
4bc05954d00766 SeongJae Park 2021-09-07  147   *
4bc05954d00766 SeongJae Park 2021-09-07  148   * Returns an array of unsigned long integers if the conversion success, or
4bc05954d00766 SeongJae Park 2021-09-07  149   * NULL otherwise.
4bc05954d00766 SeongJae Park 2021-09-07  150   */
4bc05954d00766 SeongJae Park 2021-09-07  151  static unsigned long *str_to_target_ids(const char *str, ssize_t len,
4bc05954d00766 SeongJae Park 2021-09-07  152  					ssize_t *nr_ids)
4bc05954d00766 SeongJae Park 2021-09-07  153  {
4bc05954d00766 SeongJae Park 2021-09-07  154  	unsigned long *ids;
4bc05954d00766 SeongJae Park 2021-09-07  155  	const int max_nr_ids = 32;
4bc05954d00766 SeongJae Park 2021-09-07  156  	unsigned long id;
4bc05954d00766 SeongJae Park 2021-09-07  157  	int pos = 0, parsed, ret;
4bc05954d00766 SeongJae Park 2021-09-07  158  
4bc05954d00766 SeongJae Park 2021-09-07  159  	*nr_ids = 0;
4bc05954d00766 SeongJae Park 2021-09-07  160  	ids = kmalloc_array(max_nr_ids, sizeof(id), GFP_KERNEL);
4bc05954d00766 SeongJae Park 2021-09-07  161  	if (!ids)
4bc05954d00766 SeongJae Park 2021-09-07  162  		return NULL;
4bc05954d00766 SeongJae Park 2021-09-07  163  	while (*nr_ids < max_nr_ids && pos < len) {
4bc05954d00766 SeongJae Park 2021-09-07  164  		ret = sscanf(&str[pos], "%lu%n", &id, &parsed);
4bc05954d00766 SeongJae Park 2021-09-07  165  		pos += parsed;
4bc05954d00766 SeongJae Park 2021-09-07  166  		if (ret != 1)
4bc05954d00766 SeongJae Park 2021-09-07  167  			break;
4bc05954d00766 SeongJae Park 2021-09-07  168  		ids[*nr_ids] = id;
4bc05954d00766 SeongJae Park 2021-09-07  169  		*nr_ids += 1;
4bc05954d00766 SeongJae Park 2021-09-07  170  	}
4bc05954d00766 SeongJae Park 2021-09-07  171  
4bc05954d00766 SeongJae Park 2021-09-07  172  	return ids;
4bc05954d00766 SeongJae Park 2021-09-07  173  }
4bc05954d00766 SeongJae Park 2021-09-07  174  
4bc05954d00766 SeongJae Park 2021-09-07  175  static void dbgfs_put_pids(unsigned long *ids, int nr_ids)
4bc05954d00766 SeongJae Park 2021-09-07  176  {
4bc05954d00766 SeongJae Park 2021-09-07  177  	int i;
4bc05954d00766 SeongJae Park 2021-09-07  178  
4bc05954d00766 SeongJae Park 2021-09-07  179  	for (i = 0; i < nr_ids; i++)
4bc05954d00766 SeongJae Park 2021-09-07  180  		put_pid((struct pid *)ids[i]);
4bc05954d00766 SeongJae Park 2021-09-07  181  }
4bc05954d00766 SeongJae Park 2021-09-07  182  
4bc05954d00766 SeongJae Park 2021-09-07  183  static ssize_t dbgfs_target_ids_write(struct file *file,
4bc05954d00766 SeongJae Park 2021-09-07  184  		const char __user *buf, size_t count, loff_t *ppos)
4bc05954d00766 SeongJae Park 2021-09-07  185  {
4bc05954d00766 SeongJae Park 2021-09-07  186  	struct damon_ctx *ctx = file->private_data;
4bc05954d00766 SeongJae Park 2021-09-07  187  	char *kbuf, *nrs;
4bc05954d00766 SeongJae Park 2021-09-07  188  	unsigned long *targets;
4bc05954d00766 SeongJae Park 2021-09-07  189  	ssize_t nr_targets;
4bc05954d00766 SeongJae Park 2021-09-07  190  	ssize_t ret = count;
4bc05954d00766 SeongJae Park 2021-09-07  191  	int i;
4bc05954d00766 SeongJae Park 2021-09-07  192  	int err;
4bc05954d00766 SeongJae Park 2021-09-07  193  
4bc05954d00766 SeongJae Park 2021-09-07  194  	kbuf = user_input_str(buf, count, ppos);
4bc05954d00766 SeongJae Park 2021-09-07  195  	if (IS_ERR(kbuf))
4bc05954d00766 SeongJae Park 2021-09-07 @196  		return PTR_ERR(kbuf);
4bc05954d00766 SeongJae Park 2021-09-07  197  
4bc05954d00766 SeongJae Park 2021-09-07  198  	nrs = kbuf;
4bc05954d00766 SeongJae Park 2021-09-07  199  
4bc05954d00766 SeongJae Park 2021-09-07  200  	targets = str_to_target_ids(nrs, ret, &nr_targets);
4bc05954d00766 SeongJae Park 2021-09-07  201  	if (!targets) {
4bc05954d00766 SeongJae Park 2021-09-07  202  		ret = -ENOMEM;
4bc05954d00766 SeongJae Park 2021-09-07  203  		goto out;
4bc05954d00766 SeongJae Park 2021-09-07  204  	}
4bc05954d00766 SeongJae Park 2021-09-07  205  
4bc05954d00766 SeongJae Park 2021-09-07  206  	if (targetid_is_pid(ctx)) {
4bc05954d00766 SeongJae Park 2021-09-07  207  		for (i = 0; i < nr_targets; i++) {
4bc05954d00766 SeongJae Park 2021-09-07  208  			targets[i] = (unsigned long)find_get_pid(
4bc05954d00766 SeongJae Park 2021-09-07  209  					(int)targets[i]);
4bc05954d00766 SeongJae Park 2021-09-07  210  			if (!targets[i]) {
4bc05954d00766 SeongJae Park 2021-09-07  211  				dbgfs_put_pids(targets, i);
4bc05954d00766 SeongJae Park 2021-09-07  212  				ret = -EINVAL;
4bc05954d00766 SeongJae Park 2021-09-07  213  				goto free_targets_out;
4bc05954d00766 SeongJae Park 2021-09-07  214  			}
4bc05954d00766 SeongJae Park 2021-09-07  215  		}
4bc05954d00766 SeongJae Park 2021-09-07  216  	}
4bc05954d00766 SeongJae Park 2021-09-07  217  
4bc05954d00766 SeongJae Park 2021-09-07  218  	mutex_lock(&ctx->kdamond_lock);
4bc05954d00766 SeongJae Park 2021-09-07  219  	if (ctx->kdamond) {
4bc05954d00766 SeongJae Park 2021-09-07  220  		if (targetid_is_pid(ctx))
4bc05954d00766 SeongJae Park 2021-09-07  221  			dbgfs_put_pids(targets, nr_targets);
4bc05954d00766 SeongJae Park 2021-09-07  222  		ret = -EBUSY;
4bc05954d00766 SeongJae Park 2021-09-07  223  		goto unlock_out;
4bc05954d00766 SeongJae Park 2021-09-07  224  	}
4bc05954d00766 SeongJae Park 2021-09-07  225  
4bc05954d00766 SeongJae Park 2021-09-07  226  	err = damon_set_targets(ctx, targets, nr_targets);
4bc05954d00766 SeongJae Park 2021-09-07  227  	if (err) {
4bc05954d00766 SeongJae Park 2021-09-07  228  		if (targetid_is_pid(ctx))
4bc05954d00766 SeongJae Park 2021-09-07  229  			dbgfs_put_pids(targets, nr_targets);
4bc05954d00766 SeongJae Park 2021-09-07  230  		ret = err;
4bc05954d00766 SeongJae Park 2021-09-07  231  	}
4bc05954d00766 SeongJae Park 2021-09-07  232  
4bc05954d00766 SeongJae Park 2021-09-07  233  unlock_out:
4bc05954d00766 SeongJae Park 2021-09-07  234  	mutex_unlock(&ctx->kdamond_lock);
4bc05954d00766 SeongJae Park 2021-09-07  235  free_targets_out:
4bc05954d00766 SeongJae Park 2021-09-07  236  	kfree(targets);
4bc05954d00766 SeongJae Park 2021-09-07  237  out:
4bc05954d00766 SeongJae Park 2021-09-07  238  	kfree(kbuf);
4bc05954d00766 SeongJae Park 2021-09-07  239  	return ret;
4bc05954d00766 SeongJae Park 2021-09-07  240  }
4bc05954d00766 SeongJae Park 2021-09-07  241  

---
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: 34146 bytes --]

             reply	other threads:[~2021-09-10 11:07 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-10 11:07 kernel test robot [this message]
  -- strict thread matches above, loose matches on Subject: below --
2021-11-24  9:03 mm/damon/dbgfs.c:76 dbgfs_attrs_write() warn: passing a valid pointer to 'PTR_ERR' kernel test robot
2021-12-05  0:50 kernel test robot
2022-03-10 17:46 kernel test robot
2022-08-21  5:18 kernel test robot

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=202109101935.eMeXpFdc-lkp@intel.com \
    --to=lkp@intel.com \
    --cc=kbuild@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: link
Be 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.