All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] block: call elv_bio_merged() when merged
@ 2011-05-20  5:28 Namhyung Kim
  2011-05-20  8:31 ` Shaohua Li
  0 siblings, 1 reply; 8+ messages in thread
From: Namhyung Kim @ 2011-05-20  5:28 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-kernel, Divyesh Shah

Commit 73c101011926 ("block: initial patch for on-stack per-task plugging")
removed calls to elv_bio_merged() when @bio merged with @req. Re-add them.

Signed-off-by: Namhyung Kim <namhyung@gmail.com>
Cc: Divyesh Shah <dpshah@google.com>
---
 block/blk-core.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/block/blk-core.c b/block/blk-core.c
index 3fe00a14822a..4dc02ef5fc82 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -1132,6 +1132,7 @@ static bool bio_attempt_back_merge(struct request_queue *q, struct request *req,
 	req->ioprio = ioprio_best(req->ioprio, bio_prio(bio));
 
 	drive_stat_acct(req, 0);
+	elv_bio_merged(q, req, bio);
 	return true;
 }
 
@@ -1173,6 +1174,7 @@ static bool bio_attempt_front_merge(struct request_queue *q,
 	req->ioprio = ioprio_best(req->ioprio, bio_prio(bio));
 
 	drive_stat_acct(req, 0);
+	elv_bio_merged(q, req, bio);
 	return true;
 }
 
-- 
1.7.5


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

* Re: [PATCH] block: call elv_bio_merged() when merged
  2011-05-20  5:28 [PATCH] block: call elv_bio_merged() when merged Namhyung Kim
@ 2011-05-20  8:31 ` Shaohua Li
  2011-05-20  9:51   ` Namhyung Kim
  0 siblings, 1 reply; 8+ messages in thread
From: Shaohua Li @ 2011-05-20  8:31 UTC (permalink / raw)
  To: Namhyung Kim; +Cc: Jens Axboe, linux-kernel, Divyesh Shah

2011/5/20 Namhyung Kim <namhyung@gmail.com>:
> Commit 73c101011926 ("block: initial patch for on-stack per-task plugging")
> removed calls to elv_bio_merged() when @bio merged with @req. Re-add them.
>
> Signed-off-by: Namhyung Kim <namhyung@gmail.com>
> Cc: Divyesh Shah <dpshah@google.com>
> ---
>  block/blk-core.c |    2 ++
>  1 files changed, 2 insertions(+), 0 deletions(-)
>
> diff --git a/block/blk-core.c b/block/blk-core.c
> index 3fe00a14822a..4dc02ef5fc82 100644
> --- a/block/blk-core.c
> +++ b/block/blk-core.c
> @@ -1132,6 +1132,7 @@ static bool bio_attempt_back_merge(struct request_queue *q, struct request *req,
>        req->ioprio = ioprio_best(req->ioprio, bio_prio(bio));
>
>        drive_stat_acct(req, 0);
> +       elv_bio_merged(q, req, bio);
>        return true;
>  }
>
> @@ -1173,6 +1174,7 @@ static bool bio_attempt_front_merge(struct request_queue *q,
>        req->ioprio = ioprio_best(req->ioprio, bio_prio(bio));
>
>        drive_stat_acct(req, 0);
> +       elv_bio_merged(q, req, bio);
>        return true;
>  }
Looks you should do this in __make_request. when the routine is called
in attempt_plug_merge, the request isn't added to elevator yet.

Thanks,
Shaohua

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

* Re: [PATCH] block: call elv_bio_merged() when merged
  2011-05-20  8:31 ` Shaohua Li
@ 2011-05-20  9:51   ` Namhyung Kim
  2011-05-20 18:50     ` Jens Axboe
  0 siblings, 1 reply; 8+ messages in thread
From: Namhyung Kim @ 2011-05-20  9:51 UTC (permalink / raw)
  To: Shaohua Li; +Cc: Jens Axboe, linux-kernel, Divyesh Shah

Hello,

2011-05-20 (금), 16:31 +0800, Shaohua Li:
> 2011/5/20 Namhyung Kim <namhyung@gmail.com>:
> > Commit 73c101011926 ("block: initial patch for on-stack per-task plugging")
> > removed calls to elv_bio_merged() when @bio merged with @req. Re-add them.
> >
> > Signed-off-by: Namhyung Kim <namhyung@gmail.com>
> > Cc: Divyesh Shah <dpshah@google.com>
> > ---
> >  block/blk-core.c |    2 ++
> >  1 files changed, 2 insertions(+), 0 deletions(-)
> >
> > diff --git a/block/blk-core.c b/block/blk-core.c
> > index 3fe00a14822a..4dc02ef5fc82 100644
> > --- a/block/blk-core.c
> > +++ b/block/blk-core.c
> > @@ -1132,6 +1132,7 @@ static bool bio_attempt_back_merge(struct request_queue *q, struct request *req,
> >        req->ioprio = ioprio_best(req->ioprio, bio_prio(bio));
> >
> >        drive_stat_acct(req, 0);
> > +       elv_bio_merged(q, req, bio);
> >        return true;
> >  }
> >
> > @@ -1173,6 +1174,7 @@ static bool bio_attempt_front_merge(struct request_queue *q,
> >        req->ioprio = ioprio_best(req->ioprio, bio_prio(bio));
> >
> >        drive_stat_acct(req, 0);
> > +       elv_bio_merged(q, req, bio);
> >        return true;
> >  }
> Looks you should do this in __make_request. when the routine is called
> in attempt_plug_merge, the request isn't added to elevator yet.
> 

Hmm.. anyway it is merged. Is there any reason why we shouldn't collect
the stat - or invoke the callback routine - if the @req is not in the
elevator? Or we need to add a separate stat item for this case?

Thanks.

-- 
Regards,
Namhyung Kim



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

* Re: [PATCH] block: call elv_bio_merged() when merged
  2011-05-20  9:51   ` Namhyung Kim
@ 2011-05-20 18:50     ` Jens Axboe
  2011-05-20 19:19       ` Vivek Goyal
  2011-05-23  2:10       ` Shaohua Li
  0 siblings, 2 replies; 8+ messages in thread
From: Jens Axboe @ 2011-05-20 18:50 UTC (permalink / raw)
  To: Namhyung Kim; +Cc: Shaohua Li, linux-kernel, Divyesh Shah

On 2011-05-20 11:51, Namhyung Kim wrote:
> Hello,
> 
> 2011-05-20 (금), 16:31 +0800, Shaohua Li:
>> 2011/5/20 Namhyung Kim <namhyung@gmail.com>:
>>> Commit 73c101011926 ("block: initial patch for on-stack per-task plugging")
>>> removed calls to elv_bio_merged() when @bio merged with @req. Re-add them.
>>>
>>> Signed-off-by: Namhyung Kim <namhyung@gmail.com>
>>> Cc: Divyesh Shah <dpshah@google.com>
>>> ---
>>>  block/blk-core.c |    2 ++
>>>  1 files changed, 2 insertions(+), 0 deletions(-)
>>>
>>> diff --git a/block/blk-core.c b/block/blk-core.c
>>> index 3fe00a14822a..4dc02ef5fc82 100644
>>> --- a/block/blk-core.c
>>> +++ b/block/blk-core.c
>>> @@ -1132,6 +1132,7 @@ static bool bio_attempt_back_merge(struct request_queue *q, struct request *req,
>>>        req->ioprio = ioprio_best(req->ioprio, bio_prio(bio));
>>>
>>>        drive_stat_acct(req, 0);
>>> +       elv_bio_merged(q, req, bio);
>>>        return true;
>>>  }
>>>
>>> @@ -1173,6 +1174,7 @@ static bool bio_attempt_front_merge(struct request_queue *q,
>>>        req->ioprio = ioprio_best(req->ioprio, bio_prio(bio));
>>>
>>>        drive_stat_acct(req, 0);
>>> +       elv_bio_merged(q, req, bio);
>>>        return true;
>>>  }
>> Looks you should do this in __make_request. when the routine is called
>> in attempt_plug_merge, the request isn't added to elevator yet.
>>
> 
> Hmm.. anyway it is merged. Is there any reason why we shouldn't collect
> the stat - or invoke the callback routine - if the @req is not in the
> elevator? Or we need to add a separate stat item for this case?

Your patch should be safe, it's essentially only for the cgroup stuff
that does its own accounting and has appropriate protection for it. We'd
want to do this for both the plug and not-plugged merge case.

It's a bit of a shame to add this though, since now we are hitting the
cgroup lock for each merge.

-- 
Jens Axboe


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

* Re: [PATCH] block: call elv_bio_merged() when merged
  2011-05-20 18:50     ` Jens Axboe
@ 2011-05-20 19:19       ` Vivek Goyal
  2011-05-20 19:21         ` Jens Axboe
  2011-05-23  2:10       ` Shaohua Li
  1 sibling, 1 reply; 8+ messages in thread
From: Vivek Goyal @ 2011-05-20 19:19 UTC (permalink / raw)
  To: Jens Axboe; +Cc: Namhyung Kim, Shaohua Li, linux-kernel, Divyesh Shah

On Fri, May 20, 2011 at 08:50:47PM +0200, Jens Axboe wrote:
> On 2011-05-20 11:51, Namhyung Kim wrote:
> > Hello,
> > 
> > 2011-05-20 (금), 16:31 +0800, Shaohua Li:
> >> 2011/5/20 Namhyung Kim <namhyung@gmail.com>:
> >>> Commit 73c101011926 ("block: initial patch for on-stack per-task plugging")
> >>> removed calls to elv_bio_merged() when @bio merged with @req. Re-add them.
> >>>
> >>> Signed-off-by: Namhyung Kim <namhyung@gmail.com>
> >>> Cc: Divyesh Shah <dpshah@google.com>
> >>> ---
> >>>  block/blk-core.c |    2 ++
> >>>  1 files changed, 2 insertions(+), 0 deletions(-)
> >>>
> >>> diff --git a/block/blk-core.c b/block/blk-core.c
> >>> index 3fe00a14822a..4dc02ef5fc82 100644
> >>> --- a/block/blk-core.c
> >>> +++ b/block/blk-core.c
> >>> @@ -1132,6 +1132,7 @@ static bool bio_attempt_back_merge(struct request_queue *q, struct request *req,
> >>>        req->ioprio = ioprio_best(req->ioprio, bio_prio(bio));
> >>>
> >>>        drive_stat_acct(req, 0);
> >>> +       elv_bio_merged(q, req, bio);
> >>>        return true;
> >>>  }
> >>>
> >>> @@ -1173,6 +1174,7 @@ static bool bio_attempt_front_merge(struct request_queue *q,
> >>>        req->ioprio = ioprio_best(req->ioprio, bio_prio(bio));
> >>>
> >>>        drive_stat_acct(req, 0);
> >>> +       elv_bio_merged(q, req, bio);
> >>>        return true;
> >>>  }
> >> Looks you should do this in __make_request. when the routine is called
> >> in attempt_plug_merge, the request isn't added to elevator yet.
> >>
> > 
> > Hmm.. anyway it is merged. Is there any reason why we shouldn't collect
> > the stat - or invoke the callback routine - if the @req is not in the
> > elevator? Or we need to add a separate stat item for this case?
> 
> Your patch should be safe, it's essentially only for the cgroup stuff
> that does its own accounting and has appropriate protection for it. We'd
> want to do this for both the plug and not-plugged merge case.
> 
> It's a bit of a shame to add this though, since now we are hitting the
> cgroup lock for each merge.

I think wer can make MERGED per cpu as I have done in my other patch
series for following dispatch stats.

BLKIO_STAT_CPU_SECTORS,
/* Total bytes transferred */
BLKIO_STAT_CPU_SERVICE_BYTES,
/* Total IOs serviced, post merge */
BLKIO_STAT_CPU_SERVICED,

Jens are you planning to merge lockless throttling series? Once that gets
merged, we can convert this MERGED stat also per cpu and get rid of need of
taking blkg->stats_lock.

Thanks
Vivek

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

* Re: [PATCH] block: call elv_bio_merged() when merged
  2011-05-20 19:19       ` Vivek Goyal
@ 2011-05-20 19:21         ` Jens Axboe
  2011-05-20 21:02           ` Vivek Goyal
  0 siblings, 1 reply; 8+ messages in thread
From: Jens Axboe @ 2011-05-20 19:21 UTC (permalink / raw)
  To: Vivek Goyal; +Cc: Namhyung Kim, Shaohua Li, linux-kernel, Divyesh Shah

On 2011-05-20 21:19, Vivek Goyal wrote:
> On Fri, May 20, 2011 at 08:50:47PM +0200, Jens Axboe wrote:
>> On 2011-05-20 11:51, Namhyung Kim wrote:
>>> Hello,
>>>
>>> 2011-05-20 (금), 16:31 +0800, Shaohua Li:
>>>> 2011/5/20 Namhyung Kim <namhyung@gmail.com>:
>>>>> Commit 73c101011926 ("block: initial patch for on-stack per-task plugging")
>>>>> removed calls to elv_bio_merged() when @bio merged with @req. Re-add them.
>>>>>
>>>>> Signed-off-by: Namhyung Kim <namhyung@gmail.com>
>>>>> Cc: Divyesh Shah <dpshah@google.com>
>>>>> ---
>>>>>  block/blk-core.c |    2 ++
>>>>>  1 files changed, 2 insertions(+), 0 deletions(-)
>>>>>
>>>>> diff --git a/block/blk-core.c b/block/blk-core.c
>>>>> index 3fe00a14822a..4dc02ef5fc82 100644
>>>>> --- a/block/blk-core.c
>>>>> +++ b/block/blk-core.c
>>>>> @@ -1132,6 +1132,7 @@ static bool bio_attempt_back_merge(struct request_queue *q, struct request *req,
>>>>>        req->ioprio = ioprio_best(req->ioprio, bio_prio(bio));
>>>>>
>>>>>        drive_stat_acct(req, 0);
>>>>> +       elv_bio_merged(q, req, bio);
>>>>>        return true;
>>>>>  }
>>>>>
>>>>> @@ -1173,6 +1174,7 @@ static bool bio_attempt_front_merge(struct request_queue *q,
>>>>>        req->ioprio = ioprio_best(req->ioprio, bio_prio(bio));
>>>>>
>>>>>        drive_stat_acct(req, 0);
>>>>> +       elv_bio_merged(q, req, bio);
>>>>>        return true;
>>>>>  }
>>>> Looks you should do this in __make_request. when the routine is called
>>>> in attempt_plug_merge, the request isn't added to elevator yet.
>>>>
>>>
>>> Hmm.. anyway it is merged. Is there any reason why we shouldn't collect
>>> the stat - or invoke the callback routine - if the @req is not in the
>>> elevator? Or we need to add a separate stat item for this case?
>>
>> Your patch should be safe, it's essentially only for the cgroup stuff
>> that does its own accounting and has appropriate protection for it. We'd
>> want to do this for both the plug and not-plugged merge case.
>>
>> It's a bit of a shame to add this though, since now we are hitting the
>> cgroup lock for each merge.
> 
> I think wer can make MERGED per cpu as I have done in my other patch
> series for following dispatch stats.
> 
> BLKIO_STAT_CPU_SECTORS,
> /* Total bytes transferred */
> BLKIO_STAT_CPU_SERVICE_BYTES,
> /* Total IOs serviced, post merge */
> BLKIO_STAT_CPU_SERVICED,

Yep, lets please do that and we can re-instate the merge calls with
that, too.

> Jens are you planning to merge lockless throttling series? Once that gets
> merged, we can convert this MERGED stat also per cpu and get rid of need of
> taking blkg->stats_lock.

Merged them about an hour ago :-)

Send further updates relative to for-2.6.40/core.

-- 
Jens Axboe


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

* Re: [PATCH] block: call elv_bio_merged() when merged
  2011-05-20 19:21         ` Jens Axboe
@ 2011-05-20 21:02           ` Vivek Goyal
  0 siblings, 0 replies; 8+ messages in thread
From: Vivek Goyal @ 2011-05-20 21:02 UTC (permalink / raw)
  To: Jens Axboe; +Cc: Namhyung Kim, Shaohua Li, linux-kernel, Divyesh Shah

On Fri, May 20, 2011 at 09:21:03PM +0200, Jens Axboe wrote:
> On 2011-05-20 21:19, Vivek Goyal wrote:
> > On Fri, May 20, 2011 at 08:50:47PM +0200, Jens Axboe wrote:
> >> On 2011-05-20 11:51, Namhyung Kim wrote:
> >>> Hello,
> >>>
> >>> 2011-05-20 (금), 16:31 +0800, Shaohua Li:
> >>>> 2011/5/20 Namhyung Kim <namhyung@gmail.com>:
> >>>>> Commit 73c101011926 ("block: initial patch for on-stack per-task plugging")
> >>>>> removed calls to elv_bio_merged() when @bio merged with @req. Re-add them.
> >>>>>
> >>>>> Signed-off-by: Namhyung Kim <namhyung@gmail.com>
> >>>>> Cc: Divyesh Shah <dpshah@google.com>
> >>>>> ---
> >>>>>  block/blk-core.c |    2 ++
> >>>>>  1 files changed, 2 insertions(+), 0 deletions(-)
> >>>>>
> >>>>> diff --git a/block/blk-core.c b/block/blk-core.c
> >>>>> index 3fe00a14822a..4dc02ef5fc82 100644
> >>>>> --- a/block/blk-core.c
> >>>>> +++ b/block/blk-core.c
> >>>>> @@ -1132,6 +1132,7 @@ static bool bio_attempt_back_merge(struct request_queue *q, struct request *req,
> >>>>>        req->ioprio = ioprio_best(req->ioprio, bio_prio(bio));
> >>>>>
> >>>>>        drive_stat_acct(req, 0);
> >>>>> +       elv_bio_merged(q, req, bio);
> >>>>>        return true;
> >>>>>  }
> >>>>>
> >>>>> @@ -1173,6 +1174,7 @@ static bool bio_attempt_front_merge(struct request_queue *q,
> >>>>>        req->ioprio = ioprio_best(req->ioprio, bio_prio(bio));
> >>>>>
> >>>>>        drive_stat_acct(req, 0);
> >>>>> +       elv_bio_merged(q, req, bio);
> >>>>>        return true;
> >>>>>  }
> >>>> Looks you should do this in __make_request. when the routine is called
> >>>> in attempt_plug_merge, the request isn't added to elevator yet.
> >>>>
> >>>
> >>> Hmm.. anyway it is merged. Is there any reason why we shouldn't collect
> >>> the stat - or invoke the callback routine - if the @req is not in the
> >>> elevator? Or we need to add a separate stat item for this case?
> >>
> >> Your patch should be safe, it's essentially only for the cgroup stuff
> >> that does its own accounting and has appropriate protection for it. We'd
> >> want to do this for both the plug and not-plugged merge case.
> >>
> >> It's a bit of a shame to add this though, since now we are hitting the
> >> cgroup lock for each merge.
> > 
> > I think wer can make MERGED per cpu as I have done in my other patch
> > series for following dispatch stats.
> > 
> > BLKIO_STAT_CPU_SECTORS,
> > /* Total bytes transferred */
> > BLKIO_STAT_CPU_SERVICE_BYTES,
> > /* Total IOs serviced, post merge */
> > BLKIO_STAT_CPU_SERVICED,
> 
> Yep, lets please do that and we can re-instate the merge calls with
> that, too.
> 
> > Jens are you planning to merge lockless throttling series? Once that gets
> > merged, we can convert this MERGED stat also per cpu and get rid of need of
> > taking blkg->stats_lock.
> 
> Merged them about an hour ago :-)
> 
> Send further updates relative to for-2.6.40/core.

Sure. I am working on a patch now.

Thanks
Vivek

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

* Re: [PATCH] block: call elv_bio_merged() when merged
  2011-05-20 18:50     ` Jens Axboe
  2011-05-20 19:19       ` Vivek Goyal
@ 2011-05-23  2:10       ` Shaohua Li
  1 sibling, 0 replies; 8+ messages in thread
From: Shaohua Li @ 2011-05-23  2:10 UTC (permalink / raw)
  To: Jens Axboe; +Cc: Namhyung Kim, linux-kernel, Divyesh Shah

On Sat, 2011-05-21 at 02:50 +0800, Jens Axboe wrote:
> On 2011-05-20 11:51, Namhyung Kim wrote:
> > Hello,
> > 
> > 2011-05-20 (금), 16:31 +0800, Shaohua Li:
> >> 2011/5/20 Namhyung Kim <namhyung@gmail.com>:
> >>> Commit 73c101011926 ("block: initial patch for on-stack per-task plugging")
> >>> removed calls to elv_bio_merged() when @bio merged with @req. Re-add them.
> >>>
> >>> Signed-off-by: Namhyung Kim <namhyung@gmail.com>
> >>> Cc: Divyesh Shah <dpshah@google.com>
> >>> ---
> >>>  block/blk-core.c |    2 ++
> >>>  1 files changed, 2 insertions(+), 0 deletions(-)
> >>>
> >>> diff --git a/block/blk-core.c b/block/blk-core.c
> >>> index 3fe00a14822a..4dc02ef5fc82 100644
> >>> --- a/block/blk-core.c
> >>> +++ b/block/blk-core.c
> >>> @@ -1132,6 +1132,7 @@ static bool bio_attempt_back_merge(struct request_queue *q, struct request *req,
> >>>        req->ioprio = ioprio_best(req->ioprio, bio_prio(bio));
> >>>
> >>>        drive_stat_acct(req, 0);
> >>> +       elv_bio_merged(q, req, bio);
> >>>        return true;
> >>>  }
> >>>
> >>> @@ -1173,6 +1174,7 @@ static bool bio_attempt_front_merge(struct request_queue *q,
> >>>        req->ioprio = ioprio_best(req->ioprio, bio_prio(bio));
> >>>
> >>>        drive_stat_acct(req, 0);
> >>> +       elv_bio_merged(q, req, bio);
> >>>        return true;
> >>>  }
> >> Looks you should do this in __make_request. when the routine is called
> >> in attempt_plug_merge, the request isn't added to elevator yet.
> >>
> > 
> > Hmm.. anyway it is merged. Is there any reason why we shouldn't collect
> > the stat - or invoke the callback routine - if the @req is not in the
> > elevator? Or we need to add a separate stat item for this case?
> 
> Your patch should be safe, it's essentially only for the cgroup stuff
> that does its own accounting and has appropriate protection for it. 
I'm just worrying about there is duplicate accounting, but anyway it's
safe.


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

end of thread, other threads:[~2011-05-23  2:10 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-05-20  5:28 [PATCH] block: call elv_bio_merged() when merged Namhyung Kim
2011-05-20  8:31 ` Shaohua Li
2011-05-20  9:51   ` Namhyung Kim
2011-05-20 18:50     ` Jens Axboe
2011-05-20 19:19       ` Vivek Goyal
2011-05-20 19:21         ` Jens Axboe
2011-05-20 21:02           ` Vivek Goyal
2011-05-23  2:10       ` Shaohua Li

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.