Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

devcoredump: remove the useless gfp_t parameter in dev_coredumpv and dev_coredumpm

The dev_coredumpv() and dev_coredumpm() could not be used in atomic
context, because they call kvasprintf_const() and kstrdup() with
GFP_KERNEL parameter. The process is shown below:

dev_coredumpv(.., gfp_t gfp)
dev_coredumpm(.., gfp_t gfp)
dev_set_name
kobject_set_name_vargs
kvasprintf_const(GFP_KERNEL, ...); //may sleep
kstrdup(s, GFP_KERNEL); //may sleep

This patch removes gfp_t parameter of dev_coredumpv() and dev_coredumpm()
and changes the gfp_t parameter of kzalloc() in dev_coredumpm() to
GFP_KERNEL in order to show they could not be used in atomic context.

Fixes: 833c95456a70 ("device coredump: add new device coredump class")
Reviewed-by: Brian Norris <briannorris@chromium.org>
Reviewed-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: Duoming Zhou <duoming@zju.edu.cn>
Link: https://lore.kernel.org/r/df72af3b1862bac7d8e793d1f3931857d3779dfd.1654569290.git.duoming@zju.edu.cn
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Duoming Zhou and committed by
Greg Kroah-Hartman
77515eba c21b0837

+40 -50
+6 -10
drivers/base/devcoredump.c
··· 173 173 * @dev: the struct device for the crashed device 174 174 * @data: vmalloc data containing the device coredump 175 175 * @datalen: length of the data 176 - * @gfp: allocation flags 177 176 * 178 177 * This function takes ownership of the vmalloc'ed data and will free 179 178 * it when it is no longer used. See dev_coredumpm() for more information. 180 179 */ 181 - void dev_coredumpv(struct device *dev, void *data, size_t datalen, 182 - gfp_t gfp) 180 + void dev_coredumpv(struct device *dev, void *data, size_t datalen) 183 181 { 184 - dev_coredumpm(dev, NULL, data, datalen, gfp, devcd_readv, devcd_freev); 182 + dev_coredumpm(dev, NULL, data, datalen, devcd_readv, devcd_freev); 185 183 } 186 184 EXPORT_SYMBOL_GPL(dev_coredumpv); 187 185 ··· 234 236 * @owner: the module that contains the read/free functions, use %THIS_MODULE 235 237 * @data: data cookie for the @read/@free functions 236 238 * @datalen: length of the data 237 - * @gfp: allocation flags 238 239 * @read: function to read from the given buffer 239 240 * @free: function to free the given buffer 240 241 * ··· 243 246 * function will be called to free the data. 244 247 */ 245 248 void dev_coredumpm(struct device *dev, struct module *owner, 246 - void *data, size_t datalen, gfp_t gfp, 249 + void *data, size_t datalen, 247 250 ssize_t (*read)(char *buffer, loff_t offset, size_t count, 248 251 void *data, size_t datalen), 249 252 void (*free)(void *data)) ··· 265 268 if (!try_module_get(owner)) 266 269 goto free; 267 270 268 - devcd = kzalloc(sizeof(*devcd), gfp); 271 + devcd = kzalloc(sizeof(*devcd), GFP_KERNEL); 269 272 if (!devcd) 270 273 goto put_module; 271 274 ··· 315 318 * @dev: the struct device for the crashed device 316 319 * @table: the dump data 317 320 * @datalen: length of the data 318 - * @gfp: allocation flags 319 321 * 320 322 * Creates a new device coredump for the given device. If a previous one hasn't 321 323 * been read yet, the new coredump is discarded. The data lifetime is determined ··· 322 326 * it will free the data. 323 327 */ 324 328 void dev_coredumpsg(struct device *dev, struct scatterlist *table, 325 - size_t datalen, gfp_t gfp) 329 + size_t datalen) 326 330 { 327 - dev_coredumpm(dev, NULL, table, datalen, gfp, devcd_read_from_sgtable, 331 + dev_coredumpm(dev, NULL, table, datalen, devcd_read_from_sgtable, 328 332 devcd_free_sgtable); 329 333 } 330 334 EXPORT_SYMBOL_GPL(dev_coredumpsg);
+1 -1
drivers/bluetooth/btmrvl_sdio.c
··· 1515 1515 /* fw_dump_data will be free in device coredump release function 1516 1516 * after 5 min 1517 1517 */ 1518 - dev_coredumpv(&card->func->dev, fw_dump_data, fw_dump_len, GFP_KERNEL); 1518 + dev_coredumpv(&card->func->dev, fw_dump_data, fw_dump_len); 1519 1519 BT_INFO("== btmrvl firmware dump to /sys/class/devcoredump end"); 1520 1520 } 1521 1521
+1 -1
drivers/bluetooth/hci_qca.c
··· 1120 1120 qca_memdump->ram_dump_size); 1121 1121 memdump_buf = qca_memdump->memdump_buf_head; 1122 1122 dev_coredumpv(&hu->serdev->dev, memdump_buf, 1123 - qca_memdump->received_dump, GFP_KERNEL); 1123 + qca_memdump->received_dump); 1124 1124 cancel_delayed_work(&qca->ctrl_memdump_timeout); 1125 1125 kfree(qca->qca_memdump); 1126 1126 qca->qca_memdump = NULL;
+1 -1
drivers/gpu/drm/etnaviv/etnaviv_dump.c
··· 225 225 226 226 etnaviv_core_dump_header(&iter, ETDUMP_BUF_END, iter.data); 227 227 228 - dev_coredumpv(gpu->dev, iter.start, iter.data - iter.start, GFP_KERNEL); 228 + dev_coredumpv(gpu->dev, iter.start, iter.data - iter.start); 229 229 }
+2 -2
drivers/gpu/drm/msm/disp/msm_disp_snapshot.c
··· 74 74 * If there is a codedump pending for the device, the dev_coredumpm() 75 75 * will also free new coredump state. 76 76 */ 77 - dev_coredumpm(disp_state->dev, THIS_MODULE, disp_state, 0, GFP_KERNEL, 78 - disp_devcoredump_read, msm_disp_state_free); 77 + dev_coredumpm(disp_state->dev, THIS_MODULE, disp_state, 0, 78 + disp_devcoredump_read, msm_disp_state_free); 79 79 } 80 80 81 81 void msm_disp_snapshot_state(struct drm_device *drm_dev)
+2 -2
drivers/gpu/drm/msm/msm_gpu.c
··· 317 317 gpu->crashstate = state; 318 318 319 319 /* FIXME: Release the crashstate if this errors out? */ 320 - dev_coredumpm(gpu->dev->dev, THIS_MODULE, gpu, 0, GFP_KERNEL, 321 - msm_gpu_devcoredump_read, msm_gpu_devcoredump_free); 320 + dev_coredumpm(gpu->dev->dev, THIS_MODULE, gpu, 0, 321 + msm_gpu_devcoredump_read, msm_gpu_devcoredump_free); 322 322 } 323 323 #else 324 324 static void msm_gpu_crashstate_capture(struct msm_gpu *gpu,
+1 -1
drivers/media/platform/qcom/venus/core.c
··· 49 49 50 50 memcpy(data, mem_va, mem_size); 51 51 memunmap(mem_va); 52 - dev_coredumpv(dev, data, mem_size, GFP_KERNEL); 52 + dev_coredumpv(dev, data, mem_size); 53 53 } 54 54 55 55 static void venus_event_notify(struct venus_core *core, u32 event)
+1 -1
drivers/net/can/spi/mcp251xfd/mcp251xfd-dump.c
··· 281 281 mcp251xfd_dump_end(priv, &iter); 282 282 283 283 dev_coredumpv(&priv->spi->dev, iter.start, 284 - iter.data - iter.start, GFP_KERNEL); 284 + iter.data - iter.start); 285 285 }
+1 -1
drivers/net/wireless/ath/ath10k/coredump.c
··· 1607 1607 return -ENODATA; 1608 1608 } 1609 1609 1610 - dev_coredumpv(ar->dev, dump, le32_to_cpu(dump->len), GFP_KERNEL); 1610 + dev_coredumpv(ar->dev, dump, le32_to_cpu(dump->len)); 1611 1611 1612 1612 return 0; 1613 1613 }
+1 -1
drivers/net/wireless/ath/wil6210/wil_crash_dump.c
··· 117 117 /* fw_dump_data will be free in device coredump release function 118 118 * after 5 min 119 119 */ 120 - dev_coredumpv(wil_to_dev(wil), fw_dump_data, fw_dump_size, GFP_KERNEL); 120 + dev_coredumpv(wil_to_dev(wil), fw_dump_data, fw_dump_size); 121 121 wil_info(wil, "fw core dumped, size %d bytes\n", fw_dump_size); 122 122 }
+1 -1
drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c
··· 37 37 return err; 38 38 } 39 39 40 - dev_coredumpv(bus->dev, dump, len + ramsize, GFP_KERNEL); 40 + dev_coredumpv(bus->dev, dump, len + ramsize); 41 41 42 42 return 0; 43 43 }
+2 -4
drivers/net/wireless/intel/iwlwifi/fw/dbg.c
··· 2601 2601 fw_error_dump.trans_ptr->data, 2602 2602 fw_error_dump.trans_ptr->len, 2603 2603 fw_error_dump.fwrt_len); 2604 - dev_coredumpsg(fwrt->trans->dev, sg_dump_data, file_len, 2605 - GFP_KERNEL); 2604 + dev_coredumpsg(fwrt->trans->dev, sg_dump_data, file_len); 2606 2605 } 2607 2606 vfree(fw_error_dump.fwrt_ptr); 2608 2607 vfree(fw_error_dump.trans_ptr); ··· 2646 2647 entry->data, entry->size, offs); 2647 2648 offs += entry->size; 2648 2649 } 2649 - dev_coredumpsg(fwrt->trans->dev, sg_dump_data, file_len, 2650 - GFP_KERNEL); 2650 + dev_coredumpsg(fwrt->trans->dev, sg_dump_data, file_len); 2651 2651 } 2652 2652 iwl_dump_ini_list_free(&dump_list); 2653 2653 }
+1 -2
drivers/net/wireless/marvell/mwifiex/main.c
··· 1115 1115 */ 1116 1116 mwifiex_dbg(adapter, MSG, 1117 1117 "== mwifiex dump information to /sys/class/devcoredump start\n"); 1118 - dev_coredumpv(adapter->dev, adapter->devdump_data, adapter->devdump_len, 1119 - GFP_KERNEL); 1118 + dev_coredumpv(adapter->dev, adapter->devdump_data, adapter->devdump_len); 1120 1119 mwifiex_dbg(adapter, MSG, 1121 1120 "== mwifiex dump information to /sys/class/devcoredump end\n"); 1122 1121
+1 -2
drivers/net/wireless/mediatek/mt76/mt7615/mac.c
··· 2421 2421 2422 2422 dev_kfree_skb(skb); 2423 2423 } 2424 - dev_coredumpv(dev->mt76.dev, dump, MT76_CONNAC_COREDUMP_SZ, 2425 - GFP_KERNEL); 2424 + dev_coredumpv(dev->mt76.dev, dump, MT76_CONNAC_COREDUMP_SZ); 2426 2425 }
+1 -2
drivers/net/wireless/mediatek/mt76/mt7921/mac.c
··· 1630 1630 } 1631 1631 1632 1632 if (dump) 1633 - dev_coredumpv(dev->mt76.dev, dump, MT76_CONNAC_COREDUMP_SZ, 1634 - GFP_KERNEL); 1633 + dev_coredumpv(dev->mt76.dev, dump, MT76_CONNAC_COREDUMP_SZ); 1635 1634 1636 1635 mt7921_reset(&dev->mt76); 1637 1636 }
+1 -1
drivers/net/wireless/realtek/rtw88/main.c
··· 414 414 * framework. Note that a new dump will be discarded if a previous one 415 415 * hasn't been released yet. 416 416 */ 417 - dev_coredumpv(rtwdev->dev, desc->data, desc->size, GFP_KERNEL); 417 + dev_coredumpv(rtwdev->dev, desc->data, desc->size); 418 418 } 419 419 420 420 static void rtw_fwcd_free(struct rtw_dev *rtwdev, bool free_self)
+1 -1
drivers/net/wireless/realtek/rtw89/ser.c
··· 127 127 * will be discarded if a previous one hasn't been released by 128 128 * framework yet. 129 129 */ 130 - dev_coredumpv(rtwdev->dev, buf, sizeof(*buf), GFP_KERNEL); 130 + dev_coredumpv(rtwdev->dev, buf, sizeof(*buf)); 131 131 } 132 132 133 133 static void rtw89_ser_cd_free(struct rtw89_dev *rtwdev,
+1 -1
drivers/remoteproc/qcom_q6v5_mss.c
··· 597 597 data = vmalloc(MBA_LOG_SIZE); 598 598 if (data) { 599 599 memcpy(data, mba_region, MBA_LOG_SIZE); 600 - dev_coredumpv(&rproc->dev, data, MBA_LOG_SIZE, GFP_KERNEL); 600 + dev_coredumpv(&rproc->dev, data, MBA_LOG_SIZE); 601 601 } 602 602 memunmap(mba_region); 603 603 }
+4 -4
drivers/remoteproc/remoteproc_coredump.c
··· 309 309 phdr += elf_size_of_phdr(class); 310 310 } 311 311 if (dump_conf == RPROC_COREDUMP_ENABLED) { 312 - dev_coredumpv(&rproc->dev, data, data_size, GFP_KERNEL); 312 + dev_coredumpv(&rproc->dev, data, data_size); 313 313 return; 314 314 } 315 315 ··· 318 318 dump_state.header = data; 319 319 init_completion(&dump_state.dump_done); 320 320 321 - dev_coredumpm(&rproc->dev, NULL, &dump_state, data_size, GFP_KERNEL, 321 + dev_coredumpm(&rproc->dev, NULL, &dump_state, data_size, 322 322 rproc_coredump_read, rproc_coredump_free); 323 323 324 324 /* ··· 449 449 } 450 450 451 451 if (dump_conf == RPROC_COREDUMP_ENABLED) { 452 - dev_coredumpv(&rproc->dev, data, data_size, GFP_KERNEL); 452 + dev_coredumpv(&rproc->dev, data, data_size); 453 453 return; 454 454 } 455 455 ··· 458 458 dump_state.header = data; 459 459 init_completion(&dump_state.dump_done); 460 460 461 - dev_coredumpm(&rproc->dev, NULL, &dump_state, data_size, GFP_KERNEL, 461 + dev_coredumpm(&rproc->dev, NULL, &dump_state, data_size, 462 462 rproc_coredump_read, rproc_coredump_free); 463 463 464 464 /* Wait until the dump is read and free is called. Data is freed
+1 -1
include/drm/drm_print.h
··· 162 162 * void makecoredump(...) 163 163 * { 164 164 * ... 165 - * dev_coredumpm(dev, THIS_MODULE, data, 0, GFP_KERNEL, 165 + * dev_coredumpm(dev, THIS_MODULE, data, 0, 166 166 * coredump_read, ...) 167 167 * } 168 168 *
+6 -7
include/linux/devcoredump.h
··· 52 52 53 53 54 54 #ifdef CONFIG_DEV_COREDUMP 55 - void dev_coredumpv(struct device *dev, void *data, size_t datalen, 56 - gfp_t gfp); 55 + void dev_coredumpv(struct device *dev, void *data, size_t datalen); 57 56 58 57 void dev_coredumpm(struct device *dev, struct module *owner, 59 - void *data, size_t datalen, gfp_t gfp, 58 + void *data, size_t datalen, 60 59 ssize_t (*read)(char *buffer, loff_t offset, size_t count, 61 60 void *data, size_t datalen), 62 61 void (*free)(void *data)); 63 62 64 63 void dev_coredumpsg(struct device *dev, struct scatterlist *table, 65 - size_t datalen, gfp_t gfp); 64 + size_t datalen); 66 65 #else 67 66 static inline void dev_coredumpv(struct device *dev, void *data, 68 - size_t datalen, gfp_t gfp) 67 + size_t datalen) 69 68 { 70 69 vfree(data); 71 70 } 72 71 73 72 static inline void 74 73 dev_coredumpm(struct device *dev, struct module *owner, 75 - void *data, size_t datalen, gfp_t gfp, 74 + void *data, size_t datalen, 76 75 ssize_t (*read)(char *buffer, loff_t offset, size_t count, 77 76 void *data, size_t datalen), 78 77 void (*free)(void *data)) ··· 80 81 } 81 82 82 83 static inline void dev_coredumpsg(struct device *dev, struct scatterlist *table, 83 - size_t datalen, gfp_t gfp) 84 + size_t datalen) 84 85 { 85 86 _devcd_free_sgtable(table); 86 87 }
+1 -1
sound/soc/intel/avs/apl.c
··· 164 164 } while (offset < msg->ext.coredump.stack_dump_size); 165 165 166 166 exit: 167 - dev_coredumpv(adev->dev, dump, dump_size, GFP_KERNEL); 167 + dev_coredumpv(adev->dev, dump, dump_size); 168 168 169 169 return 0; 170 170 }
+1 -1
sound/soc/intel/avs/skl.c
··· 88 88 return -ENOMEM; 89 89 90 90 memcpy_fromio(dump, avs_sram_addr(adev, AVS_FW_REGS_WINDOW), AVS_FW_REGS_SIZE); 91 - dev_coredumpv(adev->dev, dump, AVS_FW_REGS_SIZE, GFP_KERNEL); 91 + dev_coredumpv(adev->dev, dump, AVS_FW_REGS_SIZE); 92 92 93 93 return 0; 94 94 }
+1 -1
sound/soc/intel/catpt/dsp.c
··· 539 539 pos += CATPT_DMA_REGS_SIZE; 540 540 } 541 541 542 - dev_coredumpv(cdev->dev, dump, dump_size, GFP_KERNEL); 542 + dev_coredumpv(cdev->dev, dump, dump_size); 543 543 544 544 return 0; 545 545 }