Message ID | f70377945d1d8e6e4916cbce871a12303d6186b4.1585233617.git.andreyknvl@google.com (mailing list archive) |
---|---|
State | Mainlined |
Commit | 5fe7042dc0a2e80b4633df20dcd06b93e76e3c31 |
Headers | show |
Series | kcov: collect coverage from usb soft interrupts | expand |
On Thu, Mar 26, 2020 at 3:44 PM Andrey Konovalov <andreyknvl@google.com> wrote: > > Currently kcov_remote_start() and kcov_remote_stop() check t->kcov to > find out whether the coverage is already being collected by the > current task. Use t->kcov_mode for that instead. This doesn't change > the overall behavior in any way, but serves as a preparation for the > following softirq coverage collection support patch. > > Signed-off-by: Andrey Konovalov <andreyknvl@google.com> Reviewed-by: Dmitry Vyukov <dvyukov@google.com> > --- > kernel/kcov.c | 32 +++++++++++++++++++++++--------- > 1 file changed, 23 insertions(+), 9 deletions(-) > > diff --git a/kernel/kcov.c b/kernel/kcov.c > index b985b7a72870..e43f06b5b2e4 100644 > --- a/kernel/kcov.c > +++ b/kernel/kcov.c > @@ -746,26 +746,33 @@ static const struct file_operations kcov_fops = { > * In turns kcov_remote_stop() clears those pointers from task_struct to stop > * collecting coverage and copies all collected coverage into the kcov area. > */ > + > +static inline bool kcov_mode_enabled(unsigned int mode) > +{ > + return (mode & ~KCOV_IN_CTXSW) != KCOV_MODE_DISABLED; > +} > + > void kcov_remote_start(u64 handle) > { > + struct task_struct *t = current; > struct kcov_remote *remote; > struct kcov *kcov; > + unsigned int mode; > void *area; > - struct task_struct *t; > unsigned int size; > - enum kcov_mode mode; > int sequence; > > if (WARN_ON(!kcov_check_handle(handle, true, true, true))) > return; > if (WARN_ON(!in_task())) > return; > - t = current; > + > /* > * Check that kcov_remote_start is not called twice > * nor called by user tasks (with enabled kcov). > */ > - if (WARN_ON(t->kcov)) > + mode = READ_ONCE(t->kcov_mode); > + if (WARN_ON(kcov_mode_enabled(mode))) > return; > > kcov_debug("handle = %llx\n", handle); > @@ -863,13 +870,20 @@ static void kcov_move_area(enum kcov_mode mode, void *dst_area, > void kcov_remote_stop(void) > { > struct task_struct *t = current; > - struct kcov *kcov = t->kcov; > - void *area = t->kcov_area; > - unsigned int size = t->kcov_size; > - int sequence = t->kcov_sequence; > + struct kcov *kcov; > + unsigned int mode; > + void *area; > + unsigned int size; > + int sequence; > > - if (!kcov) > + mode = READ_ONCE(t->kcov_mode); > + barrier(); > + if (!kcov_mode_enabled(mode)) > return; > + kcov = t->kcov; > + area = t->kcov_area; > + size = t->kcov_size; > + sequence = t->kcov_sequence; > > kcov_stop(t); > > -- > 2.26.0.rc2.310.g2932bb562d-goog >
diff --git a/kernel/kcov.c b/kernel/kcov.c index b985b7a72870..e43f06b5b2e4 100644 --- a/kernel/kcov.c +++ b/kernel/kcov.c @@ -746,26 +746,33 @@ static const struct file_operations kcov_fops = { * In turns kcov_remote_stop() clears those pointers from task_struct to stop * collecting coverage and copies all collected coverage into the kcov area. */ + +static inline bool kcov_mode_enabled(unsigned int mode) +{ + return (mode & ~KCOV_IN_CTXSW) != KCOV_MODE_DISABLED; +} + void kcov_remote_start(u64 handle) { + struct task_struct *t = current; struct kcov_remote *remote; struct kcov *kcov; + unsigned int mode; void *area; - struct task_struct *t; unsigned int size; - enum kcov_mode mode; int sequence; if (WARN_ON(!kcov_check_handle(handle, true, true, true))) return; if (WARN_ON(!in_task())) return; - t = current; + /* * Check that kcov_remote_start is not called twice * nor called by user tasks (with enabled kcov). */ - if (WARN_ON(t->kcov)) + mode = READ_ONCE(t->kcov_mode); + if (WARN_ON(kcov_mode_enabled(mode))) return; kcov_debug("handle = %llx\n", handle); @@ -863,13 +870,20 @@ static void kcov_move_area(enum kcov_mode mode, void *dst_area, void kcov_remote_stop(void) { struct task_struct *t = current; - struct kcov *kcov = t->kcov; - void *area = t->kcov_area; - unsigned int size = t->kcov_size; - int sequence = t->kcov_sequence; + struct kcov *kcov; + unsigned int mode; + void *area; + unsigned int size; + int sequence; - if (!kcov) + mode = READ_ONCE(t->kcov_mode); + barrier(); + if (!kcov_mode_enabled(mode)) return; + kcov = t->kcov; + area = t->kcov_area; + size = t->kcov_size; + sequence = t->kcov_sequence; kcov_stop(t);
Currently kcov_remote_start() and kcov_remote_stop() check t->kcov to find out whether the coverage is already being collected by the current task. Use t->kcov_mode for that instead. This doesn't change the overall behavior in any way, but serves as a preparation for the following softirq coverage collection support patch. Signed-off-by: Andrey Konovalov <andreyknvl@google.com> --- kernel/kcov.c | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-)