* [PATCH] tracepoints: prevents null probe from being added @ 2013-03-20 3:18 kpark3469 2013-03-20 17:31 ` Steven Rostedt 0 siblings, 1 reply; 10+ messages in thread From: kpark3469 @ 2013-03-20 3:18 UTC (permalink / raw) To: rostedt; +Cc: keun-o.park, linux-kernel, kpark3469 From: Sahara <keun-o.park@windriver.com> Somehow tracepoint_entry_add/remove_probe functions allow a null probe function. Especially on getting a null probe in remove function, it seems to be used to remove all probe functions in the entry. But, the code is not handled as expected. Since the tracepoint_entry maintains funcs array's last func as NULL in order to mark it as the end of the array. Also NULL func is used in for-loop to check out the end of the loop. So if there's NULL func in the entry's funcs, the for-loop will be abruptly ended in the middle of operation. Also checking out if probe is null in for-loop is not efficient. Signed-off-by: Sahara <keun-o.park@windriver.com> --- kernel/tracepoint.c | 18 ++++++++++++------ 1 files changed, 12 insertions(+), 6 deletions(-) diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c index 0c05a45..30f427e 100644 --- a/kernel/tracepoint.c +++ b/kernel/tracepoint.c @@ -112,7 +112,10 @@ tracepoint_entry_add_probe(struct tracepoint_entry *entry, int nr_probes = 0; struct tracepoint_func *old, *new; - WARN_ON(!probe); + if (unlikely(!probe)) { + WARN_ON(!probe); + return ERR_PTR(-EINVAL); + } debug_print_probes(entry); old = entry->funcs; @@ -147,15 +150,19 @@ tracepoint_entry_remove_probe(struct tracepoint_entry *entry, old = entry->funcs; + if (unlikely(!probe)) { + WARN_ON(!probe); + return ERR_PTR(-EINVAL); + } + if (!old) return ERR_PTR(-ENOENT); debug_print_probes(entry); /* (N -> M), (N > 1, M >= 0) probes */ for (nr_probes = 0; old[nr_probes].func; nr_probes++) { - if (!probe || - (old[nr_probes].func == probe && - old[nr_probes].data == data)) + if (old[nr_probes].func == probe && + old[nr_probes].data == data) nr_del++; } @@ -173,8 +180,7 @@ tracepoint_entry_remove_probe(struct tracepoint_entry *entry, if (new == NULL) return ERR_PTR(-ENOMEM); for (i = 0; old[i].func; i++) - if (probe && - (old[i].func != probe || old[i].data != data)) + if (old[i].func != probe || old[i].data != data) new[j++] = old[i]; new[nr_probes - nr_del].func = NULL; entry->refcount = nr_probes - nr_del; -- 1.7.1 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH] tracepoints: prevents null probe from being added 2013-03-20 3:18 [PATCH] tracepoints: prevents null probe from being added kpark3469 @ 2013-03-20 17:31 ` Steven Rostedt 2013-03-20 18:01 ` Mathieu Desnoyers 0 siblings, 1 reply; 10+ messages in thread From: Steven Rostedt @ 2013-03-20 17:31 UTC (permalink / raw) To: kpark3469; +Cc: keun-o.park, linux-kernel, Mathieu Desnoyers On Wed, 2013-03-20 at 12:18 +0900, kpark3469@gmail.com wrote: > From: Sahara <keun-o.park@windriver.com> > > Somehow tracepoint_entry_add/remove_probe functions allow a null probe > function. You actually hit this in practice, or is this just something that you observe from code review? > Especially on getting a null probe in remove function, it seems > to be used to remove all probe functions in the entry. Hmm, that actually sounds like a feature. > But, the code is not handled as expected. Since the tracepoint_entry > maintains funcs array's last func as NULL in order to mark it as the end > of the array. Also NULL func is used in for-loop to check out the end of > the loop. So if there's NULL func in the entry's funcs, the for-loop > will be abruptly ended in the middle of operation. > Also checking out if probe is null in for-loop is not efficient. > > Signed-off-by: Sahara <keun-o.park@windriver.com> > --- > kernel/tracepoint.c | 18 ++++++++++++------ > 1 files changed, 12 insertions(+), 6 deletions(-) > > diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c > index 0c05a45..30f427e 100644 > --- a/kernel/tracepoint.c > +++ b/kernel/tracepoint.c > @@ -112,7 +112,10 @@ tracepoint_entry_add_probe(struct tracepoint_entry *entry, > int nr_probes = 0; > struct tracepoint_func *old, *new; > > - WARN_ON(!probe); > + if (unlikely(!probe)) { > + WARN_ON(!probe); > + return ERR_PTR(-EINVAL); > + } Um, you want: if (WARN_ON(!probe)) return ERR_PTR(-EINVAL); > > debug_print_probes(entry); > old = entry->funcs; > @@ -147,15 +150,19 @@ tracepoint_entry_remove_probe(struct tracepoint_entry *entry, > > old = entry->funcs; > > + if (unlikely(!probe)) { > + WARN_ON(!probe); > + return ERR_PTR(-EINVAL); > + } Here too if it wasn't intended to allow removal of all probes from a tracepoint. > + > if (!old) > return ERR_PTR(-ENOENT); > > debug_print_probes(entry); > /* (N -> M), (N > 1, M >= 0) probes */ > for (nr_probes = 0; old[nr_probes].func; nr_probes++) { > - if (!probe || > - (old[nr_probes].func == probe && > - old[nr_probes].data == data)) > + if (old[nr_probes].func == probe && > + old[nr_probes].data == data) > nr_del++; > } > > @@ -173,8 +180,7 @@ tracepoint_entry_remove_probe(struct tracepoint_entry *entry, > if (new == NULL) > return ERR_PTR(-ENOMEM); > for (i = 0; old[i].func; i++) > - if (probe && > - (old[i].func != probe || old[i].data != data)) > + if (old[i].func != probe || old[i].data != data) This makes it look like the null probe was intentional. -- Steve > new[j++] = old[i]; > new[nr_probes - nr_del].func = NULL; > entry->refcount = nr_probes - nr_del; ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] tracepoints: prevents null probe from being added 2013-03-20 17:31 ` Steven Rostedt @ 2013-03-20 18:01 ` Mathieu Desnoyers 2013-03-20 23:01 ` Steven Rostedt 0 siblings, 1 reply; 10+ messages in thread From: Mathieu Desnoyers @ 2013-03-20 18:01 UTC (permalink / raw) To: Steven Rostedt; +Cc: kpark3469, keun-o.park, linux-kernel * Steven Rostedt (rostedt@goodmis.org) wrote: > On Wed, 2013-03-20 at 12:18 +0900, kpark3469@gmail.com wrote: > > From: Sahara <keun-o.park@windriver.com> > > > > Somehow tracepoint_entry_add/remove_probe functions allow a null probe > > function. > > You actually hit this in practice, or is this just something that you > observe from code review? > > > Especially on getting a null probe in remove function, it seems > > to be used to remove all probe functions in the entry. > > Hmm, that actually sounds like a feature. Yep. It's been a long time since I wrote this code, but the removal code seems to use NULL probe pointer to remove all probes for a given tracepoint. I'd be tempted to just validate non-NULL probe within tracepoint_entry_add_probe() and let other sites as is, just in case anyone would be using this feature. I cannot say that I have personally used this "remove all" feature much though. Thanks, Mathieu > > > But, the code is not handled as expected. Since the tracepoint_entry > > maintains funcs array's last func as NULL in order to mark it as the end > > of the array. Also NULL func is used in for-loop to check out the end of > > the loop. So if there's NULL func in the entry's funcs, the for-loop > > will be abruptly ended in the middle of operation. > > Also checking out if probe is null in for-loop is not efficient. > > > > Signed-off-by: Sahara <keun-o.park@windriver.com> > > --- > > kernel/tracepoint.c | 18 ++++++++++++------ > > 1 files changed, 12 insertions(+), 6 deletions(-) > > > > diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c > > index 0c05a45..30f427e 100644 > > --- a/kernel/tracepoint.c > > +++ b/kernel/tracepoint.c > > @@ -112,7 +112,10 @@ tracepoint_entry_add_probe(struct tracepoint_entry *entry, > > int nr_probes = 0; > > struct tracepoint_func *old, *new; > > > > - WARN_ON(!probe); > > + if (unlikely(!probe)) { > > + WARN_ON(!probe); > > + return ERR_PTR(-EINVAL); > > + } > > Um, you want: > > if (WARN_ON(!probe)) > return ERR_PTR(-EINVAL); > > > > > debug_print_probes(entry); > > old = entry->funcs; > > @@ -147,15 +150,19 @@ tracepoint_entry_remove_probe(struct tracepoint_entry *entry, > > > > old = entry->funcs; > > > > + if (unlikely(!probe)) { > > + WARN_ON(!probe); > > + return ERR_PTR(-EINVAL); > > + } > > Here too if it wasn't intended to allow removal of all probes from a > tracepoint. > > > + > > if (!old) > > return ERR_PTR(-ENOENT); > > > > debug_print_probes(entry); > > /* (N -> M), (N > 1, M >= 0) probes */ > > for (nr_probes = 0; old[nr_probes].func; nr_probes++) { > > - if (!probe || > > - (old[nr_probes].func == probe && > > - old[nr_probes].data == data)) > > + if (old[nr_probes].func == probe && > > + old[nr_probes].data == data) > > nr_del++; > > } > > > > @@ -173,8 +180,7 @@ tracepoint_entry_remove_probe(struct tracepoint_entry *entry, > > if (new == NULL) > > return ERR_PTR(-ENOMEM); > > for (i = 0; old[i].func; i++) > > - if (probe && > > - (old[i].func != probe || old[i].data != data)) > > + if (old[i].func != probe || old[i].data != data) > > This makes it look like the null probe was intentional. > > -- Steve > > > new[j++] = old[i]; > > new[nr_probes - nr_del].func = NULL; > > entry->refcount = nr_probes - nr_del; > > -- Mathieu Desnoyers EfficiOS Inc. http://www.efficios.com ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] tracepoints: prevents null probe from being added 2013-03-20 18:01 ` Mathieu Desnoyers @ 2013-03-20 23:01 ` Steven Rostedt 2013-03-21 1:39 ` Keun-O Park 0 siblings, 1 reply; 10+ messages in thread From: Steven Rostedt @ 2013-03-20 23:01 UTC (permalink / raw) To: Mathieu Desnoyers; +Cc: kpark3469, keun-o.park, linux-kernel On Wed, 2013-03-20 at 14:01 -0400, Mathieu Desnoyers wrote: > * Steven Rostedt (rostedt@goodmis.org) wrote: > > On Wed, 2013-03-20 at 12:18 +0900, kpark3469@gmail.com wrote: > > > From: Sahara <keun-o.park@windriver.com> > > > > > > Somehow tracepoint_entry_add/remove_probe functions allow a null probe > > > function. > > > > You actually hit this in practice, or is this just something that you > > observe from code review? > > > > > Especially on getting a null probe in remove function, it seems > > > to be used to remove all probe functions in the entry. > > > > Hmm, that actually sounds like a feature. > > Yep. It's been a long time since I wrote this code, but the removal code > seems to use NULL probe pointer to remove all probes for a given > tracepoint. > > I'd be tempted to just validate non-NULL probe within > tracepoint_entry_add_probe() and let other sites as is, just in case > anyone would be using this feature. > > I cannot say that I have personally used this "remove all" feature much > though. > I agree. I don't see anything wrong in leaving the null probe feature in the removal code. But updating the add code looks like a proper change. -- Steve ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] tracepoints: prevents null probe from being added 2013-03-20 23:01 ` Steven Rostedt @ 2013-03-21 1:39 ` Keun-O Park 2013-03-21 1:45 ` Keun-O Park 2013-03-21 2:45 ` Mathieu Desnoyers 0 siblings, 2 replies; 10+ messages in thread From: Keun-O Park @ 2013-03-21 1:39 UTC (permalink / raw) To: Steven Rostedt; +Cc: Mathieu Desnoyers, keun-o.park, linux-kernel On Thu, Mar 21, 2013 at 8:01 AM, Steven Rostedt <rostedt@goodmis.org> wrote: > On Wed, 2013-03-20 at 14:01 -0400, Mathieu Desnoyers wrote: >> * Steven Rostedt (rostedt@goodmis.org) wrote: >> > On Wed, 2013-03-20 at 12:18 +0900, kpark3469@gmail.com wrote: >> > > From: Sahara <keun-o.park@windriver.com> >> > > >> > > Somehow tracepoint_entry_add/remove_probe functions allow a null probe >> > > function. >> > >> > You actually hit this in practice, or is this just something that you >> > observe from code review? >> > >> > > Especially on getting a null probe in remove function, it seems >> > > to be used to remove all probe functions in the entry. >> > >> > Hmm, that actually sounds like a feature. >> >> Yep. It's been a long time since I wrote this code, but the removal code >> seems to use NULL probe pointer to remove all probes for a given >> tracepoint. >> >> I'd be tempted to just validate non-NULL probe within >> tracepoint_entry_add_probe() and let other sites as is, just in case >> anyone would be using this feature. >> >> I cannot say that I have personally used this "remove all" feature much >> though. >> > > I agree. I don't see anything wrong in leaving the null probe feature in > the removal code. But updating the add code looks like a proper change. > > -- Steve > > Hello Steve & Mathieu, If we want to leave the null probe feature enabled, I think it would be better modifying the code like the following for code efficiency. @@ -112,7 +112,8 @@ tracepoint_entry_add_probe(struct tracepoint_entry *entry, int nr_probes = 0; struct tracepoint_func *old, *new; - WARN_ON(!probe); + if (WARN_ON(!probe)) + return ERR_PTR(-EINVAL); debug_print_probes(entry); old = entry->funcs; @@ -152,14 +153,15 @@ tracepoint_entry_remove_probe(struct tracepoint_entry *ent debug_print_probes(entry); /* (N -> M), (N > 1, M >= 0) probes */ - for (nr_probes = 0; old[nr_probes].func; nr_probes++) { - if (!probe || - (old[nr_probes].func == probe && - old[nr_probes].data == data)) - nr_del++; + if (probe) { + for (nr_probes = 0; old[nr_probes].func; nr_probes++) { + if (old[nr_probes].func == probe && + old[nr_probes].data == data) + nr_del++; + } } - if (nr_probes - nr_del == 0) { + if (!probe || nr_probes - nr_del == 0) { /* N -> 0, (N > 1) */ entry->funcs = NULL; entry->refcount = 0; Because we know handing over the null probe to tracepoint_entry_add_probe is not possible, we don't have to check if the probe is null or not within for loop. If the probe is null, it's just enough to add !probe in 'if(nr_probes-nr_del==0)'. And, with additional if-clause wrapping for-loop, falling through for-loop can be prevented when probe is null. @@ -173,8 +172,7 @@ tracepoint_entry_remove_probe(struct tracepoint_entry *entry if (new == NULL) return ERR_PTR(-ENOMEM); for (i = 0; old[i].func; i++) - if (probe && - (old[i].func != probe || old[i].data != data)) + if (old[i].func != probe || old[i].data != data) new[j++] = old[i]; new[nr_probes - nr_del].func = NULL; entry->refcount = nr_probes - nr_del; We don't have to check the probe here too. We know probe is always true here. Thanks. -- Kpark ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] tracepoints: prevents null probe from being added 2013-03-21 1:39 ` Keun-O Park @ 2013-03-21 1:45 ` Keun-O Park 2013-03-21 2:45 ` Mathieu Desnoyers 1 sibling, 0 replies; 10+ messages in thread From: Keun-O Park @ 2013-03-21 1:45 UTC (permalink / raw) To: Steven Rostedt; +Cc: Mathieu Desnoyers, keun-o.park, linux-kernel On Thu, Mar 21, 2013 at 10:39 AM, Keun-O Park <kpark3469@gmail.com> wrote: > On Thu, Mar 21, 2013 at 8:01 AM, Steven Rostedt <rostedt@goodmis.org> wrote: >> On Wed, 2013-03-20 at 14:01 -0400, Mathieu Desnoyers wrote: >>> * Steven Rostedt (rostedt@goodmis.org) wrote: >>> > On Wed, 2013-03-20 at 12:18 +0900, kpark3469@gmail.com wrote: >>> > > From: Sahara <keun-o.park@windriver.com> >>> > > >>> > > Somehow tracepoint_entry_add/remove_probe functions allow a null probe >>> > > function. >>> > >>> > You actually hit this in practice, or is this just something that you >>> > observe from code review? >>> > >>> > > Especially on getting a null probe in remove function, it seems >>> > > to be used to remove all probe functions in the entry. >>> > >>> > Hmm, that actually sounds like a feature. >>> >>> Yep. It's been a long time since I wrote this code, but the removal code >>> seems to use NULL probe pointer to remove all probes for a given >>> tracepoint. >>> >>> I'd be tempted to just validate non-NULL probe within >>> tracepoint_entry_add_probe() and let other sites as is, just in case >>> anyone would be using this feature. >>> >>> I cannot say that I have personally used this "remove all" feature much >>> though. >>> >> >> I agree. I don't see anything wrong in leaving the null probe feature in >> the removal code. But updating the add code looks like a proper change. >> >> -- Steve >> >> > > Hello Steve & Mathieu, > If we want to leave the null probe feature enabled, I think it would > be better modifying the code like the following for code efficiency. > > @@ -112,7 +112,8 @@ tracepoint_entry_add_probe(struct tracepoint_entry *entry, > int nr_probes = 0; > struct tracepoint_func *old, *new; > > - WARN_ON(!probe); > + if (WARN_ON(!probe)) > + return ERR_PTR(-EINVAL); > > debug_print_probes(entry); > old = entry->funcs; > @@ -152,14 +153,15 @@ tracepoint_entry_remove_probe(struct tracepoint_entry *ent > > debug_print_probes(entry); > /* (N -> M), (N > 1, M >= 0) probes */ > - for (nr_probes = 0; old[nr_probes].func; nr_probes++) { > - if (!probe || > - (old[nr_probes].func == probe && > - old[nr_probes].data == data)) > - nr_del++; > + if (probe) { > + for (nr_probes = 0; old[nr_probes].func; nr_probes++) { > + if (old[nr_probes].func == probe && > + old[nr_probes].data == data) > + nr_del++; > + } > } > > - if (nr_probes - nr_del == 0) { > + if (!probe || nr_probes - nr_del == 0) { > /* N -> 0, (N > 1) */ > entry->funcs = NULL; > entry->refcount = 0; > > Because we know handing over the null probe to > tracepoint_entry_add_probe is not possible, > we don't have to check if the probe is null or not within for loop. If Hmm. I described this wrong. :-( For code efficiency, I replaced 'checking null probe in every iteration within for-loop' with 'checking once outside the loop'. > the probe is null, it's just enough to add !probe in > 'if(nr_probes-nr_del==0)'. And, with additional if-clause wrapping > for-loop, falling through for-loop can be prevented when probe is > null. > > @@ -173,8 +172,7 @@ tracepoint_entry_remove_probe(struct tracepoint_entry *entry > if (new == NULL) > return ERR_PTR(-ENOMEM); > for (i = 0; old[i].func; i++) > - if (probe && > - (old[i].func != probe || old[i].data != data)) > + if (old[i].func != probe || old[i].data != data) > new[j++] = old[i]; > new[nr_probes - nr_del].func = NULL; > entry->refcount = nr_probes - nr_del; > > We don't have to check the probe here too. We know probe is always true here. > Thanks. > > -- Kpark ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] tracepoints: prevents null probe from being added 2013-03-21 1:39 ` Keun-O Park 2013-03-21 1:45 ` Keun-O Park @ 2013-03-21 2:45 ` Mathieu Desnoyers 2013-03-21 3:03 ` Keun-O Park 1 sibling, 1 reply; 10+ messages in thread From: Mathieu Desnoyers @ 2013-03-21 2:45 UTC (permalink / raw) To: Keun-O Park; +Cc: Steven Rostedt, keun-o.park, linux-kernel * Keun-O Park (kpark3469@gmail.com) wrote: > On Thu, Mar 21, 2013 at 8:01 AM, Steven Rostedt <rostedt@goodmis.org> wrote: > > On Wed, 2013-03-20 at 14:01 -0400, Mathieu Desnoyers wrote: > >> * Steven Rostedt (rostedt@goodmis.org) wrote: > >> > On Wed, 2013-03-20 at 12:18 +0900, kpark3469@gmail.com wrote: > >> > > From: Sahara <keun-o.park@windriver.com> > >> > > > >> > > Somehow tracepoint_entry_add/remove_probe functions allow a null probe > >> > > function. > >> > > >> > You actually hit this in practice, or is this just something that you > >> > observe from code review? > >> > > >> > > Especially on getting a null probe in remove function, it seems > >> > > to be used to remove all probe functions in the entry. > >> > > >> > Hmm, that actually sounds like a feature. > >> > >> Yep. It's been a long time since I wrote this code, but the removal code > >> seems to use NULL probe pointer to remove all probes for a given > >> tracepoint. > >> > >> I'd be tempted to just validate non-NULL probe within > >> tracepoint_entry_add_probe() and let other sites as is, just in case > >> anyone would be using this feature. > >> > >> I cannot say that I have personally used this "remove all" feature much > >> though. > >> > > > > I agree. I don't see anything wrong in leaving the null probe feature in > > the removal code. But updating the add code looks like a proper change. > > > > -- Steve > > > > > > Hello Steve & Mathieu, > If we want to leave the null probe feature enabled, I think it would > be better modifying the code like the following for code efficiency. > > @@ -112,7 +112,8 @@ tracepoint_entry_add_probe(struct tracepoint_entry *entry, > int nr_probes = 0; > struct tracepoint_func *old, *new; > > - WARN_ON(!probe); > + if (WARN_ON(!probe)) > + return ERR_PTR(-EINVAL); > > debug_print_probes(entry); > old = entry->funcs; > @@ -152,14 +153,15 @@ tracepoint_entry_remove_probe(struct tracepoint_entry *ent > > debug_print_probes(entry); > /* (N -> M), (N > 1, M >= 0) probes */ > - for (nr_probes = 0; old[nr_probes].func; nr_probes++) { > - if (!probe || > - (old[nr_probes].func == probe && > - old[nr_probes].data == data)) > - nr_del++; > + if (probe) { > + for (nr_probes = 0; old[nr_probes].func; nr_probes++) { > + if (old[nr_probes].func == probe && > + old[nr_probes].data == data) > + nr_del++; > + } > } > > - if (nr_probes - nr_del == 0) { > + if (!probe || nr_probes - nr_del == 0) { We might want to do: if (probe) { ... } else { nr_del = nr_probes; } if (nr_probes - nr_del == 0) { ... } rather than: if (probe) { ... } if (!probe || nr_probes - nr_del == 0) { ... } Using nr_del makes the code easier to follow IMHO. Thanks, Mathieu > /* N -> 0, (N > 1) */ > entry->funcs = NULL; > entry->refcount = 0; > > Because we know handing over the null probe to > tracepoint_entry_add_probe is not possible, > we don't have to check if the probe is null or not within for loop. If > the probe is null, it's just enough to add !probe in > 'if(nr_probes-nr_del==0)'. And, with additional if-clause wrapping > for-loop, falling through for-loop can be prevented when probe is > null. > > @@ -173,8 +172,7 @@ tracepoint_entry_remove_probe(struct tracepoint_entry *entry > if (new == NULL) > return ERR_PTR(-ENOMEM); > for (i = 0; old[i].func; i++) > - if (probe && > - (old[i].func != probe || old[i].data != data)) > + if (old[i].func != probe || old[i].data != data) > new[j++] = old[i]; > new[nr_probes - nr_del].func = NULL; > entry->refcount = nr_probes - nr_del; > > We don't have to check the probe here too. We know probe is always true here. > Thanks. > > -- Kpark -- Mathieu Desnoyers EfficiOS Inc. http://www.efficios.com ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] tracepoints: prevents null probe from being added 2013-03-21 2:45 ` Mathieu Desnoyers @ 2013-03-21 3:03 ` Keun-O Park 2013-03-21 3:33 ` Mathieu Desnoyers 0 siblings, 1 reply; 10+ messages in thread From: Keun-O Park @ 2013-03-21 3:03 UTC (permalink / raw) To: Mathieu Desnoyers; +Cc: Steven Rostedt, keun-o.park, linux-kernel On Thu, Mar 21, 2013 at 11:45 AM, Mathieu Desnoyers <mathieu.desnoyers@efficios.com> wrote: > * Keun-O Park (kpark3469@gmail.com) wrote: >> On Thu, Mar 21, 2013 at 8:01 AM, Steven Rostedt <rostedt@goodmis.org> wrote: >> > On Wed, 2013-03-20 at 14:01 -0400, Mathieu Desnoyers wrote: >> >> * Steven Rostedt (rostedt@goodmis.org) wrote: >> >> > On Wed, 2013-03-20 at 12:18 +0900, kpark3469@gmail.com wrote: >> >> > > From: Sahara <keun-o.park@windriver.com> >> >> > > >> >> > > Somehow tracepoint_entry_add/remove_probe functions allow a null probe >> >> > > function. >> >> > >> >> > You actually hit this in practice, or is this just something that you >> >> > observe from code review? >> >> > >> >> > > Especially on getting a null probe in remove function, it seems >> >> > > to be used to remove all probe functions in the entry. >> >> > >> >> > Hmm, that actually sounds like a feature. >> >> >> >> Yep. It's been a long time since I wrote this code, but the removal code >> >> seems to use NULL probe pointer to remove all probes for a given >> >> tracepoint. >> >> >> >> I'd be tempted to just validate non-NULL probe within >> >> tracepoint_entry_add_probe() and let other sites as is, just in case >> >> anyone would be using this feature. >> >> >> >> I cannot say that I have personally used this "remove all" feature much >> >> though. >> >> >> > >> > I agree. I don't see anything wrong in leaving the null probe feature in >> > the removal code. But updating the add code looks like a proper change. >> > >> > -- Steve >> > >> > >> >> Hello Steve & Mathieu, >> If we want to leave the null probe feature enabled, I think it would >> be better modifying the code like the following for code efficiency. >> >> @@ -112,7 +112,8 @@ tracepoint_entry_add_probe(struct tracepoint_entry *entry, >> int nr_probes = 0; >> struct tracepoint_func *old, *new; >> >> - WARN_ON(!probe); >> + if (WARN_ON(!probe)) >> + return ERR_PTR(-EINVAL); >> >> debug_print_probes(entry); >> old = entry->funcs; >> @@ -152,14 +153,15 @@ tracepoint_entry_remove_probe(struct tracepoint_entry *ent >> >> debug_print_probes(entry); >> /* (N -> M), (N > 1, M >= 0) probes */ >> - for (nr_probes = 0; old[nr_probes].func; nr_probes++) { >> - if (!probe || >> - (old[nr_probes].func == probe && >> - old[nr_probes].data == data)) >> - nr_del++; >> + if (probe) { >> + for (nr_probes = 0; old[nr_probes].func; nr_probes++) { >> + if (old[nr_probes].func == probe && >> + old[nr_probes].data == data) >> + nr_del++; >> + } >> } >> >> - if (nr_probes - nr_del == 0) { >> + if (!probe || nr_probes - nr_del == 0) { > > We might want to do: > > if (probe) { > ... > } else { > nr_del = nr_probes; > } > > if (nr_probes - nr_del == 0) { > ... > } This code has a problem. nr_probes is initialized as zero. And, in order to get correct count of probes, we need to go through the for-loop even though probe is null. So with above code, nr_del will be zero. Anyhow, the code will fall through if-clause(nr_probes-nr_del==0). It looks odd to me. -- Kpark > > rather than: > > if (probe) { > ... > } > > if (!probe || nr_probes - nr_del == 0) { > ... > } > > Using nr_del makes the code easier to follow IMHO. > > Thanks, > > Mathieu > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] tracepoints: prevents null probe from being added 2013-03-21 3:03 ` Keun-O Park @ 2013-03-21 3:33 ` Mathieu Desnoyers 2013-03-21 4:25 ` Keun-O Park 0 siblings, 1 reply; 10+ messages in thread From: Mathieu Desnoyers @ 2013-03-21 3:33 UTC (permalink / raw) To: Keun-O Park; +Cc: Steven Rostedt, keun-o.park, linux-kernel * Keun-O Park (kpark3469@gmail.com) wrote: > On Thu, Mar 21, 2013 at 11:45 AM, Mathieu Desnoyers > <mathieu.desnoyers@efficios.com> wrote: > > * Keun-O Park (kpark3469@gmail.com) wrote: > >> On Thu, Mar 21, 2013 at 8:01 AM, Steven Rostedt <rostedt@goodmis.org> wrote: > >> > On Wed, 2013-03-20 at 14:01 -0400, Mathieu Desnoyers wrote: > >> >> * Steven Rostedt (rostedt@goodmis.org) wrote: > >> >> > On Wed, 2013-03-20 at 12:18 +0900, kpark3469@gmail.com wrote: > >> >> > > From: Sahara <keun-o.park@windriver.com> > >> >> > > > >> >> > > Somehow tracepoint_entry_add/remove_probe functions allow a null probe > >> >> > > function. > >> >> > > >> >> > You actually hit this in practice, or is this just something that you > >> >> > observe from code review? > >> >> > > >> >> > > Especially on getting a null probe in remove function, it seems > >> >> > > to be used to remove all probe functions in the entry. > >> >> > > >> >> > Hmm, that actually sounds like a feature. > >> >> > >> >> Yep. It's been a long time since I wrote this code, but the removal code > >> >> seems to use NULL probe pointer to remove all probes for a given > >> >> tracepoint. > >> >> > >> >> I'd be tempted to just validate non-NULL probe within > >> >> tracepoint_entry_add_probe() and let other sites as is, just in case > >> >> anyone would be using this feature. > >> >> > >> >> I cannot say that I have personally used this "remove all" feature much > >> >> though. > >> >> > >> > > >> > I agree. I don't see anything wrong in leaving the null probe feature in > >> > the removal code. But updating the add code looks like a proper change. > >> > > >> > -- Steve > >> > > >> > > >> > >> Hello Steve & Mathieu, > >> If we want to leave the null probe feature enabled, I think it would > >> be better modifying the code like the following for code efficiency. > >> > >> @@ -112,7 +112,8 @@ tracepoint_entry_add_probe(struct tracepoint_entry *entry, > >> int nr_probes = 0; > >> struct tracepoint_func *old, *new; > >> > >> - WARN_ON(!probe); > >> + if (WARN_ON(!probe)) > >> + return ERR_PTR(-EINVAL); > >> > >> debug_print_probes(entry); > >> old = entry->funcs; > >> @@ -152,14 +153,15 @@ tracepoint_entry_remove_probe(struct tracepoint_entry *ent > >> > >> debug_print_probes(entry); > >> /* (N -> M), (N > 1, M >= 0) probes */ > >> - for (nr_probes = 0; old[nr_probes].func; nr_probes++) { > >> - if (!probe || > >> - (old[nr_probes].func == probe && > >> - old[nr_probes].data == data)) > >> - nr_del++; > >> + if (probe) { > >> + for (nr_probes = 0; old[nr_probes].func; nr_probes++) { > >> + if (old[nr_probes].func == probe && > >> + old[nr_probes].data == data) > >> + nr_del++; > >> + } > >> } > >> > >> - if (nr_probes - nr_del == 0) { > >> + if (!probe || nr_probes - nr_del == 0) { > > > > We might want to do: > > > > if (probe) { > > ... > > } else { > > nr_del = nr_probes; > > } > > > > if (nr_probes - nr_del == 0) { > > ... > > } > > This code has a problem. > nr_probes is initialized as zero. yes, > And, in order to get correct count of probes, > we need to go through the for-loop even though probe is null. > So with above code, nr_del will be zero. Anyhow, the code will fall > through if-clause(nr_probes-nr_del==0). > It looks odd to me. Ah, I see what you mean: the nr_del = nr_probes assignment is useless, because both nr_probes and nr_del are equal to 0. So we could go for: if (probe) { for (nr_probes = 0; old[nr_probes].func; nr_probes++) { if (old[nr_probes].func == probe && old[nr_probes].data == data) nr_del++; } } if (nr_probes - nr_del == 0) { ... } else { ... } Does it look better ? Thanks, Mathieu > > -- Kpark > > > > > rather than: > > > > if (probe) { > > ... > > } > > > > if (!probe || nr_probes - nr_del == 0) { > > ... > > } > > > > Using nr_del makes the code easier to follow IMHO. > > > > Thanks, > > > > Mathieu > > -- Mathieu Desnoyers EfficiOS Inc. http://www.efficios.com ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] tracepoints: prevents null probe from being added 2013-03-21 3:33 ` Mathieu Desnoyers @ 2013-03-21 4:25 ` Keun-O Park 0 siblings, 0 replies; 10+ messages in thread From: Keun-O Park @ 2013-03-21 4:25 UTC (permalink / raw) To: Mathieu Desnoyers; +Cc: Steven Rostedt, keun-o.park, linux-kernel On Thu, Mar 21, 2013 at 12:33 PM, Mathieu Desnoyers <mathieu.desnoyers@efficios.com> wrote: > * Keun-O Park (kpark3469@gmail.com) wrote: >> On Thu, Mar 21, 2013 at 11:45 AM, Mathieu Desnoyers >> <mathieu.desnoyers@efficios.com> wrote: >> > * Keun-O Park (kpark3469@gmail.com) wrote: >> >> On Thu, Mar 21, 2013 at 8:01 AM, Steven Rostedt <rostedt@goodmis.org> wrote: >> >> > On Wed, 2013-03-20 at 14:01 -0400, Mathieu Desnoyers wrote: >> >> >> * Steven Rostedt (rostedt@goodmis.org) wrote: >> >> >> > On Wed, 2013-03-20 at 12:18 +0900, kpark3469@gmail.com wrote: >> >> >> > > From: Sahara <keun-o.park@windriver.com> >> >> >> > > >> >> >> > > Somehow tracepoint_entry_add/remove_probe functions allow a null probe >> >> >> > > function. >> >> >> > >> >> >> > You actually hit this in practice, or is this just something that you >> >> >> > observe from code review? >> >> >> > >> >> >> > > Especially on getting a null probe in remove function, it seems >> >> >> > > to be used to remove all probe functions in the entry. >> >> >> > >> >> >> > Hmm, that actually sounds like a feature. >> >> >> >> >> >> Yep. It's been a long time since I wrote this code, but the removal code >> >> >> seems to use NULL probe pointer to remove all probes for a given >> >> >> tracepoint. >> >> >> >> >> >> I'd be tempted to just validate non-NULL probe within >> >> >> tracepoint_entry_add_probe() and let other sites as is, just in case >> >> >> anyone would be using this feature. >> >> >> >> >> >> I cannot say that I have personally used this "remove all" feature much >> >> >> though. >> >> >> >> >> > >> >> > I agree. I don't see anything wrong in leaving the null probe feature in >> >> > the removal code. But updating the add code looks like a proper change. >> >> > >> >> > -- Steve >> >> > >> >> > >> >> >> >> Hello Steve & Mathieu, >> >> If we want to leave the null probe feature enabled, I think it would >> >> be better modifying the code like the following for code efficiency. >> >> >> >> @@ -112,7 +112,8 @@ tracepoint_entry_add_probe(struct tracepoint_entry *entry, >> >> int nr_probes = 0; >> >> struct tracepoint_func *old, *new; >> >> >> >> - WARN_ON(!probe); >> >> + if (WARN_ON(!probe)) >> >> + return ERR_PTR(-EINVAL); >> >> >> >> debug_print_probes(entry); >> >> old = entry->funcs; >> >> @@ -152,14 +153,15 @@ tracepoint_entry_remove_probe(struct tracepoint_entry *ent >> >> >> >> debug_print_probes(entry); >> >> /* (N -> M), (N > 1, M >= 0) probes */ >> >> - for (nr_probes = 0; old[nr_probes].func; nr_probes++) { >> >> - if (!probe || >> >> - (old[nr_probes].func == probe && >> >> - old[nr_probes].data == data)) >> >> - nr_del++; >> >> + if (probe) { >> >> + for (nr_probes = 0; old[nr_probes].func; nr_probes++) { >> >> + if (old[nr_probes].func == probe && >> >> + old[nr_probes].data == data) >> >> + nr_del++; >> >> + } >> >> } >> >> >> >> - if (nr_probes - nr_del == 0) { >> >> + if (!probe || nr_probes - nr_del == 0) { >> > >> > We might want to do: >> > >> > if (probe) { >> > ... >> > } else { >> > nr_del = nr_probes; >> > } >> > >> > if (nr_probes - nr_del == 0) { >> > ... >> > } >> >> This code has a problem. >> nr_probes is initialized as zero. > > yes, > >> And, in order to get correct count of probes, >> we need to go through the for-loop even though probe is null. >> So with above code, nr_del will be zero. Anyhow, the code will fall >> through if-clause(nr_probes-nr_del==0). >> It looks odd to me. > > Ah, I see what you mean: the nr_del = nr_probes assignment is useless, > because both nr_probes and nr_del are equal to 0. So we could go for: > > if (probe) { > for (nr_probes = 0; old[nr_probes].func; nr_probes++) { > if (old[nr_probes].func == probe && > old[nr_probes].data == data) > nr_del++; > } > } > > if (nr_probes - nr_del == 0) { > ... > } else { > ... > } > > Does it look better ? > > Thanks, > > Mathieu Yes, it does, only if you don't think this code is hard to follow. ;-) Thanks. -- Kpark ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2013-03-21 4:25 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-03-20 3:18 [PATCH] tracepoints: prevents null probe from being added kpark3469 2013-03-20 17:31 ` Steven Rostedt 2013-03-20 18:01 ` Mathieu Desnoyers 2013-03-20 23:01 ` Steven Rostedt 2013-03-21 1:39 ` Keun-O Park 2013-03-21 1:45 ` Keun-O Park 2013-03-21 2:45 ` Mathieu Desnoyers 2013-03-21 3:03 ` Keun-O Park 2013-03-21 3:33 ` Mathieu Desnoyers 2013-03-21 4:25 ` Keun-O Park
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox