Messages in this thread Patch in this message | | | Date | Tue, 08 Jul 2008 16:28:53 -0400 | From | Masami Hiramatsu <> | Subject | [PATCH -mm] markers: avoid call_rcu_sched if old is NULL |
| |
Introduce marker_entry_free_old() and check old pointer is NULL before setting call_rcu_sched(), because marker_entry_remove/add_probe() can return NULL.
Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com> --- kernel/marker.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-)
Mathieu, I think this might be a bug. Tracepoint also has same bug...
Index: 2.6.26-rc8-mm1/kernel/marker.c =================================================================== --- 2.6.26-rc8-mm1.orig/kernel/marker.c 2008-07-07 11:42:04.000000000 -0400 +++ 2.6.26-rc8-mm1/kernel/marker.c 2008-07-07 11:42:04.000000000 -0400 @@ -201,6 +201,17 @@ static void free_old_closure(struct rcu_ entry->rcu_pending = 0; }
+static void marker_entry_free_old(struct marker_entry *entry, void *old) +{ + if (!old) + return; + entry->oldptr = old; + entry->rcu_pending = 1; + /* write rcu_pending before calling the RCU callback */ + smp_wmb(); + call_rcu_sched(&entry->rcu, free_old_closure); +} + static void debug_print_probes(struct marker_entry *entry) { int i; @@ -666,11 +677,7 @@ int marker_probe_register(const char *na mutex_lock(&markers_mutex); entry = get_marker(name); WARN_ON(!entry); - entry->oldptr = old; - entry->rcu_pending = 1; - /* write rcu_pending before calling the RCU callback */ - smp_wmb(); - call_rcu_sched(&entry->rcu, free_old_closure); + marker_entry_free_old(entry, old); end: mutex_unlock(&markers_mutex); return ret; @@ -709,11 +716,7 @@ int marker_probe_unregister(const char * entry = get_marker(name); if (!entry) goto end; - entry->oldptr = old; - entry->rcu_pending = 1; - /* write rcu_pending before calling the RCU callback */ - smp_wmb(); - call_rcu_sched(&entry->rcu, free_old_closure); + marker_entry_free_old(entry, old); remove_marker(name); /* Ignore busy error message */ ret = 0; end: @@ -787,11 +790,7 @@ int marker_probe_unregister_private_data mutex_lock(&markers_mutex); entry = get_marker_from_private_data(probe, probe_private); WARN_ON(!entry); - entry->oldptr = old; - entry->rcu_pending = 1; - /* write rcu_pending before calling the RCU callback */ - smp_wmb(); - call_rcu_sched(&entry->rcu, free_old_closure); + marker_entry_free_old(entry, old); remove_marker(entry->name); /* Ignore busy error message */ end: mutex_unlock(&markers_mutex); -- Masami Hiramatsu Software Engineer Hitachi Computer Products (America) Inc. Software Solutions Division
e-mail: mhiramat@redhat.com
| |