All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] devres: Fix page faults when tracing devres from unloaded modules
@ 2024-09-27 14:28 Keita Morisaki
  2024-09-27 16:12 ` Andy Shevchenko
  0 siblings, 1 reply; 2+ messages in thread
From: Keita Morisaki @ 2024-09-27 14:28 UTC (permalink / raw)
  To: gregkh, rafael, linux-kernel; +Cc: andriy.shevchenko, Keita Morisaki

The devres ftrace event logs the name of the devres node, which is often a
function name (e.g., "devm_work_drop") stringified by macros like
devm_add_action. Currently, ftrace stores this name as a string literal
address, which can become invalid when the module containing the string is
unloaded. This results in page faults when ftrace tries to access the name.

This behavior is problematic because the devres ftrace event is designed to
trace resource management throughout a device driver's lifecycle, including
during module unload. The event should be available even after the module
is unloaded to properly diagnose resource issues.

Fix the issue by copying the devres node name into the ftrace ring buffer
using __assign_str(), instead of storing just the address. This ensures
that ftrace can always access the name, even if the module is unloaded.

This change increases the memory usage for each of the ftrace entry by
12-16 bytes assuming the average devres node name is 20 bytes long,
depending on the size of const char *.

Note that this change does not affect anything unless all of following
conditions are met.
- CONFIG_DEBUG_DEVRES is enabled
- ftrace tracing is enabled
- The devres event is enabled in ftrace tracing

Fixes: 09705dcb63d2 ("devres: Enable trace events")
Signed-off-by: Keita Morisaki <keyz@google.com>
---
Changes since v1:
- Rephrase part of the commit message
- Add Fixes tag
- Remove a newline in the patch
---
 drivers/base/trace.h | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/base/trace.h b/drivers/base/trace.h
index e52b6eae060d..3b83b13a57ff 100644
--- a/drivers/base/trace.h
+++ b/drivers/base/trace.h
@@ -24,18 +24,18 @@ DECLARE_EVENT_CLASS(devres,
 		__field(struct device *, dev)
 		__field(const char *, op)
 		__field(void *, node)
-		__field(const char *, name)
+		__string(name, name)
 		__field(size_t, size)
 	),
 	TP_fast_assign(
 		__assign_str(devname);
 		__entry->op = op;
 		__entry->node = node;
-		__entry->name = name;
+		__assign_str(name);
 		__entry->size = size;
 	),
 	TP_printk("%s %3s %p %s (%zu bytes)", __get_str(devname),
-		  __entry->op, __entry->node, __entry->name, __entry->size)
+		  __entry->op, __entry->node, __get_str(name), __entry->size)
 );

 DEFINE_EVENT(devres, devres_log,

base-commit: 075dbe9f6e3c21596c5245826a4ee1f1c1676eb8
--
2.46.1.824.gd892dcdcdd-goog

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH v2] devres: Fix page faults when tracing devres from unloaded modules
  2024-09-27 14:28 [PATCH v2] devres: Fix page faults when tracing devres from unloaded modules Keita Morisaki
@ 2024-09-27 16:12 ` Andy Shevchenko
  0 siblings, 0 replies; 2+ messages in thread
From: Andy Shevchenko @ 2024-09-27 16:12 UTC (permalink / raw)
  To: Keita Morisaki; +Cc: gregkh, rafael, linux-kernel

On Fri, Sep 27, 2024 at 10:28:07PM +0800, Keita Morisaki wrote:
> The devres ftrace event logs the name of the devres node, which is often a
> function name (e.g., "devm_work_drop") stringified by macros like
> devm_add_action. Currently, ftrace stores this name as a string literal
> address, which can become invalid when the module containing the string is
> unloaded. This results in page faults when ftrace tries to access the name.
> 
> This behavior is problematic because the devres ftrace event is designed to
> trace resource management throughout a device driver's lifecycle, including
> during module unload. The event should be available even after the module
> is unloaded to properly diagnose resource issues.
> 
> Fix the issue by copying the devres node name into the ftrace ring buffer
> using __assign_str(), instead of storing just the address. This ensures
> that ftrace can always access the name, even if the module is unloaded.
> 
> This change increases the memory usage for each of the ftrace entry by
> 12-16 bytes assuming the average devres node name is 20 bytes long,
> depending on the size of const char *.
> 
> Note that this change does not affect anything unless all of following
> conditions are met.
> - CONFIG_DEBUG_DEVRES is enabled
> - ftrace tracing is enabled
> - The devres event is enabled in ftrace tracing

LGTM now,
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
thanks!

-- 
With Best Regards,
Andy Shevchenko



^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2024-09-27 16:12 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-09-27 14:28 [PATCH v2] devres: Fix page faults when tracing devres from unloaded modules Keita Morisaki
2024-09-27 16:12 ` Andy Shevchenko

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.