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: Add dev_coredumpm_timeout()

Add function to set a custom coredump timeout.

For Xe driver usage, current 5 minutes timeout may be too short for
users to search and understand what needs to be done to capture
coredump to report bugs.

We have plans to automate(distribute a udev script) it but at the end
will be up to distros and users to pack it so having a option to
increase the timeout is a safer option.

v2:
- replace dev_coredump_timeout_set() by dev_coredumpm_timeout() (Mukesh)

v3:
- make dev_coredumpm() static inline (Johannes)

v5:
- rename DEVCOREDUMP_TIMEOUT -> DEVCD_TIMEOUT to avoid redefinition
in include/net/bluetooth/coredump.h

v6:
- fix definition of dev_coredumpm_timeout() when CONFIG_DEV_COREDUMP
is disabled

Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Mukesh Ojha <quic_mojha@quicinc.com>
Cc: Johannes Berg <johannes@sipsolutions.net>
Cc: Jonathan Cavitt <jonathan.cavitt@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Acked-by: Johannes Berg <johannes@sipsolutions.net>
Link: https://patchwork.freedesktop.org/patch/msgid/20240611174716.72660-1-jose.souza@intel.com
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

authored by

José Roberto de Souza and committed by
Rodrigo Vivi
3b9c181b 513ea833

+54 -22
+12 -11
drivers/base/devcoredump.c
··· 18 18 /* global disable flag, for security purposes */ 19 19 static bool devcd_disabled; 20 20 21 - /* if data isn't read by userspace after 5 minutes then delete it */ 22 - #define DEVCD_TIMEOUT (HZ * 60 * 5) 23 - 24 21 struct devcd_entry { 25 22 struct device devcd_dev; 26 23 void *data; ··· 325 328 EXPORT_SYMBOL_GPL(dev_coredump_put); 326 329 327 330 /** 328 - * dev_coredumpm - create device coredump with read/free methods 331 + * dev_coredumpm_timeout - create device coredump with read/free methods with a 332 + * custom timeout. 329 333 * @dev: the struct device for the crashed device 330 334 * @owner: the module that contains the read/free functions, use %THIS_MODULE 331 335 * @data: data cookie for the @read/@free functions ··· 334 336 * @gfp: allocation flags 335 337 * @read: function to read from the given buffer 336 338 * @free: function to free the given buffer 339 + * @timeout: time in jiffies to remove coredump 337 340 * 338 341 * Creates a new device coredump for the given device. If a previous one hasn't 339 342 * been read yet, the new coredump is discarded. The data lifetime is determined 340 343 * by the device coredump framework and when it is no longer needed the @free 341 344 * function will be called to free the data. 342 345 */ 343 - void dev_coredumpm(struct device *dev, struct module *owner, 344 - void *data, size_t datalen, gfp_t gfp, 345 - ssize_t (*read)(char *buffer, loff_t offset, size_t count, 346 - void *data, size_t datalen), 347 - void (*free)(void *data)) 346 + void dev_coredumpm_timeout(struct device *dev, struct module *owner, 347 + void *data, size_t datalen, gfp_t gfp, 348 + ssize_t (*read)(char *buffer, loff_t offset, 349 + size_t count, void *data, 350 + size_t datalen), 351 + void (*free)(void *data), 352 + unsigned long timeout) 348 353 { 349 354 static atomic_t devcd_count = ATOMIC_INIT(0); 350 355 struct devcd_entry *devcd; ··· 404 403 dev_set_uevent_suppress(&devcd->devcd_dev, false); 405 404 kobject_uevent(&devcd->devcd_dev.kobj, KOBJ_ADD); 406 405 INIT_DELAYED_WORK(&devcd->del_wk, devcd_del); 407 - schedule_delayed_work(&devcd->del_wk, DEVCD_TIMEOUT); 406 + schedule_delayed_work(&devcd->del_wk, timeout); 408 407 mutex_unlock(&devcd->mutex); 409 408 return; 410 409 put_device: ··· 415 414 free: 416 415 free(data); 417 416 } 418 - EXPORT_SYMBOL_GPL(dev_coredumpm); 417 + EXPORT_SYMBOL_GPL(dev_coredumpm_timeout); 419 418 420 419 /** 421 420 * dev_coredumpsg - create device coredump that uses scatterlist as data
+42 -11
include/linux/devcoredump.h
··· 12 12 #include <linux/scatterlist.h> 13 13 #include <linux/slab.h> 14 14 15 + /* if data isn't read by userspace after 5 minutes then delete it */ 16 + #define DEVCD_TIMEOUT (HZ * 60 * 5) 17 + 15 18 /* 16 19 * _devcd_free_sgtable - free all the memory of the given scatterlist table 17 20 * (i.e. both pages and scatterlist instances) ··· 53 50 kfree(delete_iter); 54 51 } 55 52 56 - 57 53 #ifdef CONFIG_DEV_COREDUMP 58 54 void dev_coredumpv(struct device *dev, void *data, size_t datalen, 59 55 gfp_t gfp); 60 56 61 - void dev_coredumpm(struct device *dev, struct module *owner, 62 - void *data, size_t datalen, gfp_t gfp, 63 - ssize_t (*read)(char *buffer, loff_t offset, size_t count, 64 - void *data, size_t datalen), 65 - void (*free)(void *data)); 57 + void dev_coredumpm_timeout(struct device *dev, struct module *owner, 58 + void *data, size_t datalen, gfp_t gfp, 59 + ssize_t (*read)(char *buffer, loff_t offset, 60 + size_t count, void *data, 61 + size_t datalen), 62 + void (*free)(void *data), 63 + unsigned long timeout); 66 64 67 65 void dev_coredumpsg(struct device *dev, struct scatterlist *table, 68 66 size_t datalen, gfp_t gfp); ··· 77 73 } 78 74 79 75 static inline void 80 - dev_coredumpm(struct device *dev, struct module *owner, 81 - void *data, size_t datalen, gfp_t gfp, 82 - ssize_t (*read)(char *buffer, loff_t offset, size_t count, 83 - void *data, size_t datalen), 84 - void (*free)(void *data)) 76 + dev_coredumpm_timeout(struct device *dev, struct module *owner, 77 + void *data, size_t datalen, gfp_t gfp, 78 + ssize_t (*read)(char *buffer, loff_t offset, 79 + size_t count, void *data, 80 + size_t datalen), 81 + void (*free)(void *data), 82 + unsigned long timeout) 85 83 { 86 84 free(data); 87 85 } ··· 97 91 { 98 92 } 99 93 #endif /* CONFIG_DEV_COREDUMP */ 94 + 95 + /** 96 + * dev_coredumpm - create device coredump with read/free methods 97 + * @dev: the struct device for the crashed device 98 + * @owner: the module that contains the read/free functions, use %THIS_MODULE 99 + * @data: data cookie for the @read/@free functions 100 + * @datalen: length of the data 101 + * @gfp: allocation flags 102 + * @read: function to read from the given buffer 103 + * @free: function to free the given buffer 104 + * 105 + * Creates a new device coredump for the given device. If a previous one hasn't 106 + * been read yet, the new coredump is discarded. The data lifetime is determined 107 + * by the device coredump framework and when it is no longer needed the @free 108 + * function will be called to free the data. 109 + */ 110 + static inline void dev_coredumpm(struct device *dev, struct module *owner, 111 + void *data, size_t datalen, gfp_t gfp, 112 + ssize_t (*read)(char *buffer, loff_t offset, size_t count, 113 + void *data, size_t datalen), 114 + void (*free)(void *data)) 115 + { 116 + dev_coredumpm_timeout(dev, owner, data, datalen, gfp, read, free, 117 + DEVCD_TIMEOUT); 118 + } 100 119 101 120 #endif /* __DEVCOREDUMP_H */