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 <[email protected]>

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/[email protected]

Attachment: .config.gz
Description: application/gzip

Reply via email to