All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: Rishabh Bhatnagar <rishabhb@codeaurora.org>,
	linux-remoteproc@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: kbuild-all@lists.01.org, bjorn.andersson@linaro.org,
	mathieu.poirier@linaro.org, tsoni@codeaurora.org,
	psodagud@codeaurora.org, sidgup@codeaurora.org,
	Rishabh Bhatnagar <rishabhb@codeaurora.org>
Subject: Re: [PATCH v5 2/3] remoteproc: Add inline coredump functionality
Date: Wed, 24 Jun 2020 14:26:09 +0800	[thread overview]
Message-ID: <202006241427.w0wMOEr7%lkp@intel.com> (raw)
In-Reply-To: <1592961854-634-3-git-send-email-rishabhb@codeaurora.org>

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

Hi Rishabh,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on linux/master]
[also build test WARNING on linus/master v5.8-rc2 next-20200623]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use  as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Rishabh-Bhatnagar/Extend-coredump-functionality/20200624-092759
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 5e857ce6eae7ca21b2055cca4885545e29228fe2
config: arc-allyesconfig (attached as .config)
compiler: arc-elf-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=arc 

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

All warnings (new ones prefixed by >>):

   In file included from include/linux/device.h:15,
                    from include/linux/devcoredump.h:8,
                    from drivers/remoteproc/remoteproc_coredump.c:9:
   drivers/remoteproc/remoteproc_coredump.c: In function 'rproc_copy_segment':
>> drivers/remoteproc/remoteproc_coredump.c:163:5: warning: format '%zu' expects argument of type 'size_t', but argument 3 has type 'dma_addr_t' {aka 'long long unsigned int'} [-Wformat=]
     163 |     "invalid copy request (%zu, %zu)\n",
         |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/dev_printk.h:19:22: note: in definition of macro 'dev_fmt'
      19 | #define dev_fmt(fmt) fmt
         |                      ^~~
>> drivers/remoteproc/remoteproc_coredump.c:162:4: note: in expansion of macro 'dev_err'
     162 |    dev_err(&rproc->dev,
         |    ^~~~~~~
   drivers/remoteproc/remoteproc_coredump.c:163:30: note: format string is defined here
     163 |     "invalid copy request (%zu, %zu)\n",
         |                            ~~^
         |                              |
         |                              unsigned int
         |                            %llu
   drivers/remoteproc/remoteproc_coredump.c: In function 'rproc_coredump_read':
>> drivers/remoteproc/remoteproc_coredump.c:186:15: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
     186 |   if (copy_sz < 0)
         |               ^

vim +163 drivers/remoteproc/remoteproc_coredump.c

   > 9	#include <linux/devcoredump.h>
    10	#include <linux/device.h>
    11	#include <linux/kernel.h>
    12	#include <linux/remoteproc.h>
    13	#include "remoteproc_internal.h"
    14	#include "remoteproc_elf_helpers.h"
    15	
    16	struct rproc_coredump_state {
    17		struct rproc *rproc;
    18		void *header;
    19		struct completion dump_done;
    20	};
    21	
    22	/**
    23	 * rproc_coredump_cleanup() - clean up dump_segments list
    24	 * @rproc: the remote processor handle
    25	 */
    26	void rproc_coredump_cleanup(struct rproc *rproc)
    27	{
    28		struct rproc_dump_segment *entry, *tmp;
    29	
    30		list_for_each_entry_safe(entry, tmp, &rproc->dump_segments, node) {
    31			list_del(&entry->node);
    32			kfree(entry);
    33		}
    34	}
    35	
    36	/**
    37	 * rproc_coredump_add_segment() - add segment of device memory to coredump
    38	 * @rproc:	handle of a remote processor
    39	 * @da:		device address
    40	 * @size:	size of segment
    41	 *
    42	 * Add device memory to the list of segments to be included in a coredump for
    43	 * the remoteproc.
    44	 *
    45	 * Return: 0 on success, negative errno on error.
    46	 */
    47	int rproc_coredump_add_segment(struct rproc *rproc, dma_addr_t da, size_t size)
    48	{
    49		struct rproc_dump_segment *segment;
    50	
    51		segment = kzalloc(sizeof(*segment), GFP_KERNEL);
    52		if (!segment)
    53			return -ENOMEM;
    54	
    55		segment->da = da;
    56		segment->size = size;
    57	
    58		list_add_tail(&segment->node, &rproc->dump_segments);
    59	
    60		return 0;
    61	}
    62	EXPORT_SYMBOL(rproc_coredump_add_segment);
    63	
    64	/**
    65	 * rproc_coredump_add_custom_segment() - add custom coredump segment
    66	 * @rproc:	handle of a remote processor
    67	 * @da:		device address
    68	 * @size:	size of segment
    69	 * @dumpfn:	custom dump function called for each segment during coredump
    70	 * @priv:	private data
    71	 *
    72	 * Add device memory to the list of segments to be included in the coredump
    73	 * and associate the segment with the given custom dump function and private
    74	 * data.
    75	 *
    76	 * Return: 0 on success, negative errno on error.
    77	 */
    78	int rproc_coredump_add_custom_segment(struct rproc *rproc,
    79					      dma_addr_t da, size_t size,
    80					      void (*dumpfn)(struct rproc *rproc,
    81							     struct rproc_dump_segment *segment,
    82							     void *dest, size_t offset,
    83							     size_t size),
    84					      void *priv)
    85	{
    86		struct rproc_dump_segment *segment;
    87	
    88		segment = kzalloc(sizeof(*segment), GFP_KERNEL);
    89		if (!segment)
    90			return -ENOMEM;
    91	
    92		segment->da = da;
    93		segment->size = size;
    94		segment->priv = priv;
    95		segment->dump = dumpfn;
    96	
    97		list_add_tail(&segment->node, &rproc->dump_segments);
    98	
    99		return 0;
   100	}
   101	EXPORT_SYMBOL(rproc_coredump_add_custom_segment);
   102	
   103	/**
   104	 * rproc_coredump_set_elf_info() - set coredump elf information
   105	 * @rproc:	handle of a remote processor
   106	 * @class:	elf class for coredump elf file
   107	 * @machine:	elf machine for coredump elf file
   108	 *
   109	 * Set elf information which will be used for coredump elf file.
   110	 *
   111	 * Return: 0 on success, negative errno on error.
   112	 */
   113	int rproc_coredump_set_elf_info(struct rproc *rproc, u8 class, u16 machine)
   114	{
   115		if (class != ELFCLASS64 && class != ELFCLASS32)
   116			return -EINVAL;
   117	
   118		rproc->elf_class = class;
   119		rproc->elf_machine = machine;
   120	
   121		return 0;
   122	}
   123	EXPORT_SYMBOL(rproc_coredump_set_elf_info);
   124	
   125	static void rproc_coredump_free(void *data)
   126	{
   127		struct rproc_coredump_state *dump_state = data;
   128	
   129		complete(&dump_state->dump_done);
   130		vfree(dump_state->header);
   131	}
   132	
   133	static void *rproc_coredump_find_segment(loff_t user_offset,
   134						 struct list_head *segments,
   135						 size_t *data_left)
   136	{
   137		struct rproc_dump_segment *segment;
   138	
   139		list_for_each_entry(segment, segments, node) {
   140			if (user_offset < segment->size) {
   141				*data_left = segment->size - user_offset;
   142				return segment;
   143			}
   144			user_offset -= segment->size;
   145		}
   146	
   147		*data_left = 0;
   148		return NULL;
   149	}
   150	
   151	static void rproc_copy_segment(struct rproc *rproc, void *dest,
   152				       struct rproc_dump_segment *segment,
   153				       size_t offset, size_t size)
   154	{
   155		void *ptr;
   156	
   157		if (segment->dump) {
   158			segment->dump(rproc, segment, dest, offset, size);
   159		} else {
   160			ptr = rproc_da_to_va(rproc, segment->da + offset, size);
   161			if (!ptr) {
 > 162				dev_err(&rproc->dev,
 > 163					"invalid copy request (%zu, %zu)\n",
   164					segment->da + offset, size);
   165				memset(dest, 0xff, size);
   166			} else {
   167				memcpy(dest, ptr, size);
   168			}
   169		}
   170	}
   171	
   172	static ssize_t rproc_coredump_read(char *buffer, loff_t offset, size_t count,
   173					   void *data, size_t header_sz)
   174	{
   175		size_t seg_data;
   176		size_t copy_sz, bytes_left = count;
   177		struct rproc_dump_segment *seg;
   178		struct rproc_coredump_state *dump_state = data;
   179		struct rproc *rproc = dump_state->rproc;
   180		void *elfcore = dump_state->header;
   181	
   182		/* Copy the vmalloc'ed header first. */
   183		if (offset < header_sz) {
   184			copy_sz = memory_read_from_buffer(buffer, count, &offset,
   185							  elfcore, header_sz);
 > 186			if (copy_sz < 0)
   187				return -EINVAL;
   188	
   189			return copy_sz;
   190		}
   191	
   192		/*
   193		 * Find out the segment memory chunk to be copied based on offset.
   194		 * Keep copying data until count bytes are read.
   195		 */
   196		while (bytes_left) {
   197			seg = rproc_coredump_find_segment(offset - header_sz,
   198							  &rproc->dump_segments,
   199							  &seg_data);
   200			/* EOF check */
   201			if (!seg) {
   202				dev_info(&rproc->dev, "Ramdump done, %lld bytes read",
   203					 offset);
   204				break;
   205			}
   206	
   207			copy_sz = min_t(size_t, bytes_left, seg_data);
   208	
   209			rproc_copy_segment(rproc, buffer, seg, seg->size - seg_data,
   210					   copy_sz);
   211	
   212			offset += copy_sz;
   213			buffer += copy_sz;
   214			bytes_left -= copy_sz;
   215		}
   216	
   217		return count - bytes_left;
   218	}
   219	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 64629 bytes --]

WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com>
To: kbuild-all@lists.01.org
Subject: Re: [PATCH v5 2/3] remoteproc: Add inline coredump functionality
Date: Wed, 24 Jun 2020 14:26:09 +0800	[thread overview]
Message-ID: <202006241427.w0wMOEr7%lkp@intel.com> (raw)
In-Reply-To: <1592961854-634-3-git-send-email-rishabhb@codeaurora.org>

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

Hi Rishabh,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on linux/master]
[also build test WARNING on linus/master v5.8-rc2 next-20200623]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use  as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Rishabh-Bhatnagar/Extend-coredump-functionality/20200624-092759
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 5e857ce6eae7ca21b2055cca4885545e29228fe2
config: arc-allyesconfig (attached as .config)
compiler: arc-elf-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=arc 

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

All warnings (new ones prefixed by >>):

   In file included from include/linux/device.h:15,
                    from include/linux/devcoredump.h:8,
                    from drivers/remoteproc/remoteproc_coredump.c:9:
   drivers/remoteproc/remoteproc_coredump.c: In function 'rproc_copy_segment':
>> drivers/remoteproc/remoteproc_coredump.c:163:5: warning: format '%zu' expects argument of type 'size_t', but argument 3 has type 'dma_addr_t' {aka 'long long unsigned int'} [-Wformat=]
     163 |     "invalid copy request (%zu, %zu)\n",
         |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/dev_printk.h:19:22: note: in definition of macro 'dev_fmt'
      19 | #define dev_fmt(fmt) fmt
         |                      ^~~
>> drivers/remoteproc/remoteproc_coredump.c:162:4: note: in expansion of macro 'dev_err'
     162 |    dev_err(&rproc->dev,
         |    ^~~~~~~
   drivers/remoteproc/remoteproc_coredump.c:163:30: note: format string is defined here
     163 |     "invalid copy request (%zu, %zu)\n",
         |                            ~~^
         |                              |
         |                              unsigned int
         |                            %llu
   drivers/remoteproc/remoteproc_coredump.c: In function 'rproc_coredump_read':
>> drivers/remoteproc/remoteproc_coredump.c:186:15: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
     186 |   if (copy_sz < 0)
         |               ^

vim +163 drivers/remoteproc/remoteproc_coredump.c

   > 9	#include <linux/devcoredump.h>
    10	#include <linux/device.h>
    11	#include <linux/kernel.h>
    12	#include <linux/remoteproc.h>
    13	#include "remoteproc_internal.h"
    14	#include "remoteproc_elf_helpers.h"
    15	
    16	struct rproc_coredump_state {
    17		struct rproc *rproc;
    18		void *header;
    19		struct completion dump_done;
    20	};
    21	
    22	/**
    23	 * rproc_coredump_cleanup() - clean up dump_segments list
    24	 * @rproc: the remote processor handle
    25	 */
    26	void rproc_coredump_cleanup(struct rproc *rproc)
    27	{
    28		struct rproc_dump_segment *entry, *tmp;
    29	
    30		list_for_each_entry_safe(entry, tmp, &rproc->dump_segments, node) {
    31			list_del(&entry->node);
    32			kfree(entry);
    33		}
    34	}
    35	
    36	/**
    37	 * rproc_coredump_add_segment() - add segment of device memory to coredump
    38	 * @rproc:	handle of a remote processor
    39	 * @da:		device address
    40	 * @size:	size of segment
    41	 *
    42	 * Add device memory to the list of segments to be included in a coredump for
    43	 * the remoteproc.
    44	 *
    45	 * Return: 0 on success, negative errno on error.
    46	 */
    47	int rproc_coredump_add_segment(struct rproc *rproc, dma_addr_t da, size_t size)
    48	{
    49		struct rproc_dump_segment *segment;
    50	
    51		segment = kzalloc(sizeof(*segment), GFP_KERNEL);
    52		if (!segment)
    53			return -ENOMEM;
    54	
    55		segment->da = da;
    56		segment->size = size;
    57	
    58		list_add_tail(&segment->node, &rproc->dump_segments);
    59	
    60		return 0;
    61	}
    62	EXPORT_SYMBOL(rproc_coredump_add_segment);
    63	
    64	/**
    65	 * rproc_coredump_add_custom_segment() - add custom coredump segment
    66	 * @rproc:	handle of a remote processor
    67	 * @da:		device address
    68	 * @size:	size of segment
    69	 * @dumpfn:	custom dump function called for each segment during coredump
    70	 * @priv:	private data
    71	 *
    72	 * Add device memory to the list of segments to be included in the coredump
    73	 * and associate the segment with the given custom dump function and private
    74	 * data.
    75	 *
    76	 * Return: 0 on success, negative errno on error.
    77	 */
    78	int rproc_coredump_add_custom_segment(struct rproc *rproc,
    79					      dma_addr_t da, size_t size,
    80					      void (*dumpfn)(struct rproc *rproc,
    81							     struct rproc_dump_segment *segment,
    82							     void *dest, size_t offset,
    83							     size_t size),
    84					      void *priv)
    85	{
    86		struct rproc_dump_segment *segment;
    87	
    88		segment = kzalloc(sizeof(*segment), GFP_KERNEL);
    89		if (!segment)
    90			return -ENOMEM;
    91	
    92		segment->da = da;
    93		segment->size = size;
    94		segment->priv = priv;
    95		segment->dump = dumpfn;
    96	
    97		list_add_tail(&segment->node, &rproc->dump_segments);
    98	
    99		return 0;
   100	}
   101	EXPORT_SYMBOL(rproc_coredump_add_custom_segment);
   102	
   103	/**
   104	 * rproc_coredump_set_elf_info() - set coredump elf information
   105	 * @rproc:	handle of a remote processor
   106	 * @class:	elf class for coredump elf file
   107	 * @machine:	elf machine for coredump elf file
   108	 *
   109	 * Set elf information which will be used for coredump elf file.
   110	 *
   111	 * Return: 0 on success, negative errno on error.
   112	 */
   113	int rproc_coredump_set_elf_info(struct rproc *rproc, u8 class, u16 machine)
   114	{
   115		if (class != ELFCLASS64 && class != ELFCLASS32)
   116			return -EINVAL;
   117	
   118		rproc->elf_class = class;
   119		rproc->elf_machine = machine;
   120	
   121		return 0;
   122	}
   123	EXPORT_SYMBOL(rproc_coredump_set_elf_info);
   124	
   125	static void rproc_coredump_free(void *data)
   126	{
   127		struct rproc_coredump_state *dump_state = data;
   128	
   129		complete(&dump_state->dump_done);
   130		vfree(dump_state->header);
   131	}
   132	
   133	static void *rproc_coredump_find_segment(loff_t user_offset,
   134						 struct list_head *segments,
   135						 size_t *data_left)
   136	{
   137		struct rproc_dump_segment *segment;
   138	
   139		list_for_each_entry(segment, segments, node) {
   140			if (user_offset < segment->size) {
   141				*data_left = segment->size - user_offset;
   142				return segment;
   143			}
   144			user_offset -= segment->size;
   145		}
   146	
   147		*data_left = 0;
   148		return NULL;
   149	}
   150	
   151	static void rproc_copy_segment(struct rproc *rproc, void *dest,
   152				       struct rproc_dump_segment *segment,
   153				       size_t offset, size_t size)
   154	{
   155		void *ptr;
   156	
   157		if (segment->dump) {
   158			segment->dump(rproc, segment, dest, offset, size);
   159		} else {
   160			ptr = rproc_da_to_va(rproc, segment->da + offset, size);
   161			if (!ptr) {
 > 162				dev_err(&rproc->dev,
 > 163					"invalid copy request (%zu, %zu)\n",
   164					segment->da + offset, size);
   165				memset(dest, 0xff, size);
   166			} else {
   167				memcpy(dest, ptr, size);
   168			}
   169		}
   170	}
   171	
   172	static ssize_t rproc_coredump_read(char *buffer, loff_t offset, size_t count,
   173					   void *data, size_t header_sz)
   174	{
   175		size_t seg_data;
   176		size_t copy_sz, bytes_left = count;
   177		struct rproc_dump_segment *seg;
   178		struct rproc_coredump_state *dump_state = data;
   179		struct rproc *rproc = dump_state->rproc;
   180		void *elfcore = dump_state->header;
   181	
   182		/* Copy the vmalloc'ed header first. */
   183		if (offset < header_sz) {
   184			copy_sz = memory_read_from_buffer(buffer, count, &offset,
   185							  elfcore, header_sz);
 > 186			if (copy_sz < 0)
   187				return -EINVAL;
   188	
   189			return copy_sz;
   190		}
   191	
   192		/*
   193		 * Find out the segment memory chunk to be copied based on offset.
   194		 * Keep copying data until count bytes are read.
   195		 */
   196		while (bytes_left) {
   197			seg = rproc_coredump_find_segment(offset - header_sz,
   198							  &rproc->dump_segments,
   199							  &seg_data);
   200			/* EOF check */
   201			if (!seg) {
   202				dev_info(&rproc->dev, "Ramdump done, %lld bytes read",
   203					 offset);
   204				break;
   205			}
   206	
   207			copy_sz = min_t(size_t, bytes_left, seg_data);
   208	
   209			rproc_copy_segment(rproc, buffer, seg, seg->size - seg_data,
   210					   copy_sz);
   211	
   212			offset += copy_sz;
   213			buffer += copy_sz;
   214			bytes_left -= copy_sz;
   215		}
   216	
   217		return count - bytes_left;
   218	}
   219	

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

  reply	other threads:[~2020-06-24  6:43 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-24  1:24 [PATCH v5 0/3] Extend coredump functionality Rishabh Bhatnagar
2020-06-24  1:24 ` [PATCH v5 1/3] remoteproc: Move coredump functionality to a new file Rishabh Bhatnagar
2020-06-24  1:24 ` [PATCH v5 2/3] remoteproc: Add inline coredump functionality Rishabh Bhatnagar
2020-06-24  6:26   ` kernel test robot [this message]
2020-06-24  6:26     ` kernel test robot
2020-06-24 10:26   ` kernel test robot
2020-06-24 10:26     ` kernel test robot
2020-06-25 18:33   ` kernel test robot
2020-06-25 18:33     ` kernel test robot
2020-06-24  1:24 ` [PATCH v5 3/3] remoteproc: Add coredump debugfs entry Rishabh Bhatnagar

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=202006241427.w0wMOEr7%lkp@intel.com \
    --to=lkp@intel.com \
    --cc=bjorn.andersson@linaro.org \
    --cc=kbuild-all@lists.01.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-remoteproc@vger.kernel.org \
    --cc=mathieu.poirier@linaro.org \
    --cc=psodagud@codeaurora.org \
    --cc=rishabhb@codeaurora.org \
    --cc=sidgup@codeaurora.org \
    --cc=tsoni@codeaurora.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.