From: Ingo Molnar <mingo@elte.hu>
To: Andi Kleen <ak@suse.de>
Cc: Jakub Jelinek <jakub@redhat.com>,
Arjan van de Ven <arjan@infradead.org>,
Christoph Hellwig <hch@infradead.org>,
Linus Torvalds <torvalds@osdl.org>,
lkml <linux-kernel@vger.kernel.org>,
Andrew Morton <akpm@osdl.org>, Matt Mackall <mpm@selenic.com>
Subject: Re: [patch 00/2] improve .text size on gcc 4.0 and newer compilers
Date: Fri, 30 Dec 2005 10:40:45 +0100 [thread overview]
Message-ID: <20051230094045.GA5799@elte.hu> (raw)
In-Reply-To: <p73oe2zexx9.fsf@verdi.suse.de>
* Andi Kleen <ak@suse.de> wrote:
> There are important exceptions like:
>
> - Code that really wants to do compile time constant resolution
> (like the x86 copy_*_user) and even throws linker errors when wrong.
> - Anything in a include file (otherwise it gets duplicated for
> every #include which can actually increase text size a lot)
> - There is some code which absolutely needs inline in the x86-64
> vsyscall code.
>
> But arguably they should be force_inline.
FYI, i picked up a couple of those in the 3rd patch that i sent
yesterday (see below too). That patch marks a handful of functions
__always_inline. This improved size by another 2-3%. Not bad from a
small patch:
asm-i386/apic.h | 6 +++---
asm-i386/bitops.h | 2 +-
asm-i386/current.h | 2 +-
asm-i386/string.h | 8 ++++----
linux/buffer_head.h | 10 +++++-----
linux/byteorder/swab.h | 18 +++++++++---------
linux/mm.h | 2 +-
linux/slab.h | 2 +-
8 files changed, 25 insertions(+), 25 deletions(-)
> I'm not quite sure I buy Ingo's original argument also. If he's only
> looking at text size then with the above fixed then he ideally would
> like to not inline anything (because except these exceptions above
> .text usually near always shrinks when not inlining). But that's not
> necessarily best for performance.
well, i think the numbers talk for themselves. Here are my latest
results:
----
The effect of the patches on x86, using a generic .config is:
text data bss dec hex filename
3286166 869852 387260 4543278 45532e vmlinux-orig
3194123 955168 387260 4536551 4538e7 vmlinux-inline
3119495 884960 387748 4392203 43050b vmlinux-inline+units
3051709 869380 387748 4308837 41bf65 vmlinux-inline+units+fixes
3049357 868928 387748 4306033 41b471 vmlinux-inline+units+fixes+capable
i.e. a 7.8% code-size reduction. Using a tiny .config gives:
text data bss dec hex filename
437271 77646 32192 547109 85925 vmlinux-orig
452694 77646 32192 562532 89564 vmlinux-inline
431891 77422 32128 541441 84301 vmlinux-inline+units
414803 77422 32128 524353 80041 vmlinux-inline+units+fixes
414020 77422 32128 523570 7fd32 vmlinux-inline+units+fixes+capable
or an 5.6% reduction.
i've also done test-builds with CC_OPTIMIZE_FOR_SIZE disabled:
text data bss dec hex filename
4080998 870384 387260 5338642 517612 vmlinux-orig
4084421 872024 387260 5343705 5189d9 vmlinux-inline
4010957 834048 387748 5232753 4fd871 vmlinux-inline+units
4010039 833112 387748 5230899 4fd133 vmlinux-inline+units+fixes
4007617 833120 387748 5228485 4fc7c5 vmlinux-inline+units+fixes+capable
or a 1.8% code size reduction.
Ingo
--------
Subject: mark a handful of inline functions as 'must inline'
this patch marks a number of functions as 'must inline' - so that they
get inlined even if optimizing for size. This patch gives another 2-3%
of size saved, when CONFIG_CC_OPTIMIZE_FOR_SIZE is enabled.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
----
include/asm-i386/apic.h | 6 +++---
include/asm-i386/bitops.h | 2 +-
include/asm-i386/current.h | 2 +-
include/asm-i386/string.h | 8 ++++----
include/linux/buffer_head.h | 10 +++++-----
include/linux/byteorder/swab.h | 18 +++++++++---------
include/linux/mm.h | 2 +-
include/linux/slab.h | 2 +-
8 files changed, 25 insertions(+), 25 deletions(-)
Index: linux-gcc.q/include/asm-i386/apic.h
===================================================================
--- linux-gcc.q.orig/include/asm-i386/apic.h
+++ linux-gcc.q/include/asm-i386/apic.h
@@ -49,17 +49,17 @@ static inline void lapic_enable(void)
* Basic functions accessing APICs.
*/
-static __inline void apic_write(unsigned long reg, unsigned long v)
+static __always_inline void apic_write(unsigned long reg, unsigned long v)
{
*((volatile unsigned long *)(APIC_BASE+reg)) = v;
}
-static __inline void apic_write_atomic(unsigned long reg, unsigned long v)
+static __always_inline void apic_write_atomic(unsigned long reg, unsigned long v)
{
xchg((volatile unsigned long *)(APIC_BASE+reg), v);
}
-static __inline unsigned long apic_read(unsigned long reg)
+static __always_inline unsigned long apic_read(unsigned long reg)
{
return *((volatile unsigned long *)(APIC_BASE+reg));
}
Index: linux-gcc.q/include/asm-i386/bitops.h
===================================================================
--- linux-gcc.q.orig/include/asm-i386/bitops.h
+++ linux-gcc.q/include/asm-i386/bitops.h
@@ -247,7 +247,7 @@ static inline int test_and_change_bit(in
static int test_bit(int nr, const volatile void * addr);
#endif
-static inline int constant_test_bit(int nr, const volatile unsigned long *addr)
+static __always_inline int constant_test_bit(int nr, const volatile unsigned long *addr)
{
return ((1UL << (nr & 31)) & (addr[nr >> 5])) != 0;
}
Index: linux-gcc.q/include/asm-i386/current.h
===================================================================
--- linux-gcc.q.orig/include/asm-i386/current.h
+++ linux-gcc.q/include/asm-i386/current.h
@@ -5,7 +5,7 @@
struct task_struct;
-static inline struct task_struct * get_current(void)
+static __always_inline struct task_struct * get_current(void)
{
return current_thread_info()->task;
}
Index: linux-gcc.q/include/asm-i386/string.h
===================================================================
--- linux-gcc.q.orig/include/asm-i386/string.h
+++ linux-gcc.q/include/asm-i386/string.h
@@ -201,7 +201,7 @@ __asm__ __volatile__(
return __res;
}
-static inline void * __memcpy(void * to, const void * from, size_t n)
+static __always_inline void * __memcpy(void * to, const void * from, size_t n)
{
int d0, d1, d2;
__asm__ __volatile__(
@@ -223,7 +223,7 @@ return (to);
* This looks ugly, but the compiler can optimize it totally,
* as the count is constant.
*/
-static inline void * __constant_memcpy(void * to, const void * from, size_t n)
+static __always_inline void * __constant_memcpy(void * to, const void * from, size_t n)
{
long esi, edi;
if (!n) return to;
@@ -367,7 +367,7 @@ return s;
* things 32 bits at a time even when we don't know the size of the
* area at compile-time..
*/
-static inline void * __constant_c_memset(void * s, unsigned long c, size_t count)
+static __always_inline void * __constant_c_memset(void * s, unsigned long c, size_t count)
{
int d0, d1;
__asm__ __volatile__(
@@ -416,7 +416,7 @@ extern char *strstr(const char *cs, cons
* This looks horribly ugly, but the compiler can optimize it totally,
* as we by now know that both pattern and count is constant..
*/
-static inline void * __constant_c_and_count_memset(void * s, unsigned long pattern, size_t count)
+static __always_inline void * __constant_c_and_count_memset(void * s, unsigned long pattern, size_t count)
{
switch (count) {
case 0:
Index: linux-gcc.q/include/linux/buffer_head.h
===================================================================
--- linux-gcc.q.orig/include/linux/buffer_head.h
+++ linux-gcc.q/include/linux/buffer_head.h
@@ -72,15 +72,15 @@ struct buffer_head {
* and buffer_foo() functions.
*/
#define BUFFER_FNS(bit, name) \
-static inline void set_buffer_##name(struct buffer_head *bh) \
+static __always_inline void set_buffer_##name(struct buffer_head *bh) \
{ \
set_bit(BH_##bit, &(bh)->b_state); \
} \
-static inline void clear_buffer_##name(struct buffer_head *bh) \
+static __always_inline void clear_buffer_##name(struct buffer_head *bh) \
{ \
clear_bit(BH_##bit, &(bh)->b_state); \
} \
-static inline int buffer_##name(const struct buffer_head *bh) \
+static __always_inline int buffer_##name(const struct buffer_head *bh) \
{ \
return test_bit(BH_##bit, &(bh)->b_state); \
}
@@ -89,11 +89,11 @@ static inline int buffer_##name(const st
* test_set_buffer_foo() and test_clear_buffer_foo()
*/
#define TAS_BUFFER_FNS(bit, name) \
-static inline int test_set_buffer_##name(struct buffer_head *bh) \
+static __always_inline int test_set_buffer_##name(struct buffer_head *bh)\
{ \
return test_and_set_bit(BH_##bit, &(bh)->b_state); \
} \
-static inline int test_clear_buffer_##name(struct buffer_head *bh) \
+static __always_inline int test_clear_buffer_##name(struct buffer_head *bh)\
{ \
return test_and_clear_bit(BH_##bit, &(bh)->b_state); \
} \
Index: linux-gcc.q/include/linux/byteorder/swab.h
===================================================================
--- linux-gcc.q.orig/include/linux/byteorder/swab.h
+++ linux-gcc.q/include/linux/byteorder/swab.h
@@ -130,34 +130,34 @@
#endif /* OPTIMIZE */
-static __inline__ __attribute_const__ __u16 __fswab16(__u16 x)
+static __always_inline __attribute_const__ __u16 __fswab16(__u16 x)
{
return __arch__swab16(x);
}
-static __inline__ __u16 __swab16p(const __u16 *x)
+static __always_inline __u16 __swab16p(const __u16 *x)
{
return __arch__swab16p(x);
}
-static __inline__ void __swab16s(__u16 *addr)
+static __always_inline void __swab16s(__u16 *addr)
{
__arch__swab16s(addr);
}
-static __inline__ __attribute_const__ __u32 __fswab32(__u32 x)
+static __always_inline __attribute_const__ __u32 __fswab32(__u32 x)
{
return __arch__swab32(x);
}
-static __inline__ __u32 __swab32p(const __u32 *x)
+static __always_inline __u32 __swab32p(const __u32 *x)
{
return __arch__swab32p(x);
}
-static __inline__ void __swab32s(__u32 *addr)
+static __always_inline void __swab32s(__u32 *addr)
{
__arch__swab32s(addr);
}
#ifdef __BYTEORDER_HAS_U64__
-static __inline__ __attribute_const__ __u64 __fswab64(__u64 x)
+static __always_inline __attribute_const__ __u64 __fswab64(__u64 x)
{
# ifdef __SWAB_64_THRU_32__
__u32 h = x >> 32;
@@ -167,11 +167,11 @@ static __inline__ __attribute_const__ __
return __arch__swab64(x);
# endif
}
-static __inline__ __u64 __swab64p(const __u64 *x)
+static __always_inline __u64 __swab64p(const __u64 *x)
{
return __arch__swab64p(x);
}
-static __inline__ void __swab64s(__u64 *addr)
+static __always_inline void __swab64s(__u64 *addr)
{
__arch__swab64s(addr);
}
Index: linux-gcc.q/include/linux/mm.h
===================================================================
--- linux-gcc.q.orig/include/linux/mm.h
+++ linux-gcc.q/include/linux/mm.h
@@ -507,7 +507,7 @@ static inline void set_page_links(struct
extern struct page *mem_map;
#endif
-static inline void *lowmem_page_address(struct page *page)
+static __always_inline void *lowmem_page_address(struct page *page)
{
return __va(page_to_pfn(page) << PAGE_SHIFT);
}
Index: linux-gcc.q/include/linux/slab.h
===================================================================
--- linux-gcc.q.orig/include/linux/slab.h
+++ linux-gcc.q/include/linux/slab.h
@@ -76,7 +76,7 @@ struct cache_sizes {
extern struct cache_sizes malloc_sizes[];
extern void *__kmalloc(size_t, gfp_t);
-static inline void *kmalloc(size_t size, gfp_t flags)
+static __always_inline void *kmalloc(size_t size, gfp_t flags)
{
if (__builtin_constant_p(size)) {
int i = 0;
next prev parent reply other threads:[~2005-12-30 9:41 UTC|newest]
Thread overview: 210+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-12-28 11:46 [patch 00/2] improve .text size on gcc 4.0 and newer compilers Ingo Molnar
2005-12-28 19:17 ` Linus Torvalds
2005-12-28 19:34 ` Arjan van de Ven
2005-12-28 21:02 ` Linus Torvalds
2005-12-28 21:17 ` Arjan van de Ven
2005-12-28 21:23 ` Ingo Molnar
2005-12-28 21:48 ` Ingo Molnar
2005-12-28 23:56 ` Krzysztof Halasa
2005-12-29 7:41 ` Ingo Molnar
2005-12-29 8:02 ` Dave Jones
2005-12-29 19:44 ` Krzysztof Halasa
2005-12-29 4:11 ` Andrew Morton
2005-12-29 7:32 ` Ingo Molnar
2005-12-29 14:58 ` Horst von Brand
2005-12-29 15:40 ` Adrian Bunk
2005-12-29 17:41 ` Linus Torvalds
2005-12-29 18:42 ` Arjan van de Ven
2005-12-29 18:45 ` Arjan van de Ven
2005-12-29 20:19 ` Ingo Molnar
2005-12-29 22:20 ` Matt Mackall
2005-12-29 20:28 ` Dave Jones
2005-12-29 20:49 ` Linus Torvalds
2005-12-29 21:25 ` Linus Torvalds
[not found] ` <20051229224839.GA12247@elte.hu>
2005-12-29 22:58 ` Arjan van de Ven
2005-12-30 2:03 ` Tim Schmielau
2005-12-30 2:15 ` Tim Schmielau
2005-12-30 7:49 ` Ingo Molnar
2005-12-31 14:38 ` Adrian Bunk
2005-12-31 14:45 ` Ingo Molnar
2005-12-31 15:08 ` Adrian Bunk
2006-01-02 10:37 ` Ingo Molnar
2006-01-02 10:48 ` Arjan van de Ven
2006-01-02 13:43 ` Adrian Bunk
2006-01-02 14:05 ` Ingo Molnar
2006-01-02 15:01 ` Adrian Bunk
2006-01-02 18:44 ` Krzysztof Halasa
2006-01-02 18:51 ` Arjan van de Ven
2006-01-02 19:49 ` Krzysztof Halasa
2006-01-02 19:54 ` Arjan van de Ven
2006-01-02 20:05 ` Krzysztof Halasa
2006-01-02 20:18 ` Jörn Engel
2006-01-02 22:23 ` Russell King
2006-01-02 23:55 ` Alan Cox
2006-01-03 3:59 ` Daniel Jacobowitz
2006-01-03 8:53 ` Russell King
2006-01-03 8:56 ` Arjan van de Ven
2006-01-03 9:00 ` Russell King
2006-01-03 9:10 ` Arjan van de Ven
2006-01-03 9:14 ` Vitaly Wool
2006-01-02 19:03 ` Andrew Morton
2006-01-02 19:17 ` Jakub Jelinek
2006-01-02 19:30 ` Andrew Morton
2006-01-02 19:41 ` Linus Torvalds
2006-01-02 19:53 ` Ingo Molnar
2006-01-02 20:28 ` Jakub Jelinek
2006-01-02 20:09 ` Ingo Molnar
2006-01-02 20:24 ` Andrew Morton
2006-01-02 20:40 ` Ingo Molnar
2006-01-02 20:30 ` Ingo Molnar
2006-01-02 19:12 ` Linus Torvalds
2006-01-02 19:59 ` Krzysztof Halasa
2006-01-02 20:13 ` Ingo Molnar
2006-01-02 21:00 ` Jan Engelhardt
2006-01-02 22:43 ` Linus Torvalds
2006-01-02 13:42 ` Adrian Bunk
2006-01-02 18:28 ` Andrew Morton
2006-01-02 18:49 ` Arjan van de Ven
2006-01-02 19:26 ` Jörn Engel
2006-01-02 21:51 ` Grant Coady
2006-01-02 22:03 ` Antonio Vargas
2006-01-02 22:56 ` Arjan van de Ven
2006-01-02 23:10 ` Grant Coady
2006-01-02 23:57 ` Alan Cox
2006-01-02 23:58 ` Grant Coady
2006-01-03 5:31 ` Nick Piggin
2006-01-03 23:40 ` Martin J. Bligh
2006-01-04 4:28 ` Matt Mackall
2006-01-04 5:51 ` Martin J. Bligh
2006-01-04 17:10 ` Matt Mackall
2006-01-04 22:37 ` Linus Torvalds
2006-01-05 0:55 ` Martin Bligh
2006-01-04 17:36 ` Zwane Mwaikambo
2005-12-31 3:51 ` Kurt Wall
2005-12-30 3:31 ` Nicolas Pitre
2005-12-29 22:41 ` userspace breakage Dave Jones
2005-12-29 21:23 ` Jeff V. Merkey
2005-12-29 23:42 ` Linus Torvalds
2005-12-29 22:17 ` Jeff V. Merkey
2005-12-30 0:10 ` Linus Torvalds
2005-12-29 23:54 ` Jeff V. Merkey
2005-12-30 0:32 ` Linus Torvalds
2005-12-30 14:45 ` Jeff V. Merkey
2005-12-30 16:17 ` Rik van Riel
2005-12-30 15:01 ` Jeff V. Merkey
2005-12-30 11:17 ` Bernd Petrovitsch
2005-12-30 14:59 ` Jeff V. Merkey
2005-12-30 20:22 ` Steven Rostedt
2005-12-30 21:26 ` Linus Torvalds
2005-12-30 23:49 ` Andrew Morton
2005-12-31 8:33 ` Arjan van de Ven
2005-12-31 15:30 ` Steven Rostedt
2005-12-31 16:40 ` Francois Romieu
2005-12-30 11:19 ` Bernd Petrovitsch
2005-12-30 14:53 ` Jeff V. Merkey
2005-12-30 17:17 ` Bernd Petrovitsch
2005-12-29 22:47 ` Ismail Donmez
2005-12-29 22:56 ` Linus Torvalds
2005-12-29 23:03 ` Dave Jones
2006-01-03 20:28 ` Greg KH
2006-01-03 20:37 ` Dave Jones
2006-01-04 23:00 ` Paolo Ciarrocchi
2006-01-05 4:42 ` Greg KH
2005-12-29 23:25 ` Adrian Bunk
2005-12-29 23:52 ` Linus Torvalds
2005-12-30 8:09 ` Arjan van de Ven
2006-01-03 20:28 ` Greg KH
2005-12-29 23:07 ` Dmitry Torokhov
2005-12-30 0:38 ` Ryan Anderson
2005-12-30 0:46 ` Dave Jones
2005-12-30 1:05 ` Linus Torvalds
2005-12-30 1:19 ` Dave Airlie
2005-12-30 1:21 ` Dave Jones
2005-12-30 2:10 ` Jiri Slaby
2005-12-30 2:14 ` Dave Jones
2005-12-30 2:35 ` Jiri Slaby
2005-12-30 5:14 ` Theodore Ts'o
2005-12-30 0:49 ` Linus Torvalds
2005-12-30 3:47 ` [patch 00/2] improve .text size on gcc 4.0 and newer compilers Mark Lord
2005-12-30 3:56 ` Dave Jones
2005-12-30 3:57 ` Mark Lord
2005-12-30 4:02 ` Dave Jones
2005-12-30 4:11 ` Mark Lord
2005-12-30 4:14 ` Mark Lord
2005-12-30 4:20 ` Mark Lord
2005-12-30 5:04 ` Dave Jones
2005-12-29 23:16 ` Willy Tarreau
2005-12-30 8:05 ` Arjan van de Ven
2005-12-30 8:15 ` Willy Tarreau
2005-12-30 8:24 ` Arjan van de Ven
2005-12-30 9:20 ` Willy Tarreau
2005-12-30 13:38 ` Adrian Bunk
2005-12-30 8:33 ` Jesper Juhl
2005-12-30 9:28 ` Willy Tarreau
2005-12-30 9:37 ` Jesper Juhl
2005-12-30 9:38 ` Willy Tarreau
2005-12-30 19:53 ` Alistair John Strachan
2005-12-29 7:49 ` Arjan van de Ven
2005-12-29 15:01 ` Horst von Brand
2005-12-30 15:28 ` Alan Cox
2005-12-30 20:59 ` Adrian Bunk
2005-12-30 22:12 ` Matt Mackall
2005-12-30 23:54 ` Adrian Bunk
2005-12-31 9:20 ` Arjan van de Ven
2005-12-29 14:38 ` Christoph Hellwig
2005-12-29 14:54 ` Arjan van de Ven
2005-12-29 15:35 ` Adrian Bunk
2005-12-29 15:38 ` Arjan van de Ven
2005-12-29 15:42 ` Jakub Jelinek
2005-12-29 19:14 ` Adrian Bunk
2005-12-30 9:28 ` Andi Kleen
2005-12-30 9:40 ` Ingo Molnar [this message]
2005-12-30 10:14 ` Ingo Molnar
2005-12-30 13:31 ` Adrian Bunk
2005-12-30 14:08 ` Christian Trefzer
2005-12-30 10:25 ` Andi Kleen
2005-12-29 0:37 ` Rogério Brito
2006-01-03 3:36 ` Daniel Jacobowitz
2005-12-29 4:38 ` Adrian Bunk
2005-12-29 7:59 ` Ingo Molnar
2005-12-29 13:52 ` Adrian Bunk
2005-12-29 19:57 ` Horst von Brand
2005-12-29 20:25 ` Ingo Molnar
2005-12-31 15:22 ` Adrian Bunk
-- strict thread matches above, loose matches on Subject: below --
2006-01-05 0:55 Chuck Ebbert
2006-01-05 1:07 ` Martin Bligh
2006-01-05 12:19 ` Arjan van de Ven
2006-01-05 14:30 ` Jakub Jelinek
2006-01-05 16:55 ` Linus Torvalds
2006-01-05 18:42 ` Daniel Jacobowitz
2006-01-05 17:02 ` Matt Mackall
2006-01-05 17:59 ` Martin Bligh
2006-01-05 18:09 ` Arjan van de Ven
2006-01-05 18:43 ` Daniel Jacobowitz
2006-01-05 19:17 ` Linus Torvalds
2006-01-05 19:40 ` Linus Torvalds
2006-01-05 19:49 ` Martin Bligh
2006-01-05 20:13 ` Linus Torvalds
2006-01-05 20:15 ` Linus Torvalds
2006-01-05 23:30 ` Ingo Molnar
2006-01-05 23:54 ` Linus Torvalds
2006-01-06 0:15 ` Ingo Molnar
2006-01-06 0:27 ` Linus Torvalds
2006-01-06 0:54 ` Ingo Molnar
2006-01-06 0:02 ` Martin Bligh
2006-01-06 0:40 ` Ingo Molnar
2006-01-06 0:55 ` Martin Bligh
2006-01-06 1:48 ` Mitchell Blank Jr
2006-01-06 0:50 ` Mitchell Blank Jr
2006-01-06 0:58 ` Ingo Molnar
2006-01-06 1:22 ` Mitchell Blank Jr
2006-01-05 21:34 ` Matt Mackall
2006-01-05 22:08 ` Linus Torvalds
2006-01-05 22:36 ` Matt Mackall
2006-01-05 22:49 ` Martin Bligh
2006-01-05 23:02 ` Matt Mackall
2006-01-05 22:55 ` Ingo Molnar
2006-01-05 23:11 ` Matt Mackall
2006-01-05 23:27 ` Jesse Barnes
2006-01-05 23:58 ` Ingo Molnar
2006-01-05 21:32 ` Grzegorz Kulewski
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=20051230094045.GA5799@elte.hu \
--to=mingo@elte.hu \
--cc=ak@suse.de \
--cc=akpm@osdl.org \
--cc=arjan@infradead.org \
--cc=hch@infradead.org \
--cc=jakub@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mpm@selenic.com \
--cc=torvalds@osdl.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