summaryrefslogtreecommitdiff
path: root/drivers/base
diff options
context:
space:
mode:
authorDuoming Zhou <duoming@zju.edu.cn>2022-06-07 06:26:25 +0300
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2022-06-21 22:42:50 +0300
commit77515ebaf01920e2db49e04672ef669a7c2907f2 (patch)
tree2143168823d91232da4576a38f112a0cca51aefe /drivers/base
parentc21b0837983d3b00c4f73927dae8441bf478087f (diff)
downloadlinux-77515ebaf01920e2db49e04672ef669a7c2907f2.tar.xz
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>
Diffstat (limited to 'drivers/base')
-rw-r--r--drivers/base/devcoredump.c16
1 files changed, 6 insertions, 10 deletions
diff --git a/drivers/base/devcoredump.c b/drivers/base/devcoredump.c
index f4d794d6bb85..8535f0bd5dfb 100644
--- a/drivers/base/devcoredump.c
+++ b/drivers/base/devcoredump.c
@@ -173,15 +173,13 @@ static void devcd_freev(void *data)
* @dev: the struct device for the crashed device
* @data: vmalloc data containing the device coredump
* @datalen: length of the data
- * @gfp: allocation flags
*
* This function takes ownership of the vmalloc'ed data and will free
* it when it is no longer used. See dev_coredumpm() for more information.
*/
-void dev_coredumpv(struct device *dev, void *data, size_t datalen,
- gfp_t gfp)
+void dev_coredumpv(struct device *dev, void *data, size_t datalen)
{
- dev_coredumpm(dev, NULL, data, datalen, gfp, devcd_readv, devcd_freev);
+ dev_coredumpm(dev, NULL, data, datalen, devcd_readv, devcd_freev);
}
EXPORT_SYMBOL_GPL(dev_coredumpv);
@@ -236,7 +234,6 @@ static ssize_t devcd_read_from_sgtable(char *buffer, loff_t offset,
* @owner: the module that contains the read/free functions, use %THIS_MODULE
* @data: data cookie for the @read/@free functions
* @datalen: length of the data
- * @gfp: allocation flags
* @read: function to read from the given buffer
* @free: function to free the given buffer
*
@@ -246,7 +243,7 @@ static ssize_t devcd_read_from_sgtable(char *buffer, loff_t offset,
* function will be called to free the data.
*/
void dev_coredumpm(struct device *dev, struct module *owner,
- void *data, size_t datalen, gfp_t gfp,
+ void *data, size_t datalen,
ssize_t (*read)(char *buffer, loff_t offset, size_t count,
void *data, size_t datalen),
void (*free)(void *data))
@@ -268,7 +265,7 @@ void dev_coredumpm(struct device *dev, struct module *owner,
if (!try_module_get(owner))
goto free;
- devcd = kzalloc(sizeof(*devcd), gfp);
+ devcd = kzalloc(sizeof(*devcd), GFP_KERNEL);
if (!devcd)
goto put_module;
@@ -318,7 +315,6 @@ EXPORT_SYMBOL_GPL(dev_coredumpm);
* @dev: the struct device for the crashed device
* @table: the dump data
* @datalen: length of the data
- * @gfp: allocation flags
*
* Creates a new device coredump for the given device. If a previous one hasn't
* been read yet, the new coredump is discarded. The data lifetime is determined
@@ -326,9 +322,9 @@ EXPORT_SYMBOL_GPL(dev_coredumpm);
* it will free the data.
*/
void dev_coredumpsg(struct device *dev, struct scatterlist *table,
- size_t datalen, gfp_t gfp)
+ size_t datalen)
{
- dev_coredumpm(dev, NULL, table, datalen, gfp, devcd_read_from_sgtable,
+ dev_coredumpm(dev, NULL, table, datalen, devcd_read_from_sgtable,
devcd_free_sgtable);
}
EXPORT_SYMBOL_GPL(dev_coredumpsg);