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 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 10 #include 11 #include 12 #include 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