diff mbox

[3/3] blk-throttle: don't parse cgroup path if trace isn't enabled

Message ID b395946862a1a963e6d74b70349322eceb5d42d4.1462838969.git.shli@fb.com (mailing list archive)
State New, archived
Headers show

Commit Message

Shaohua Li May 10, 2016, 12:22 a.m. UTC
if trace isn't enabled, parsing cgroup path just wastes cpu

Signed-off-by: Shaohua Li <shli@fb.com>
---
 block/blk-throttle.c         | 5 ++---
 include/linux/blktrace_api.h | 9 +++++++++
 2 files changed, 11 insertions(+), 3 deletions(-)

Comments

simon May 10, 2016, 5:46 a.m. UTC | #1
Hi, 
On Mon, May 09, 2016 at 05:22:15PM -0700, Shaohua Li wrote:
> if trace isn't enabled, parsing cgroup path just wastes cpu
> 
> Signed-off-by: Shaohua Li <shli@fb.com>
> ---
>  block/blk-throttle.c         | 5 ++---
>  include/linux/blktrace_api.h | 9 +++++++++
>  2 files changed, 11 insertions(+), 3 deletions(-)
> 
> diff --git a/block/blk-throttle.c b/block/blk-throttle.c
> index 2149a1d..47a3e54 100644
> --- a/block/blk-throttle.c
> +++ b/block/blk-throttle.c
> @@ -211,15 +211,14 @@ static struct throtl_data *sq_to_td(struct throtl_service_queue *sq)
>   *
>   * The messages are prefixed with "throtl BLKG_NAME" if @sq belongs to a
>   * throtl_grp; otherwise, just "throtl".
> - *
> - * TODO: this should be made a function and name formatting should happen
> - * after testing whether blktrace is enabled.
>   */
>  #define throtl_log(sq, fmt, args...)	do {				\
>  	struct throtl_grp *__tg = sq_to_tg((sq));			\
>  	struct throtl_data *__td = sq_to_td((sq));			\
>  									\
>  	(void)__td;							\
> +	if (likely(!blk_trace_note_message_enabled(__td->queue)))	\
> +		break;							\
>  	if ((__tg)) {							\
>  		char __pbuf[128];					\
>  									\
> diff --git a/include/linux/blktrace_api.h b/include/linux/blktrace_api.h
> index afc1343..0f3172b 100644
> --- a/include/linux/blktrace_api.h
> +++ b/include/linux/blktrace_api.h
> @@ -57,6 +57,14 @@ void __trace_note_message(struct blk_trace *, const char *fmt, ...);
>  	} while (0)
>  #define BLK_TN_MAX_MSG		128
>  
> +static inline bool blk_trace_note_message_enabled(struct request_queue *q)
> +{
> +	struct blk_trace *bt = q->blk_trace;
> +	if (likely(!bt))
> +		return false;
> +	return bt->act_mask & BLK_TC_NOTIFY;
> +}
Is there any reason to skip following condition?
        if (unlikely(bt->trace_state != Blktrace_running &&
                     !blk_tracer_enabled))

Thanks,
- Simon
--
To unsubscribe from this list: send the line "unsubscribe linux-block" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jeff Moyer May 10, 2016, 3:52 p.m. UTC | #2
Shaohua Li <shli@fb.com> writes:

> if trace isn't enabled, parsing cgroup path just wastes cpu
>
> Signed-off-by: Shaohua Li <shli@fb.com>
> ---
>  block/blk-throttle.c         | 5 ++---
>  include/linux/blktrace_api.h | 9 +++++++++
>  2 files changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/block/blk-throttle.c b/block/blk-throttle.c
> index 2149a1d..47a3e54 100644
> --- a/block/blk-throttle.c
> +++ b/block/blk-throttle.c
> @@ -211,15 +211,14 @@ static struct throtl_data *sq_to_td(struct throtl_service_queue *sq)
>   *
>   * The messages are prefixed with "throtl BLKG_NAME" if @sq belongs to a
>   * throtl_grp; otherwise, just "throtl".
> - *
> - * TODO: this should be made a function and name formatting should happen
> - * after testing whether blktrace is enabled.

You've only addressed the second part of the TODO, please don't remove
the first part.

>   */
>  #define throtl_log(sq, fmt, args...)	do {				\
>  	struct throtl_grp *__tg = sq_to_tg((sq));			\
>  	struct throtl_data *__td = sq_to_td((sq));			\
>  									\
>  	(void)__td;							\
> +	if (likely(!blk_trace_note_message_enabled(__td->queue)))	\
> +		break;							\
>  	if ((__tg)) {							\
>  		char __pbuf[128];					\
>  									\
> diff --git a/include/linux/blktrace_api.h b/include/linux/blktrace_api.h
> index afc1343..0f3172b 100644
> --- a/include/linux/blktrace_api.h
> +++ b/include/linux/blktrace_api.h
> @@ -57,6 +57,14 @@ void __trace_note_message(struct blk_trace *, const char *fmt, ...);
>  	} while (0)
>  #define BLK_TN_MAX_MSG		128
>  
> +static inline bool blk_trace_note_message_enabled(struct request_queue *q)
> +{
> +	struct blk_trace *bt = q->blk_trace;
> +	if (likely(!bt))
> +		return false;
> +	return bt->act_mask & BLK_TC_NOTIFY;

Do we want to return !!(bt->act_mask & BLK_TC_NOTIFY)?

-Jeff

> +}
> +
>  extern void blk_add_driver_data(struct request_queue *q, struct request *rq,
>  				void *data, size_t len);
>  extern int blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
> @@ -79,6 +87,7 @@ extern struct attribute_group blk_trace_attr_group;
>  # define blk_trace_remove(q)				(-ENOTTY)
>  # define blk_add_trace_msg(q, fmt, ...)			do { } while (0)
>  # define blk_trace_remove_sysfs(dev)			do { } while (0)
> +# define blk_trace_note_message_enabled(q)		(false)
>  static inline int blk_trace_init_sysfs(struct device *dev)
>  {
>  	return 0;
--
To unsubscribe from this list: send the line "unsubscribe linux-block" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Steven Rostedt May 10, 2016, 11:33 p.m. UTC | #3
On Tue, 10 May 2016 11:52:15 -0400
Jeff Moyer <jmoyer@redhat.com> wrote:

 
> > +static inline bool blk_trace_note_message_enabled(struct request_queue *q)
> > +{
> > +	struct blk_trace *bt = q->blk_trace;
> > +	if (likely(!bt))
> > +		return false;
> > +	return bt->act_mask & BLK_TC_NOTIFY;  
> 
> Do we want to return !!(bt->act_mask & BLK_TC_NOTIFY)?

The return type is bool. I would think that gcc would be smart enough
to make the conversion.

To check, I compiled the following function:

bool testbool(int x)
{
        return x & 1<<3;
}

and the result was:


0000000000000000 <testbool>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   89 7d fc                mov    %edi,-0x4(%rbp)
   7:   8b 45 fc                mov    -0x4(%rbp),%eax
   a:   83 e0 08                and    $0x8,%eax
   d:   85 c0                   test   %eax,%eax
   f:   0f 95 c0                setne  %al
  12:   5d                      pop    %rbp
  13:   c3                      retq   

I get the same by adding !!(x & 1<<3)

Looks like it does the conversion.

-- Steve
--
To unsubscribe from this list: send the line "unsubscribe linux-block" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Shaohua Li May 11, 2016, 12:20 a.m. UTC | #4
On Tue, May 10, 2016 at 11:52:15AM -0400, Jeff Moyer wrote:
> Shaohua Li <shli@fb.com> writes:
> 
> > if trace isn't enabled, parsing cgroup path just wastes cpu
> >
> > Signed-off-by: Shaohua Li <shli@fb.com>
> > ---
> >  block/blk-throttle.c         | 5 ++---
> >  include/linux/blktrace_api.h | 9 +++++++++
> >  2 files changed, 11 insertions(+), 3 deletions(-)
> >
> > diff --git a/block/blk-throttle.c b/block/blk-throttle.c
> > index 2149a1d..47a3e54 100644
> > --- a/block/blk-throttle.c
> > +++ b/block/blk-throttle.c
> > @@ -211,15 +211,14 @@ static struct throtl_data *sq_to_td(struct throtl_service_queue *sq)
> >   *
> >   * The messages are prefixed with "throtl BLKG_NAME" if @sq belongs to a
> >   * throtl_grp; otherwise, just "throtl".
> > - *
> > - * TODO: this should be made a function and name formatting should happen
> > - * after testing whether blktrace is enabled.
> 
> You've only addressed the second part of the TODO, please don't remove
> the first part.

alright, I'll send a patch to convert it to a function.
--
To unsubscribe from this list: send the line "unsubscribe linux-block" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jeff Moyer May 11, 2016, 1:41 p.m. UTC | #5
Shaohua Li <shli@fb.com> writes:

> On Tue, May 10, 2016 at 11:52:15AM -0400, Jeff Moyer wrote:
>> Shaohua Li <shli@fb.com> writes:
>> 
>> > if trace isn't enabled, parsing cgroup path just wastes cpu
>> >
>> > Signed-off-by: Shaohua Li <shli@fb.com>
>> > ---
>> >  block/blk-throttle.c         | 5 ++---
>> >  include/linux/blktrace_api.h | 9 +++++++++
>> >  2 files changed, 11 insertions(+), 3 deletions(-)
>> >
>> > diff --git a/block/blk-throttle.c b/block/blk-throttle.c
>> > index 2149a1d..47a3e54 100644
>> > --- a/block/blk-throttle.c
>> > +++ b/block/blk-throttle.c
>> > @@ -211,15 +211,14 @@ static struct throtl_data *sq_to_td(struct throtl_service_queue *sq)
>> >   *
>> >   * The messages are prefixed with "throtl BLKG_NAME" if @sq belongs to a
>> >   * throtl_grp; otherwise, just "throtl".
>> > - *
>> > - * TODO: this should be made a function and name formatting should happen
>> > - * after testing whether blktrace is enabled.
>> 
>> You've only addressed the second part of the TODO, please don't remove
>> the first part.
>
> alright, I'll send a patch to convert it to a function.

Heh.  I figured you'd just put that part of the TODO back in there.  But
actually addressing it sounds better.  ;-)

Thanks!
Jeff
--
To unsubscribe from this list: send the line "unsubscribe linux-block" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jeff Moyer May 11, 2016, 1:47 p.m. UTC | #6
Steven Rostedt <rostedt@goodmis.org> writes:

>> Do we want to return !!(bt->act_mask & BLK_TC_NOTIFY)?
>
> The return type is bool. I would think that gcc would be smart enough
> to make the conversion.
>
> To check, I compiled the following function:
>
> bool testbool(int x)
> {
>         return x & 1<<3;
> }
>
> and the result was:
>
>
> 0000000000000000 <testbool>:
>    0:   55                      push   %rbp
>    1:   48 89 e5                mov    %rsp,%rbp
>    4:   89 7d fc                mov    %edi,-0x4(%rbp)
>    7:   8b 45 fc                mov    -0x4(%rbp),%eax
>    a:   83 e0 08                and    $0x8,%eax
>    d:   85 c0                   test   %eax,%eax
>    f:   0f 95 c0                setne  %al
>   12:   5d                      pop    %rbp
>   13:   c3                      retq   
>
> I get the same by adding !!(x & 1<<3)
>
> Looks like it does the conversion.

Cool, thanks!

-Jeff
--
To unsubscribe from this list: send the line "unsubscribe linux-block" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Shaohua Li May 11, 2016, 4:49 p.m. UTC | #7
On Wed, May 11, 2016 at 09:41:20AM -0400, Jeff Moyer wrote:
> Shaohua Li <shli@fb.com> writes:
> 
> > On Tue, May 10, 2016 at 11:52:15AM -0400, Jeff Moyer wrote:
> >> Shaohua Li <shli@fb.com> writes:
> >> 
> >> > if trace isn't enabled, parsing cgroup path just wastes cpu
> >> >
> >> > Signed-off-by: Shaohua Li <shli@fb.com>
> >> > ---
> >> >  block/blk-throttle.c         | 5 ++---
> >> >  include/linux/blktrace_api.h | 9 +++++++++
> >> >  2 files changed, 11 insertions(+), 3 deletions(-)
> >> >
> >> > diff --git a/block/blk-throttle.c b/block/blk-throttle.c
> >> > index 2149a1d..47a3e54 100644
> >> > --- a/block/blk-throttle.c
> >> > +++ b/block/blk-throttle.c
> >> > @@ -211,15 +211,14 @@ static struct throtl_data *sq_to_td(struct throtl_service_queue *sq)
> >> >   *
> >> >   * The messages are prefixed with "throtl BLKG_NAME" if @sq belongs to a
> >> >   * throtl_grp; otherwise, just "throtl".
> >> > - *
> >> > - * TODO: this should be made a function and name formatting should happen
> >> > - * after testing whether blktrace is enabled.
> >> 
> >> You've only addressed the second part of the TODO, please don't remove
> >> the first part.
> >
> > alright, I'll send a patch to convert it to a function.
> 
> Heh.  I figured you'd just put that part of the TODO back in there.  But
> actually addressing it sounds better.  ;-)

Actually I'd like to give up. To convert it to a function, I need add a
var arg version of blk_add_trace_msg. And throtl_log adds new parameter
and change fmt, so I must allocate a new string to fit old fmt and new
parameter and new fmt string. It's not worthy the effort I think.

Thanks,
Shaohua
--
To unsubscribe from this list: send the line "unsubscribe linux-block" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Shaohua Li May 11, 2016, 4:54 p.m. UTC | #8
On Tue, May 10, 2016 at 01:46:13PM +0800, Simon Guo wrote:
> Hi, 
> On Mon, May 09, 2016 at 05:22:15PM -0700, Shaohua Li wrote:
> > if trace isn't enabled, parsing cgroup path just wastes cpu
> > 
> > Signed-off-by: Shaohua Li <shli@fb.com>
> > ---
> >  block/blk-throttle.c         | 5 ++---
> >  include/linux/blktrace_api.h | 9 +++++++++
> >  2 files changed, 11 insertions(+), 3 deletions(-)
> > 
> > diff --git a/block/blk-throttle.c b/block/blk-throttle.c
> > index 2149a1d..47a3e54 100644
> > --- a/block/blk-throttle.c
> > +++ b/block/blk-throttle.c
> > @@ -211,15 +211,14 @@ static struct throtl_data *sq_to_td(struct throtl_service_queue *sq)
> >   *
> >   * The messages are prefixed with "throtl BLKG_NAME" if @sq belongs to a
> >   * throtl_grp; otherwise, just "throtl".
> > - *
> > - * TODO: this should be made a function and name formatting should happen
> > - * after testing whether blktrace is enabled.
> >   */
> >  #define throtl_log(sq, fmt, args...)	do {				\
> >  	struct throtl_grp *__tg = sq_to_tg((sq));			\
> >  	struct throtl_data *__td = sq_to_td((sq));			\
> >  									\
> >  	(void)__td;							\
> > +	if (likely(!blk_trace_note_message_enabled(__td->queue)))	\
> > +		break;							\
> >  	if ((__tg)) {							\
> >  		char __pbuf[128];					\
> >  									\
> > diff --git a/include/linux/blktrace_api.h b/include/linux/blktrace_api.h
> > index afc1343..0f3172b 100644
> > --- a/include/linux/blktrace_api.h
> > +++ b/include/linux/blktrace_api.h
> > @@ -57,6 +57,14 @@ void __trace_note_message(struct blk_trace *, const char *fmt, ...);
> >  	} while (0)
> >  #define BLK_TN_MAX_MSG		128
> >  
> > +static inline bool blk_trace_note_message_enabled(struct request_queue *q)
> > +{
> > +	struct blk_trace *bt = q->blk_trace;
> > +	if (likely(!bt))
> > +		return false;
> > +	return bt->act_mask & BLK_TC_NOTIFY;
> > +}
> Is there any reason to skip following condition?
>         if (unlikely(bt->trace_state != Blktrace_running &&
>                      !blk_tracer_enabled))

It's marked unlikely and to add the check we must export
blk_tracer_enabled, so I ignored it. Though I don't know how unlikely it
is.

Thanks,
Shaohua
--
To unsubscribe from this list: send the line "unsubscribe linux-block" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/block/blk-throttle.c b/block/blk-throttle.c
index 2149a1d..47a3e54 100644
--- a/block/blk-throttle.c
+++ b/block/blk-throttle.c
@@ -211,15 +211,14 @@  static struct throtl_data *sq_to_td(struct throtl_service_queue *sq)
  *
  * The messages are prefixed with "throtl BLKG_NAME" if @sq belongs to a
  * throtl_grp; otherwise, just "throtl".
- *
- * TODO: this should be made a function and name formatting should happen
- * after testing whether blktrace is enabled.
  */
 #define throtl_log(sq, fmt, args...)	do {				\
 	struct throtl_grp *__tg = sq_to_tg((sq));			\
 	struct throtl_data *__td = sq_to_td((sq));			\
 									\
 	(void)__td;							\
+	if (likely(!blk_trace_note_message_enabled(__td->queue)))	\
+		break;							\
 	if ((__tg)) {							\
 		char __pbuf[128];					\
 									\
diff --git a/include/linux/blktrace_api.h b/include/linux/blktrace_api.h
index afc1343..0f3172b 100644
--- a/include/linux/blktrace_api.h
+++ b/include/linux/blktrace_api.h
@@ -57,6 +57,14 @@  void __trace_note_message(struct blk_trace *, const char *fmt, ...);
 	} while (0)
 #define BLK_TN_MAX_MSG		128
 
+static inline bool blk_trace_note_message_enabled(struct request_queue *q)
+{
+	struct blk_trace *bt = q->blk_trace;
+	if (likely(!bt))
+		return false;
+	return bt->act_mask & BLK_TC_NOTIFY;
+}
+
 extern void blk_add_driver_data(struct request_queue *q, struct request *rq,
 				void *data, size_t len);
 extern int blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
@@ -79,6 +87,7 @@  extern struct attribute_group blk_trace_attr_group;
 # define blk_trace_remove(q)				(-ENOTTY)
 # define blk_add_trace_msg(q, fmt, ...)			do { } while (0)
 # define blk_trace_remove_sysfs(dev)			do { } while (0)
+# define blk_trace_note_message_enabled(q)		(false)
 static inline int blk_trace_init_sysfs(struct device *dev)
 {
 	return 0;