From: Mark Zhang <nvmarkzhang-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: Terje Bergstrom <tbergstrom-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
Cc: thierry.reding-RM9K5IK7kjKj5M59NBduVrNAH6kLmebB@public.gmane.org,
airlied-cv59FeDIM0c@public.gmane.org,
dev-8ppwABl0HbeELgA04lAiVw@public.gmane.org,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org,
linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCHv4 0/8] Support for Tegra 2D hardware
Date: Wed, 26 Dec 2012 17:42:16 +0800 [thread overview]
Message-ID: <50DAC678.5060601@gmail.com> (raw)
In-Reply-To: <1356089964-5265-1-git-send-email-tbergstrom-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
Hi Terje,
I applied your patches on top of upstream 1224 kernel. Then I read the
codes. So here is my review comments(I use "git diff" to print out,
check below). I admit it's easy for me to not need to find the
corresponding lines in your 8 patch mails, but I've no idea whether it
is ok for you. If this makes you not feeling good, I'll do this in old
ways. Basically, I think in this diff output, there are filename/line
number/function name, so it should not be a hard work for you to
understand my comments.
P.S: I haven't finished the review so here is what I found today.
diff --git a/drivers/gpu/drm/tegra/gr2d.c b/drivers/gpu/drm/tegra/gr2d.c
index a936902..28954b3 100644
--- a/drivers/gpu/drm/tegra/gr2d.c
+++ b/drivers/gpu/drm/tegra/gr2d.c
@@ -247,6 +247,10 @@ static int __devinit gr2d_probe(struct
platform_device *dev)
{
int err;
struct gr2d *gr2d = NULL;
+ /* Cause drm_device is created in host1x driver. So
+ if host1x drivers loads after tegradrm, then in this
+ gr2d_probe function, this "drm_device" will be NULL.
+ How can we handle this? Defer driver probe? */
struct platform_device *drm_device =
host1x_drm_device(to_platform_device(dev->dev.parent));
struct tegradrm *tegradrm = platform_get_drvdata(drm_device);
@@ -273,6 +277,11 @@ static int __devinit gr2d_probe(struct
platform_device *dev)
gr2d->syncpt = host1x_syncpt_alloc(dev, 0);
if (!gr2d->syncpt) {
+ /* Do we really need this?
+ After "host1x_channel_alloc", the refcount of this
+ channel is 0. So calling host1x_channel_put here will
+ make the refcount going to negative.
+ I suppose we should call "host1x_free_channel" here. */
host1x_channel_put(gr2d->channel);
return -ENOMEM;
}
@@ -284,6 +293,7 @@ static int __devinit gr2d_probe(struct
platform_device *dev)
err = tegra_drm_register_client(tegradrm, &gr2d->client);
if (err)
+ /* Add "host1x_free_channel" */
return err;
platform_set_drvdata(dev, gr2d);
diff --git a/drivers/gpu/host1x/channel.c b/drivers/gpu/host1x/channel.c
index 3705cae..ed83b9e 100644
--- a/drivers/gpu/host1x/channel.c
+++ b/drivers/gpu/host1x/channel.c
@@ -95,6 +95,9 @@ struct host1x_channel *host1x_channel_alloc(struct
platform_device *pdev)
int max_channels = host1x->info.nb_channels;
int err;
+ /* Is it necessary to add mutex protection here?
+ I'm just wondering in a smp system, multiple host1x clients
+ may try to alloc their channels simultaneously... */
if (chindex > max_channels)
return NULL;
diff --git a/drivers/gpu/host1x/debug.c b/drivers/gpu/host1x/debug.c
index 86d5c70..f2bd5aa 100644
--- a/drivers/gpu/host1x/debug.c
+++ b/drivers/gpu/host1x/debug.c
@@ -164,6 +164,10 @@ static const struct file_operations
host1x_debug_fops = {
void host1x_debug_init(struct host1x *host1x)
{
+ /* I think it's better to set this directory name the same with
+ the driver's name -- defined in dev.c:
+ #define DRIVER_NAME "tegra-host1x"
+ */
struct dentry *de = debugfs_create_dir("tegra_host", NULL);
if (!de)
diff --git a/drivers/gpu/host1x/dev.c b/drivers/gpu/host1x/dev.c
index 07e8813..01ed10d 100644
--- a/drivers/gpu/host1x/dev.c
+++ b/drivers/gpu/host1x/dev.c
@@ -38,6 +38,7 @@
struct host1x *host1x;
+/* Called by drm unlocked ioctl function. So do we need a lock here? */
void host1x_syncpt_incr_byid(u32 id)
{
struct host1x_syncpt *sp = host1x->syncpt + id;
@@ -52,6 +53,7 @@ u32 host1x_syncpt_read_byid(u32 id)
}
EXPORT_SYMBOL(host1x_syncpt_read_byid);
+/* Called by drm unlocked ioctl function. So do we need a lock here? */
int host1x_syncpt_wait_byid(u32 id, u32 thresh, long timeout, u32 *value)
{
struct host1x_syncpt *sp = host1x->syncpt + id;
@@ -161,6 +163,8 @@ static int host1x_probe(struct platform_device *dev)
err = host1x_alloc_resources(host);
if (err) {
+ /* We don't have chip_ops right now, so here the
+ error message is somewhat improper */
dev_err(&dev->dev, "failed to init chip support\n");
goto fail;
}
@@ -175,6 +179,14 @@ static int host1x_probe(struct platform_device *dev)
if (!host->syncpt)
goto fail;
+ /* I suggest create a dedicate function for initializing nop sp.
+ First this "_host1x_syncpt_alloc" looks like an internal/static
+ function.
+ Then actually "host1x_syncpt_alloc" & "_host1x_syncpt_alloc" all
+ serve host1x client(e.g: gr2d) so it's not suitable to use them
+ for nop sp.
+ Just create a wrapper function to call _host1x_syncpt_alloc is OK.
+ This will make the code more readable. */
host->nop_sp = _host1x_syncpt_alloc(host, NULL, 0);
if (!host->nop_sp)
goto fail;
@@ -191,6 +203,7 @@ static int host1x_probe(struct platform_device *dev)
}
err = clk_prepare_enable(host->clk);
+ /* Add a dev_err here */
if (err < 0)
goto fail;
@@ -209,9 +222,12 @@ static int host1x_probe(struct platform_device *dev)
return 0;
fail:
+ /* host1x->syncpt isn't released here... */
+ /* host1x->intr isn't release here... */
+ /* Remove debugfs stuffs? */
host1x_syncpt_free(host->nop_sp);
host1x_unregister_drm_device(host);
- kfree(host);
+ kfree(host); /* not necessary*/
return err;
}
@@ -222,6 +238,7 @@ static int __exit host1x_remove(struct
platform_device *dev)
host1x_syncpt_deinit(host);
host1x_unregister_drm_device(host);
clk_disable_unprepare(host->clk);
+ /* Remove debugfs stuffs? */
return 0;
}
diff --git a/drivers/gpu/host1x/dev.h b/drivers/gpu/host1x/dev.h
index 05f8544..58f4c71 100644
--- a/drivers/gpu/host1x/dev.h
+++ b/drivers/gpu/host1x/dev.h
@@ -36,6 +36,7 @@ struct platform_device;
struct output;
struct host1x_channel_ops {
+ /* Seems no one uses this member. Remove it. */
const char *soc_name;
int (*init)(struct host1x_channel *,
struct host1x *,
@@ -125,12 +126,18 @@ struct host1x {
struct host1x_syncpt *syncpt;
struct host1x_intr intr;
struct platform_device *dev;
+
+ /* Seems no one uses this. Remove it. */
atomic_t clientid;
struct host1x_device_info info;
struct clk *clk;
+ /* Put some comments for this member.
+ For guys who're not familiar with nop sp, I think they'll
+ definitely get confused about this. */
struct host1x_syncpt *nop_sp;
+ /* Seems no one uses this member. Remove it. */
const char *soc_name;
struct host1x_channel_ops channel_op;
struct host1x_cdma_ops cdma_op;
@@ -140,6 +147,7 @@ struct host1x {
struct host1x_intr_ops intr_op;
struct host1x_channel chlist;
+
int allocated_channels;
struct dentry *debugfs;
diff --git a/drivers/gpu/host1x/intr.c b/drivers/gpu/host1x/intr.c
index efcb9be..e112001 100644
--- a/drivers/gpu/host1x/intr.c
+++ b/drivers/gpu/host1x/intr.c
@@ -329,8 +329,13 @@ void host1x_intr_deinit(struct host1x_intr *intr)
void host1x_intr_start(struct host1x_intr *intr, u32 hz)
{
struct host1x *host1x = intr_to_host1x(intr);
+
+ /* Why we need to lock here? Seems like this function is
+ called by host1x's probe only. */
mutex_lock(&intr->mutex);
+ /* "init_host_sync" has already been called in function
+ host1x_intr_init. Remove this line. */
host1x->intr_op.init_host_sync(intr);
host1x->intr_op.set_host_clocks_per_usec(intr,
DIV_ROUND_UP(hz, 1000000));
diff --git a/drivers/gpu/host1x/syncpt.c b/drivers/gpu/host1x/syncpt.c
index 07cbca5..9a234ad 100644
--- a/drivers/gpu/host1x/syncpt.c
+++ b/drivers/gpu/host1x/syncpt.c
@@ -309,6 +309,8 @@ struct host1x_syncpt *host1x_syncpt_init(struct
host1x *host)
struct host1x_syncpt *syncpt, *sp;
int i;
+ /* Consider devm_kzalloc here. Then you can forget the release
+ stuffs about this "syncpt". */
syncpt = sp = kzalloc(sizeof(struct host1x_syncpt) * host->info.nb_pts,
GFP_KERNEL);
if (!syncpt)
Mark
On 12/21/2012 07:39 PM, Terje Bergstrom wrote:
> This set of patches adds support for Tegra20 and Tegra30 host1x and
> 2D. It is based on linux-next-20121220.
>
> The fourth version has only few changes compared to previous version:
> * Fixed some sparse warnings
> * Fixed host1x Makefile to allow building as module
> * Fixed host1x module unload
> * Fixed tegradrm unload sequence
> * host1x creates DRM dummy device and tegradrm uses it for storing
> DRM related data.
>
> Some of the issues left open:
> * Register definitions still use static inline. There has been a
> debate about code style versus ability to use compiler type
> checking and code coverage analysis. There was no conclusion, so
> I left it as was.
> * Uses still CMA helpers. IOMMU support will replace CMA with host1x
> specific allocator.
>
> host1x is the driver that controls host1x hardware. It supports
> host1x command channels, synchronization, and memory management. It
> is sectioned into logical driver under drivers/gpu/host1x and
> physical driver under drivers/host1x/hw. The physical driver is
> compiled with the hardware headers of the particular host1x version.
>
> The hardware units are described (briefly) in the Tegra2 TRM. Wiki
> page https://gitorious.org/linux-tegra-drm/pages/Host1xIntroduction
> also contains a short description of the functionality.
>
> The patch set removes responsibility of host1x from tegradrm. At the
> same time, it moves all drm related infrastructure in
> drivers/gpu/drm/tegra/host1x.c to drm.c. To replace the host1x
> central device, host1x creates a dummy device for tegradrm to hang
> global data to. This is a break in responsibility split of tegradrm
> taking care of DRM and host1x driver taking care of host1x and
> clients, but this structure was insisted. I've kept creation of dummy
> device as a separate patch to illustrate the alternatives. It can be
> later squashed into other patches.
>
> The patch set adds 2D driver to tegradrm, which uses host1x for
> communicating with host1x to access sync points and channels. We
> expect to use the same infrastructure for other host1x clients, so
> we have kept host1x and tegradrm separate.
>
> The patch set also adds user space API to tegradrm for accessing
> host1x and 2D.
>
> Arto Merilainen (1):
> drm: tegra: Remove redundant host1x
>
> Terje Bergstrom (7):
> gpu: host1x: Add host1x driver
> gpu: host1x: Add syncpoint wait and interrupts
> gpu: host1x: Add channel support
> gpu: host1x: Add debug support
> ARM: tegra: Add board data and 2D clocks
> drm: tegra: Add gr2d device
> gpu: host1x: Register DRM dummy device
>
> arch/arm/mach-tegra/board-dt-tegra20.c | 1 +
> arch/arm/mach-tegra/board-dt-tegra30.c | 1 +
> arch/arm/mach-tegra/tegra20_clocks_data.c | 2 +-
> arch/arm/mach-tegra/tegra30_clocks_data.c | 1 +
> drivers/gpu/Makefile | 1 +
> drivers/gpu/drm/tegra/Kconfig | 2 +-
> drivers/gpu/drm/tegra/Makefile | 2 +-
> drivers/gpu/drm/tegra/dc.c | 26 +-
> drivers/gpu/drm/tegra/drm.c | 433 ++++++++++++++++++-
> drivers/gpu/drm/tegra/drm.h | 72 ++--
> drivers/gpu/drm/tegra/fb.c | 17 +-
> drivers/gpu/drm/tegra/gr2d.c | 309 ++++++++++++++
> drivers/gpu/drm/tegra/hdmi.c | 30 +-
> drivers/gpu/drm/tegra/host1x.c | 325 --------------
> drivers/gpu/host1x/Kconfig | 28 ++
> drivers/gpu/host1x/Makefile | 17 +
> drivers/gpu/host1x/cdma.c | 475 ++++++++++++++++++++
> drivers/gpu/host1x/cdma.h | 107 +++++
> drivers/gpu/host1x/channel.c | 137 ++++++
> drivers/gpu/host1x/channel.h | 64 +++
> drivers/gpu/host1x/cma.c | 117 +++++
> drivers/gpu/host1x/cma.h | 43 ++
> drivers/gpu/host1x/debug.c | 207 +++++++++
> drivers/gpu/host1x/debug.h | 49 +++
> drivers/gpu/host1x/dev.c | 242 +++++++++++
> drivers/gpu/host1x/dev.h | 167 ++++++++
> drivers/gpu/host1x/drm.c | 51 +++
> drivers/gpu/host1x/drm.h | 25 ++
> drivers/gpu/host1x/hw/Makefile | 6 +
> drivers/gpu/host1x/hw/cdma_hw.c | 480 +++++++++++++++++++++
> drivers/gpu/host1x/hw/cdma_hw.h | 37 ++
> drivers/gpu/host1x/hw/channel_hw.c | 147 +++++++
> drivers/gpu/host1x/hw/debug_hw.c | 399 +++++++++++++++++
> drivers/gpu/host1x/hw/host1x01.c | 46 ++
> drivers/gpu/host1x/hw/host1x01.h | 25 ++
> drivers/gpu/host1x/hw/host1x01_hardware.h | 150 +++++++
> drivers/gpu/host1x/hw/hw_host1x01_channel.h | 98 +++++
> drivers/gpu/host1x/hw/hw_host1x01_sync.h | 179 ++++++++
> drivers/gpu/host1x/hw/hw_host1x01_uclass.h | 130 ++++++
> drivers/gpu/host1x/hw/intr_hw.c | 178 ++++++++
> drivers/gpu/host1x/hw/syncpt_hw.c | 157 +++++++
> drivers/gpu/host1x/intr.c | 377 ++++++++++++++++
> drivers/gpu/host1x/intr.h | 106 +++++
> drivers/gpu/host1x/job.c | 618 +++++++++++++++++++++++++++
> drivers/gpu/host1x/memmgr.c | 174 ++++++++
> drivers/gpu/host1x/memmgr.h | 53 +++
> drivers/gpu/host1x/syncpt.c | 398 +++++++++++++++++
> drivers/gpu/host1x/syncpt.h | 134 ++++++
> drivers/video/Kconfig | 2 +
> include/drm/tegra_drm.h | 131 ++++++
> include/linux/host1x.h | 217 ++++++++++
> include/trace/events/host1x.h | 296 +++++++++++++
> 52 files changed, 7095 insertions(+), 394 deletions(-)
> create mode 100644 drivers/gpu/drm/tegra/gr2d.c
> delete mode 100644 drivers/gpu/drm/tegra/host1x.c
> create mode 100644 drivers/gpu/host1x/Kconfig
> create mode 100644 drivers/gpu/host1x/Makefile
> create mode 100644 drivers/gpu/host1x/cdma.c
> create mode 100644 drivers/gpu/host1x/cdma.h
> create mode 100644 drivers/gpu/host1x/channel.c
> create mode 100644 drivers/gpu/host1x/channel.h
> create mode 100644 drivers/gpu/host1x/cma.c
> create mode 100644 drivers/gpu/host1x/cma.h
> create mode 100644 drivers/gpu/host1x/debug.c
> create mode 100644 drivers/gpu/host1x/debug.h
> create mode 100644 drivers/gpu/host1x/dev.c
> create mode 100644 drivers/gpu/host1x/dev.h
> create mode 100644 drivers/gpu/host1x/drm.c
> create mode 100644 drivers/gpu/host1x/drm.h
> create mode 100644 drivers/gpu/host1x/hw/Makefile
> create mode 100644 drivers/gpu/host1x/hw/cdma_hw.c
> create mode 100644 drivers/gpu/host1x/hw/cdma_hw.h
> create mode 100644 drivers/gpu/host1x/hw/channel_hw.c
> create mode 100644 drivers/gpu/host1x/hw/debug_hw.c
> create mode 100644 drivers/gpu/host1x/hw/host1x01.c
> create mode 100644 drivers/gpu/host1x/hw/host1x01.h
> create mode 100644 drivers/gpu/host1x/hw/host1x01_hardware.h
> create mode 100644 drivers/gpu/host1x/hw/hw_host1x01_channel.h
> create mode 100644 drivers/gpu/host1x/hw/hw_host1x01_sync.h
> create mode 100644 drivers/gpu/host1x/hw/hw_host1x01_uclass.h
> create mode 100644 drivers/gpu/host1x/hw/intr_hw.c
> create mode 100644 drivers/gpu/host1x/hw/syncpt_hw.c
> create mode 100644 drivers/gpu/host1x/intr.c
> create mode 100644 drivers/gpu/host1x/intr.h
> create mode 100644 drivers/gpu/host1x/job.c
> create mode 100644 drivers/gpu/host1x/memmgr.c
> create mode 100644 drivers/gpu/host1x/memmgr.h
> create mode 100644 drivers/gpu/host1x/syncpt.c
> create mode 100644 drivers/gpu/host1x/syncpt.h
> create mode 100644 include/drm/tegra_drm.h
> create mode 100644 include/linux/host1x.h
> create mode 100644 include/trace/events/host1x.h
>
next prev parent reply other threads:[~2012-12-26 9:42 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-12-21 11:39 [PATCHv4 0/8] Support for Tegra 2D hardware Terje Bergstrom
2012-12-21 11:39 ` [PATCHv4 1/8] gpu: host1x: Add host1x driver Terje Bergstrom
2012-12-21 11:39 ` [PATCHv4 2/8] gpu: host1x: Add syncpoint wait and interrupts Terje Bergstrom
2012-12-21 11:39 ` [PATCHv4 3/8] gpu: host1x: Add channel support Terje Bergstrom
[not found] ` <1356089964-5265-4-git-send-email-tbergstrom-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-22 4:17 ` Steven Rostedt
[not found] ` <1356149848.5896.124.camel-f9ZlEuEWxVcJvu8Pb33WZ0EMvNT87kid@public.gmane.org>
2013-01-02 9:31 ` Terje Bergström
2013-01-02 7:40 ` Mark Zhang
2013-01-02 9:31 ` Terje Bergström
[not found] ` <50E3FE8C.8000309-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-01-02 9:31 ` Mark Zhang
[not found] ` <50E3FE57.5070702-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-01-02 9:43 ` Terje Bergström
2012-12-21 11:39 ` [PATCHv4 4/8] gpu: host1x: Add debug support Terje Bergstrom
[not found] ` <1356089964-5265-1-git-send-email-tbergstrom-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-21 11:39 ` [PATCHv4 5/8] drm: tegra: Remove redundant host1x Terje Bergstrom
[not found] ` <1356089964-5265-6-git-send-email-tbergstrom-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-21 14:36 ` Thierry Reding
2012-12-22 6:50 ` Terje Bergström
[not found] ` <50D55820.7030302-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-25 5:25 ` Stephen Warren
2012-12-28 21:21 ` Thierry Reding
2012-12-31 6:43 ` Terje Bergström
[not found] ` <20121221143614.GA16167-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org>
2013-01-03 17:58 ` Terje Bergström
2012-12-21 11:39 ` [PATCHv4 6/8] ARM: tegra: Add board data and 2D clocks Terje Bergstrom
2012-12-21 11:39 ` [PATCHv4 8/8] gpu: host1x: Register DRM dummy device Terje Bergstrom
[not found] ` <1356089964-5265-9-git-send-email-tbergstrom-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-21 13:53 ` Lucas Stach
2012-12-21 14:09 ` Thierry Reding
2012-12-21 13:50 ` [PATCHv4 0/8] Support for Tegra 2D hardware Lucas Stach
2012-12-21 13:57 ` Terje Bergström
[not found] ` <50D46AE4.8020308-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-21 13:59 ` Lucas Stach
2013-01-03 6:14 ` Terje Bergström
2012-12-26 9:42 ` Mark Zhang [this message]
2013-01-02 9:25 ` Terje Bergström
[not found] ` <50E3FD17.80402-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-01-03 2:36 ` Mark Zhang
2012-12-21 11:39 ` [PATCHv4 7/8] drm: tegra: Add gr2d device Terje Bergstrom
2012-12-28 9:14 ` [PATCHv4 0/8] Support for Tegra 2D hardware Mark Zhang
[not found] ` <50DD6311.9000002-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-01-02 9:42 ` Terje Bergström
[not found] ` <50E40106.4020406-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-01-03 3:31 ` Mark Zhang
[not found] ` <50E4FBAF.30700-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-01-03 5:50 ` Terje Bergström
[not found] ` <50E51C08.1020603-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-01-03 5:55 ` Mark Zhang
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=50DAC678.5060601@gmail.com \
--to=nvmarkzhang-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
--cc=airlied-cv59FeDIM0c@public.gmane.org \
--cc=dev-8ppwABl0HbeELgA04lAiVw@public.gmane.org \
--cc=dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=tbergstrom-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org \
--cc=thierry.reding-RM9K5IK7kjKj5M59NBduVrNAH6kLmebB@public.gmane.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).