All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lukasz Luba <lukasz.luba@arm.com>
To: Robin Murphy <robin.murphy@arm.com>, Rob Herring <robh@kernel.org>
Cc: Nishanth Menon <nm@ti.com>,
	juri.lelli@redhat.com, Peter Zijlstra <peterz@infradead.org>,
	Viresh Kumar <viresh.kumar@linaro.org>,
	Liviu Dudau <liviu.dudau@arm.com>,
	dri-devel <dri-devel@lists.freedesktop.org>,
	Bjorn Andersson <bjorn.andersson@linaro.org>,
	bsegall@google.com, Fabio Estevam <festevam@gmail.com>,
	Morten Rasmussen <Morten.Rasmussen@arm.com>,
	patrick.bellasi@matbug.net,
	Amit Kucheria <amit.kucheria@verdurent.com>,
	Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>,
	Kevin Hilman <khilman@kernel.org>,
	Daniel Lezcano <daniel.lezcano@linaro.org>,
	Steven Price <steven.price@arm.com>,
	Chanwoo Choi <cw00.choi@samsung.com>,
	Ingo Molnar <mingo@redhat.com>,
	Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>,
	Zhang Rui <rui.zhang@intel.com>,
	NXP Linux Team <linux-imx@nxp.com>,
	orjan.eide@arm.com, Sascha Hauer <kernel@pengutronix.de>,
	"open list:THERMAL" <linux-pm@vger.kernel.org>,
	linux-arm-msm <linux-arm-msm@vger.kernel.org>,
	Sascha Hauer <s.hauer@pengutronix.de>,
	Steven Rostedt <rostedt@goodmis.org>,
	"moderated list:ARM/Mediatek SoC support"
	<linux-mediatek@lists.infradead.org>,
	Matthias Brugger <matthias.bgg@gmail.com>,
	linux-omap <linux-omap@vger.kernel.org>,
	mgorman@suse.de,
	"moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE"
	<linux-arm-kernel@lists.infradead.org>,
	David Airlie <airlied@linux.ie>,
	javi.merino@arm.com, Tomeu Vizoso <tomeu.vizoso@collabora.com>,
	qperret@google.com, Stephen Boyd <sboyd@kernel.org>,
	"Rafael J. Wysocki" <rjw@rjwysocki.net>,
	Andy Gross <agross@kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>,
	Daniel Vetter <daniel@ffwll.ch>,
	Sudeep Holla <sudeep.holla@arm.com>,
	Shawn Guo <shawnguo@kernel.org>,
	Dietmar.Eggemann@arm.com
Subject: Re: [PATCH v3 4/4] drm/panfrost: Register to the Energy Model with devfreq device
Date: Wed, 26 Feb 2020 14:39:03 +0000	[thread overview]
Message-ID: <e76e0006-db90-145d-a3d7-b13dd7ff58f7@arm.com> (raw)
In-Reply-To: <67aef493-82ab-e3e0-7564-610ef8756b48@arm.com>



On 2/26/20 1:55 PM, Robin Murphy wrote:
> On 26/02/2020 10:06 am, Lukasz Luba wrote:
> [...]
>>>> @@ -118,6 +120,7 @@ void panfrost_devfreq_fini(struct 
>>>> panfrost_device *pfdev)
>>>>   {
>>>>          if (pfdev->devfreq.cooling)
>>>>                  devfreq_cooling_unregister(pfdev->devfreq.cooling);
>>>> +       dev_pm_opp_of_unregister_em(&pfdev->pdev->dev);
>>>>          dev_pm_opp_of_remove_table(&pfdev->pdev->dev);
>>>
>>> Does it make sense to keep this (and the registration side) as
>>> separate calls? Perhaps there's some ordering requirement with
>>> everything between dev_pm_opp_of_add_table() and
>>> dev_pm_opp_of_register_em()?
>>
>> Yes, dev_pm_opp_of_register_em() uses em_data_callback which operates
>> on OPPs to calculate power values and costs, so the the OPP table should
>> be already there.
>>
>>>
>>> While you're just adding 2 lines, it seems there's a lot of complexity
>>> exposed to the driver just to initialize devfreq/opp.
>>
>> It depends, for example devfreq devices like buses would likely never
>> use the energy model. Potential clients would be GPUs, DSPs, ISPs.
> 
> Still, it seems less than ideal for every client to have to remember to 
> make all these individual calls, all in the right order (especially when 
> it comes to undoing them in failure paths).

There are 3 things that register and unregister process must take
into account:
a) EM struct is populated based on OPPs of the device
    (OPPs must be there before EM tries to calculate per-OPP-cost)
b) EM is returned to subsystems like: scheduler or thermal
    (unregister must be done after removing cooling device)
c) EM might be created with driver specific callback function,
called for each OPP by the EM during setup
    (do not put default simple EM model into framework function)

So a) and b) shouldn't be hard to code, but I agree, it would be easier
for driver developer to not think about them.
Let me try to experiment and address this.

> 
> I haven't quite grasped whether the energy model is conceptually "owned" 
> by the OPP table or by the cooling device, but either way it would seem 
> to be a much nicer API if there were simply an additional "with energy 
> model" variant of the registration call, and the standard removal call 
> just automatically cleaned up an energy model as well if one was present.

This dev_pm_opp_of_* could potentially be used directly inside
devfreq_cooling_register() and then 'unregister' call done internally.
Just limiting devfreq_cooling to a call to:
dev_pm_opp_of_register_em()
would limit the EM for devfreq devices to use only this
simple DT model (which is based on "dynamic-power-coefficient") which
fails in i.e. GPU SCMI where OPP power comes from firmware.

That would require something like
devfreq_cooling_with_em_register(<old_args_here>, struct 
em_data_callback *em_cb)

and then if the *em_cb is set to null, it could call
dev_pm_opp_of_register_em() trying to use it's default em_cb
function, which seeks for "dynamic-power-coefficient".

This is doable inside devfreq_cooling, register and unregister
of EM would be avoided in drivers code.

Thank you Robin for your comments clarifying these things.

Regards,
Lukasz

_______________________________________________
Linux-mediatek mailing list
Linux-mediatek@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-mediatek

WARNING: multiple messages have this Message-ID (diff)
From: Lukasz Luba <lukasz.luba@arm.com>
To: Robin Murphy <robin.murphy@arm.com>, Rob Herring <robh@kernel.org>
Cc: Nishanth Menon <nm@ti.com>,
	juri.lelli@redhat.com, Peter Zijlstra <peterz@infradead.org>,
	Viresh Kumar <viresh.kumar@linaro.org>,
	Liviu Dudau <liviu.dudau@arm.com>,
	dri-devel <dri-devel@lists.freedesktop.org>,
	Bjorn Andersson <bjorn.andersson@linaro.org>,
	bsegall@google.com, Fabio Estevam <festevam@gmail.com>,
	Morten Rasmussen <Morten.Rasmussen@arm.com>,
	patrick.bellasi@matbug.net,
	Amit Kucheria <amit.kucheria@verdurent.com>,
	Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>,
	Kevin Hilman <khilman@kernel.org>,
	Daniel Lezcano <daniel.lezcano@linaro.org>,
	Steven Price <steven.price@arm.com>,
	Chanwoo Choi <cw00.choi@samsung.com>,
	Ingo Molnar <mingo@redhat.com>,
	Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>,
	Zhang Rui <rui.zhang@intel.com>,
	NXP Linux Team <linux-imx@nxp.com>,
	orjan.eide@arm.com, Sascha Hauer <kernel@pengutronix.de>,
	"open list:THERMAL" <linux-pm@vger.kernel.org>,
	linux-arm-msm <linux-arm-msm@vger.kernel.org>,
	Sascha Hauer <s.hauer@pengutronix.de>,
	Steven Rostedt <rostedt@goodmis.org>,
	"moderated list:ARM/Mediatek SoC support"
	<linux-mediatek@lists.infradead.org>,
	Matthias Brugger <matthias.bgg@gmail.com>,
	linux-omap <linux-omap@vger.kernel.org>,
	mgorman@suse.de,
	"moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE"
	<linux-arm-kernel@lists.infradead.org>,
	David Airlie <airlied@linux.ie>,
	javi.merino@arm.com, Tomeu Vizoso <tomeu.vizoso@collabora.com>,
	qperret@google.com, Stephen Boyd <sboyd@kernel.org>,
	"Rafael J. Wysocki" <rjw@rjwysocki.net>,
	Andy Gross <agross@kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>,
	Daniel Vetter <daniel@ffwll.ch>,
	Sudeep Holla <sudeep.holla@arm.com>,
	Shawn Guo <shawnguo@kernel.org>,
	Dietmar.Eggemann@arm.com
Subject: Re: [PATCH v3 4/4] drm/panfrost: Register to the Energy Model with devfreq device
Date: Wed, 26 Feb 2020 14:39:03 +0000	[thread overview]
Message-ID: <e76e0006-db90-145d-a3d7-b13dd7ff58f7@arm.com> (raw)
In-Reply-To: <67aef493-82ab-e3e0-7564-610ef8756b48@arm.com>



On 2/26/20 1:55 PM, Robin Murphy wrote:
> On 26/02/2020 10:06 am, Lukasz Luba wrote:
> [...]
>>>> @@ -118,6 +120,7 @@ void panfrost_devfreq_fini(struct 
>>>> panfrost_device *pfdev)
>>>>   {
>>>>          if (pfdev->devfreq.cooling)
>>>>                  devfreq_cooling_unregister(pfdev->devfreq.cooling);
>>>> +       dev_pm_opp_of_unregister_em(&pfdev->pdev->dev);
>>>>          dev_pm_opp_of_remove_table(&pfdev->pdev->dev);
>>>
>>> Does it make sense to keep this (and the registration side) as
>>> separate calls? Perhaps there's some ordering requirement with
>>> everything between dev_pm_opp_of_add_table() and
>>> dev_pm_opp_of_register_em()?
>>
>> Yes, dev_pm_opp_of_register_em() uses em_data_callback which operates
>> on OPPs to calculate power values and costs, so the the OPP table should
>> be already there.
>>
>>>
>>> While you're just adding 2 lines, it seems there's a lot of complexity
>>> exposed to the driver just to initialize devfreq/opp.
>>
>> It depends, for example devfreq devices like buses would likely never
>> use the energy model. Potential clients would be GPUs, DSPs, ISPs.
> 
> Still, it seems less than ideal for every client to have to remember to 
> make all these individual calls, all in the right order (especially when 
> it comes to undoing them in failure paths).

There are 3 things that register and unregister process must take
into account:
a) EM struct is populated based on OPPs of the device
    (OPPs must be there before EM tries to calculate per-OPP-cost)
b) EM is returned to subsystems like: scheduler or thermal
    (unregister must be done after removing cooling device)
c) EM might be created with driver specific callback function,
called for each OPP by the EM during setup
    (do not put default simple EM model into framework function)

So a) and b) shouldn't be hard to code, but I agree, it would be easier
for driver developer to not think about them.
Let me try to experiment and address this.

> 
> I haven't quite grasped whether the energy model is conceptually "owned" 
> by the OPP table or by the cooling device, but either way it would seem 
> to be a much nicer API if there were simply an additional "with energy 
> model" variant of the registration call, and the standard removal call 
> just automatically cleaned up an energy model as well if one was present.

This dev_pm_opp_of_* could potentially be used directly inside
devfreq_cooling_register() and then 'unregister' call done internally.
Just limiting devfreq_cooling to a call to:
dev_pm_opp_of_register_em()
would limit the EM for devfreq devices to use only this
simple DT model (which is based on "dynamic-power-coefficient") which
fails in i.e. GPU SCMI where OPP power comes from firmware.

That would require something like
devfreq_cooling_with_em_register(<old_args_here>, struct 
em_data_callback *em_cb)

and then if the *em_cb is set to null, it could call
dev_pm_opp_of_register_em() trying to use it's default em_cb
function, which seeks for "dynamic-power-coefficient".

This is doable inside devfreq_cooling, register and unregister
of EM would be avoided in drivers code.

Thank you Robin for your comments clarifying these things.

Regards,
Lukasz

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

WARNING: multiple messages have this Message-ID (diff)
From: Lukasz Luba <lukasz.luba@arm.com>
To: Robin Murphy <robin.murphy@arm.com>, Rob Herring <robh@kernel.org>
Cc: Nishanth Menon <nm@ti.com>,
	juri.lelli@redhat.com, Peter Zijlstra <peterz@infradead.org>,
	Viresh Kumar <viresh.kumar@linaro.org>,
	Liviu Dudau <liviu.dudau@arm.com>,
	dri-devel <dri-devel@lists.freedesktop.org>,
	Bjorn Andersson <bjorn.andersson@linaro.org>,
	bsegall@google.com, Morten Rasmussen <Morten.Rasmussen@arm.com>,
	patrick.bellasi@matbug.net,
	Amit Kucheria <amit.kucheria@verdurent.com>,
	Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>,
	Kevin Hilman <khilman@kernel.org>,
	Daniel Lezcano <daniel.lezcano@linaro.org>,
	Steven Price <steven.price@arm.com>,
	Chanwoo Choi <cw00.choi@samsung.com>,
	Ingo Molnar <mingo@redhat.com>,
	Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>,
	Zhang Rui <rui.zhang@intel.com>,
	NXP Linux Team <linux-imx@nxp.com>,
	orjan.eide@arm.com, Sascha Hauer <kernel@pengutronix.de>,
	"open list:THERMAL" <linux-pm@vger.kernel.org>,
	linux-arm-msm <linux-arm-msm@vger.kernel.org>,
	Sascha Hauer <s.hauer@pengutronix.de>,
	Steven Rostedt <rostedt@goodmis.org>,
	"moderated list:ARM/Mediatek SoC support"
	<linux-mediatek@lists.infradead.org>,
	Matthias Brugger <matthias.bgg@gmail.com>,
	linux-omap <linux-omap@vger.kernel.org>,
	mgorman@suse.de,
	"moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE"
	<linux-arm-kernel@lists.infradead.org>,
	David Airlie <airlied@linux.ie>,
	javi.merino@arm.com, Tomeu Vizoso <tomeu.vizoso@collabora.com>,
	qperret@google.com, Stephen Boyd <sboyd@kernel.org>,
	"Rafael J. Wysocki" <rjw@rjwysocki.net>,
	Andy Gross <agross@kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>,
	Sudeep Holla <sudeep.holla@arm.com>,
	Shawn Guo <shawnguo@kernel.org>,
	Dietmar.Eggemann@arm.com
Subject: Re: [PATCH v3 4/4] drm/panfrost: Register to the Energy Model with devfreq device
Date: Wed, 26 Feb 2020 14:39:03 +0000	[thread overview]
Message-ID: <e76e0006-db90-145d-a3d7-b13dd7ff58f7@arm.com> (raw)
In-Reply-To: <67aef493-82ab-e3e0-7564-610ef8756b48@arm.com>



On 2/26/20 1:55 PM, Robin Murphy wrote:
> On 26/02/2020 10:06 am, Lukasz Luba wrote:
> [...]
>>>> @@ -118,6 +120,7 @@ void panfrost_devfreq_fini(struct 
>>>> panfrost_device *pfdev)
>>>>   {
>>>>          if (pfdev->devfreq.cooling)
>>>>                  devfreq_cooling_unregister(pfdev->devfreq.cooling);
>>>> +       dev_pm_opp_of_unregister_em(&pfdev->pdev->dev);
>>>>          dev_pm_opp_of_remove_table(&pfdev->pdev->dev);
>>>
>>> Does it make sense to keep this (and the registration side) as
>>> separate calls? Perhaps there's some ordering requirement with
>>> everything between dev_pm_opp_of_add_table() and
>>> dev_pm_opp_of_register_em()?
>>
>> Yes, dev_pm_opp_of_register_em() uses em_data_callback which operates
>> on OPPs to calculate power values and costs, so the the OPP table should
>> be already there.
>>
>>>
>>> While you're just adding 2 lines, it seems there's a lot of complexity
>>> exposed to the driver just to initialize devfreq/opp.
>>
>> It depends, for example devfreq devices like buses would likely never
>> use the energy model. Potential clients would be GPUs, DSPs, ISPs.
> 
> Still, it seems less than ideal for every client to have to remember to 
> make all these individual calls, all in the right order (especially when 
> it comes to undoing them in failure paths).

There are 3 things that register and unregister process must take
into account:
a) EM struct is populated based on OPPs of the device
    (OPPs must be there before EM tries to calculate per-OPP-cost)
b) EM is returned to subsystems like: scheduler or thermal
    (unregister must be done after removing cooling device)
c) EM might be created with driver specific callback function,
called for each OPP by the EM during setup
    (do not put default simple EM model into framework function)

So a) and b) shouldn't be hard to code, but I agree, it would be easier
for driver developer to not think about them.
Let me try to experiment and address this.

> 
> I haven't quite grasped whether the energy model is conceptually "owned" 
> by the OPP table or by the cooling device, but either way it would seem 
> to be a much nicer API if there were simply an additional "with energy 
> model" variant of the registration call, and the standard removal call 
> just automatically cleaned up an energy model as well if one was present.

This dev_pm_opp_of_* could potentially be used directly inside
devfreq_cooling_register() and then 'unregister' call done internally.
Just limiting devfreq_cooling to a call to:
dev_pm_opp_of_register_em()
would limit the EM for devfreq devices to use only this
simple DT model (which is based on "dynamic-power-coefficient") which
fails in i.e. GPU SCMI where OPP power comes from firmware.

That would require something like
devfreq_cooling_with_em_register(<old_args_here>, struct 
em_data_callback *em_cb)

and then if the *em_cb is set to null, it could call
dev_pm_opp_of_register_em() trying to use it's default em_cb
function, which seeks for "dynamic-power-coefficient".

This is doable inside devfreq_cooling, register and unregister
of EM would be avoided in drivers code.

Thank you Robin for your comments clarifying these things.

Regards,
Lukasz
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2020-02-26 14:39 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-21 19:47 [PATCH v3 0/4] Add support for devices in the Energy Model Lukasz Luba
2020-02-21 19:47 ` Lukasz Luba
2020-02-21 19:47 ` Lukasz Luba
2020-02-21 19:47 ` Lukasz Luba
2020-02-21 19:47 ` [PATCH v3 1/4] PM / EM: add devices to " Lukasz Luba
2020-02-21 19:47   ` Lukasz Luba
2020-02-21 19:47   ` Lukasz Luba
2020-02-21 19:47   ` Lukasz Luba
2020-02-22  0:42   ` Randy Dunlap
2020-02-22  0:42     ` Randy Dunlap
2020-02-22  0:42     ` Randy Dunlap
2020-02-22  0:42     ` Randy Dunlap
2020-02-25 10:56     ` Lukasz Luba
2020-02-25 10:56       ` Lukasz Luba
2020-02-25 10:56       ` Lukasz Luba
2020-02-25 10:56       ` Lukasz Luba
2020-02-21 19:47 ` [PATCH v3 2/4] OPP: change parameter to device pointer in dev_pm_opp_of_register_em() Lukasz Luba
2020-02-21 19:47   ` Lukasz Luba
2020-02-21 19:47   ` Lukasz Luba
2020-02-21 19:47   ` Lukasz Luba
2020-02-21 19:47 ` [PATCH v3 3/4] thermal: devfreq_cooling: Refactor code and switch to use Energy Model Lukasz Luba
2020-02-21 19:47   ` Lukasz Luba
2020-02-21 19:47   ` Lukasz Luba
2020-02-21 19:47   ` Lukasz Luba
2020-02-21 19:47 ` [PATCH v3 4/4] drm/panfrost: Register to the Energy Model with devfreq device Lukasz Luba
2020-02-21 19:47   ` Lukasz Luba
2020-02-21 19:47   ` Lukasz Luba
2020-02-21 19:47   ` Lukasz Luba
2020-02-25 20:57   ` Rob Herring
2020-02-25 20:57     ` Rob Herring
2020-02-25 20:57     ` Rob Herring
2020-02-26 10:06     ` Lukasz Luba
2020-02-26 10:06       ` Lukasz Luba
2020-02-26 10:06       ` Lukasz Luba
2020-02-26 13:55       ` Robin Murphy
2020-02-26 13:55         ` Robin Murphy
2020-02-26 13:55         ` Robin Murphy
2020-02-26 14:39         ` Lukasz Luba [this message]
2020-02-26 14:39           ` Lukasz Luba
2020-02-26 14:39           ` Lukasz Luba

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e76e0006-db90-145d-a3d7-b13dd7ff58f7@arm.com \
    --to=lukasz.luba@arm.com \
    --cc=Dietmar.Eggemann@arm.com \
    --cc=Morten.Rasmussen@arm.com \
    --cc=agross@kernel.org \
    --cc=airlied@linux.ie \
    --cc=alyssa.rosenzweig@collabora.com \
    --cc=amit.kucheria@verdurent.com \
    --cc=b.zolnierkie@samsung.com \
    --cc=bjorn.andersson@linaro.org \
    --cc=bsegall@google.com \
    --cc=cw00.choi@samsung.com \
    --cc=daniel.lezcano@linaro.org \
    --cc=daniel@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=festevam@gmail.com \
    --cc=javi.merino@arm.com \
    --cc=juri.lelli@redhat.com \
    --cc=kernel@pengutronix.de \
    --cc=khilman@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-imx@nxp.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mediatek@lists.infradead.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=liviu.dudau@arm.com \
    --cc=lorenzo.pieralisi@arm.com \
    --cc=matthias.bgg@gmail.com \
    --cc=mgorman@suse.de \
    --cc=mingo@redhat.com \
    --cc=nm@ti.com \
    --cc=orjan.eide@arm.com \
    --cc=patrick.bellasi@matbug.net \
    --cc=peterz@infradead.org \
    --cc=qperret@google.com \
    --cc=rjw@rjwysocki.net \
    --cc=robh@kernel.org \
    --cc=robin.murphy@arm.com \
    --cc=rostedt@goodmis.org \
    --cc=rui.zhang@intel.com \
    --cc=s.hauer@pengutronix.de \
    --cc=sboyd@kernel.org \
    --cc=shawnguo@kernel.org \
    --cc=steven.price@arm.com \
    --cc=sudeep.holla@arm.com \
    --cc=tomeu.vizoso@collabora.com \
    --cc=viresh.kumar@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.