public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Richard Henderson <rth@twiddle.net>
To: Matt Reppert <arashi@arashi.yi.org>
Cc: linux-kernel@vger.kernel.org
Subject: Re: 2.5.51 on Alpha oopses on mount
Date: Sun, 15 Dec 2002 10:57:22 -0800	[thread overview]
Message-ID: <20021215105722.A3831@twiddle.net> (raw)
In-Reply-To: <20021214123155.7383524c.arashi@arashi.yi.org>; from arashi@arashi.yi.org on Sat, Dec 14, 2002 at 12:31:55PM -0600

On Sat, Dec 14, 2002 at 12:31:55PM -0600, Matt Reppert wrote:
> >>PC;  fffffc00004a5240 <__copy_user+100/1d4>   <=====
> Trace; fffffc0000385920 <sys_mount+40/160>

This fault is expected and is _supposed_ to be handled by the
exception mechanism.  Why this stopped working, I don't know.

For grins, see if the following helps.  It's something that I
need for the shared-library modules anyway, and it eliminates
an extra variable from the problem.


r~



===== arch/alpha/kernel/traps.c 1.20 vs edited =====
--- 1.20/arch/alpha/kernel/traps.c	Fri Nov  8 05:48:56 2002
+++ edited/arch/alpha/kernel/traps.c	Sat Dec 14 11:24:11 2002
@@ -638,7 +638,7 @@
 got_exception:
 	/* Ok, we caught the exception, but we don't want it.  Is there
 	   someone to pass it along to?  */
-	if ((fixup = search_exception_table(pc, regs.gp)) != 0) {
+	if ((fixup = search_exception_table(pc)) != 0) {
 		unsigned long newpc;
 		newpc = fixup_exception(una_reg, fixup, pc);
 
===== arch/alpha/lib/clear_user.S 1.1 vs edited =====
--- 1.1/arch/alpha/lib/clear_user.S	Tue Feb  5 09:40:21 2002
+++ edited/arch/alpha/lib/clear_user.S	Sat Dec 14 11:12:14 2002
@@ -29,7 +29,7 @@
 #define EX(x,y...)			\
 	99: x,##y;			\
 	.section __ex_table,"a";	\
-	.gprel32 99b;			\
+	.long 99b - .;			\
 	lda $31, $exception-99b($31); 	\
 	.previous
 
@@ -80,7 +80,6 @@
 	ret	$31, ($28), 1	# .. e1 :
 
 __do_clear_user:
-	ldgp	$29,0($27)	# we do exceptions -- we need the gp.
 	and	$6, 7, $4	# e0    : find dest misalignment
 	beq	$0, $zerolength # .. e1 :
 	addq	$0, $4, $1	# e0    : bias counter
===== arch/alpha/lib/copy_user.S 1.1 vs edited =====
--- 1.1/arch/alpha/lib/copy_user.S	Tue Feb  5 09:40:21 2002
+++ edited/arch/alpha/lib/copy_user.S	Sat Dec 14 11:13:48 2002
@@ -30,29 +30,28 @@
 #define EXI(x,y...)			\
 	99: x,##y;			\
 	.section __ex_table,"a";	\
-	.gprel32 99b;			\
+	.long 99b - .;			\
 	lda $31, $exitin-99b($31);	\
 	.previous
 
 #define EXO(x,y...)			\
 	99: x,##y;			\
 	.section __ex_table,"a";	\
-	.gprel32 99b;			\
+	.long 99b - .;			\
 	lda $31, $exitout-99b($31);	\
 	.previous
 
 	.set noat
-	.align 3
+	.align 4
 	.globl __copy_user
 	.ent __copy_user
 __copy_user:
-	ldgp $29,0($27)			# we do exceptions -- we need the gp.
-	.prologue 1
+	.prologue 0
 	and $6,7,$3
 	beq $0,$35
 	beq $3,$36
 	subq $3,8,$3
-	.align 5
+	.align 4
 $37:
 	EXI( ldq_u $1,0($7) )
 	EXO( ldq_u $2,0($6) )
@@ -73,7 +72,7 @@
 	beq $1,$43
 	beq $4,$48
 	EXI( ldq_u $3,0($7) )
-	.align 5
+	.align 4
 $50:
 	EXI( ldq_u $2,8($7) )
 	subq $4,8,$4
@@ -88,7 +87,7 @@
 	bne $4,$50
 $48:
 	beq $0,$41
-	.align 5
+	.align 4
 $57:
 	EXI( ldq_u $1,0($7) )
 	EXO( ldq_u $2,0($6) )
@@ -105,7 +104,7 @@
 	.align 4
 $43:
 	beq $4,$65
-	.align 5
+	.align 4
 $66:
 	EXI( ldq $1,0($7) )
 	subq $4,8,$4
===== arch/alpha/lib/ev6-clear_user.S 1.1 vs edited =====
--- 1.1/arch/alpha/lib/ev6-clear_user.S	Tue Feb  5 09:40:22 2002
+++ edited/arch/alpha/lib/ev6-clear_user.S	Sat Dec 14 11:14:24 2002
@@ -47,7 +47,7 @@
 #define EX(x,y...)			\
 	99: x,##y;			\
 	.section __ex_table,"a";	\
-	.gprel32 99b;			\
+	.long 99b - .;			\
 	lda $31, $exception-99b($31); 	\
 	.previous
 
@@ -62,9 +62,6 @@
 
 				# Pipeline info : Slotting & Comments
 __do_clear_user:
-	ldgp	$29,0($27)	# we do exceptions -- we need the gp.
-				# Macro instruction becomes ldah/lda
-				# .. .. E  E	:
 	and	$6, 7, $4	# .. E  .. ..	: find dest head misalignment
 	beq	$0, $zerolength # U  .. .. ..	:  U L U L
 
===== arch/alpha/lib/ev6-copy_user.S 1.1 vs edited =====
--- 1.1/arch/alpha/lib/ev6-copy_user.S	Tue Feb  5 09:40:22 2002
+++ edited/arch/alpha/lib/ev6-copy_user.S	Sat Dec 14 11:14:59 2002
@@ -41,14 +41,14 @@
 #define EXI(x,y...)			\
 	99: x,##y;			\
 	.section __ex_table,"a";	\
-	.gprel32 99b;			\
+	.long 99b - .;			\
 	lda $31, $exitin-99b($31);	\
 	.previous
 
 #define EXO(x,y...)			\
 	99: x,##y;			\
 	.section __ex_table,"a";	\
-	.gprel32 99b;			\
+	.long 99b - .;			\
 	lda $31, $exitout-99b($31);	\
 	.previous
 
@@ -58,10 +58,7 @@
 	.ent __copy_user
 				# Pipeline info: Slotting & Comments
 __copy_user:
-	ldgp $29,0($27)		# we do exceptions -- we need the gp.
-				# Macro instruction becomes ldah/lda
-				# .. .. E  E
-	.prologue 1
+	.prologue 0
 	subq $0, 32, $1		# .. E  .. ..	: Is this going to be a small copy?
 	beq $0, $zerolength	# U  .. .. ..	: U L U L
 
===== arch/alpha/lib/ev6-strncpy_from_user.S 1.2 vs edited =====
--- 1.2/arch/alpha/lib/ev6-strncpy_from_user.S	Thu Aug  8 12:28:01 2002
+++ edited/arch/alpha/lib/ev6-strncpy_from_user.S	Sat Dec 14 11:16:49 2002
@@ -34,7 +34,7 @@
 #define EX(x,y...)			\
 	99: x,##y;			\
 	.section __ex_table,"a";	\
-	.gprel32 99b;			\
+	.long 99b - .;			\
 	lda $31, $exception-99b($0); 	\
 	.previous
 
@@ -46,11 +46,10 @@
 	.globl __strncpy_from_user
 	.ent __strncpy_from_user
 	.frame $30, 0, $26
-	.prologue 1
+	.prologue 0
 
 	.align 4
 __strncpy_from_user:
-	ldgp	$29, 0($27)	# E E : becomes 2 instructions (for exceptions)
 	and	a0, 7, t3	# E : find dest misalignment
 	beq	a2, $zerolength	# U :
 
===== arch/alpha/lib/ev67-strlen_user.S 1.2 vs edited =====
--- 1.2/arch/alpha/lib/ev67-strlen_user.S	Thu Aug  8 12:28:01 2002
+++ edited/arch/alpha/lib/ev67-strlen_user.S	Sat Dec 14 11:15:49 2002
@@ -30,7 +30,7 @@
 #define EX(x,y...)			\
 	99: x,##y;			\
 	.section __ex_table,"a";	\
-	.gprel32 99b;			\
+	.long 99b - .;			\
 	lda v0, $exception-99b(zero);	\
 	.previous
 
@@ -56,9 +56,7 @@
 
 	.align 4
 __strnlen_user:
-	ldgp	$29,0($27)	# E E : we do exceptions -- we need the gp.
-				/* Decomposes into lda/ldah */
-	.prologue 1
+	.prologue 0
 	EX( ldq_u t0, 0(a0) )	# L : load first quadword (a0 may be misaligned)
 	lda     t1, -1(zero)	# E :
 
===== arch/alpha/lib/strlen_user.S 1.2 vs edited =====
--- 1.2/arch/alpha/lib/strlen_user.S	Thu Aug  8 12:28:01 2002
+++ edited/arch/alpha/lib/strlen_user.S	Sat Dec 14 11:16:04 2002
@@ -19,7 +19,7 @@
 #define EX(x,y...)			\
 	99: x,##y;			\
 	.section __ex_table,"a";	\
-	.gprel32 99b;			\
+	.long 99b - .;			\
 	lda v0, $exception-99b(zero);	\
 	.previous
 
@@ -42,8 +42,7 @@
 
 	.align 3
 __strnlen_user:
-	ldgp	$29,0($27)	# we do exceptions -- we need the gp.
-	.prologue 1
+	.prologue 0
 
 	EX( ldq_u t0, 0(a0) )	# load first quadword (a0 may be misaligned)
 	lda     t1, -1(zero)
===== arch/alpha/lib/strncpy_from_user.S 1.2 vs edited =====
--- 1.2/arch/alpha/lib/strncpy_from_user.S	Thu Aug  8 12:28:01 2002
+++ edited/arch/alpha/lib/strncpy_from_user.S	Sat Dec 14 11:17:01 2002
@@ -19,7 +19,7 @@
 #define EX(x,y...)			\
 	99: x,##y;			\
 	.section __ex_table,"a";	\
-	.gprel32 99b;			\
+	.long 99b - .;			\
 	lda $31, $exception-99b($0); 	\
 	.previous
 
@@ -31,7 +31,7 @@
 	.globl __strncpy_from_user
 	.ent __strncpy_from_user
 	.frame $30, 0, $26
-	.prologue 1
+	.prologue 0
 
 	.align 3
 $aligned:
@@ -100,8 +100,6 @@
 	/*** The Function Entry Point ***/
 	.align 3
 __strncpy_from_user:
-	ldgp	$29, 0($27)	# we do exceptions -- we need the gp.
-
 	mov	a0, v0		# save the string start
 	beq	a2, $zerolength
 
===== arch/alpha/mm/extable.c 1.2 vs edited =====
--- 1.2/arch/alpha/mm/extable.c	Mon Feb  4 23:40:23 2002
+++ edited/arch/alpha/mm/extable.c	Sat Dec 14 11:23:06 2002
@@ -12,21 +12,17 @@
 static inline unsigned
 search_one_table(const struct exception_table_entry *first,
 		 const struct exception_table_entry *last,
-		 signed long value)
+		 unsigned long value)
 {
-	/* Abort early if the search value is out of range.  */
-	if (value != (signed int)value)
-		return 0;
-
         while (first <= last) {
 		const struct exception_table_entry *mid;
-		long diff;
+		unsigned long mid_value;
 
 		mid = (last - first) / 2 + first;
-		diff = mid->insn - value;
-                if (diff == 0)
+		mid_value = (unsigned long)&mid->insn + mid->insn;
+                if (mid_value == value)
                         return mid->fixup.unit;
-                else if (diff < 0)
+                else if (mid_value < value)
                         first = mid+1;
                 else
                         last = mid-1;
@@ -34,48 +30,13 @@
         return 0;
 }
 
-register unsigned long gp __asm__("$29");
-
-static unsigned
-search_exception_table_without_gp(unsigned long addr)
-{
-	unsigned ret;
-
-#ifndef CONFIG_MODULES
-	/* There is only the kernel to search.  */
-	ret = search_one_table(__start___ex_table, __stop___ex_table - 1,
-			       addr - gp);
-#else
-	extern spinlock_t modlist_lock;
-	unsigned long flags;
-	/* The kernel is the last "module" -- no need to treat it special. */
-	struct module *mp;
-
-	ret = 0;
-	spin_lock_irqsave(&modlist_lock, flags);
-	for (mp = module_list; mp ; mp = mp->next) {
-		if (!mp->ex_table_start || !(mp->flags&(MOD_RUNNING|MOD_INITIALIZING)))
-			continue;
-		ret = search_one_table(mp->ex_table_start,
-				       mp->ex_table_end - 1, addr - mp->gp);
-		if (ret)
-			break;
-	}
-	spin_unlock_irqrestore(&modlist_lock, flags);
-#endif
-
-	return ret;
-}
-
 unsigned
-search_exception_table(unsigned long addr, unsigned long exc_gp)
+search_exception_table(unsigned long addr)
 {
 	unsigned ret;
 
 #ifndef CONFIG_MODULES
-	ret = search_one_table(__start___ex_table, __stop___ex_table - 1,
-			       addr - exc_gp);
-	if (ret) return ret;
+	ret = search_one_table(__start___ex_table, __stop___ex_table-1, addr);
 #else
 	extern spinlock_t modlist_lock;
 	unsigned long flags;
@@ -88,25 +49,12 @@
 		if (!mp->ex_table_start || !(mp->flags&(MOD_RUNNING|MOD_INITIALIZING)))
 			continue;
 		ret = search_one_table(mp->ex_table_start,
-				       mp->ex_table_end - 1, addr - exc_gp);
+				       mp->ex_table_end - 1, addr);
 		if (ret)
 			break;
 	}
 	spin_unlock_irqrestore(&modlist_lock, flags);
-	if (ret) return ret;
 #endif
 
-	/*
-	 * The search failed with the exception gp. To be safe, try the
-	 * old method before giving up.
-	 */
-	ret = search_exception_table_without_gp(addr);
-	if (ret) {
-		printk(KERN_ALERT "%s: [%lx] EX_TABLE search fail with"
-		       "exc frame GP, success with raw GP\n",
-		       current->comm, addr);
-		return ret;
-	}
-
-	return 0;
+	return ret;
 }
===== arch/alpha/mm/fault.c 1.8 vs edited =====
--- 1.8/arch/alpha/mm/fault.c	Wed Oct 30 10:42:09 2002
+++ edited/arch/alpha/mm/fault.c	Sat Dec 14 11:23:31 2002
@@ -176,7 +176,7 @@
 
  no_context:
 	/* Are we prepared to handle this fault as an exception?  */
-	if ((fixup = search_exception_table(regs->pc, regs->gp)) != 0) {
+	if ((fixup = search_exception_table(regs->pc)) != 0) {
 		unsigned long newpc;
 		newpc = fixup_exception(dpf_reg, fixup, regs->pc);
 		regs->pc = newpc;
===== include/asm-alpha/uaccess.h 1.2 vs edited =====
--- 1.2/include/asm-alpha/uaccess.h	Mon Feb 11 05:42:53 2002
+++ edited/include/asm-alpha/uaccess.h	Sat Dec 14 11:18:49 2002
@@ -126,7 +126,7 @@
 	__asm__("1: ldq %0,%2\n"			\
 	"2:\n"						\
 	".section __ex_table,\"a\"\n"			\
-	"	.gprel32 1b\n"				\
+	"	.long 1b - .\n"				\
 	"	lda %0, 2b-1b(%1)\n"			\
 	".previous"					\
 		: "=r"(__gu_val), "=r"(__gu_err)	\
@@ -136,7 +136,7 @@
 	__asm__("1: ldl %0,%2\n"			\
 	"2:\n"						\
 	".section __ex_table,\"a\"\n"			\
-	"	.gprel32 1b\n"				\
+	"	.long 1b - .\n"				\
 	"	lda %0, 2b-1b(%1)\n"			\
 	".previous"					\
 		: "=r"(__gu_val), "=r"(__gu_err)	\
@@ -149,7 +149,7 @@
 	__asm__("1: ldwu %0,%2\n"			\
 	"2:\n"						\
 	".section __ex_table,\"a\"\n"			\
-	"	.gprel32 1b\n"				\
+	"	.long 1b - .\n"				\
 	"	lda %0, 2b-1b(%1)\n"			\
 	".previous"					\
 		: "=r"(__gu_val), "=r"(__gu_err)	\
@@ -159,7 +159,7 @@
 	__asm__("1: ldbu %0,%2\n"			\
 	"2:\n"						\
 	".section __ex_table,\"a\"\n"			\
-	"	.gprel32 1b\n"				\
+	"	.long 1b - .\n"				\
 	"	lda %0, 2b-1b(%1)\n"			\
 	".previous"					\
 		: "=r"(__gu_val), "=r"(__gu_err)	\
@@ -178,10 +178,10 @@
 	"	or %0,%1,%0\n"						\
 	"3:\n"								\
 	".section __ex_table,\"a\"\n"					\
-	"	.gprel32 1b\n"						\
+	"	.long 1b - .\n"						\
 	"	lda %0, 3b-1b(%2)\n"					\
-	"	.gprel32 2b\n"						\
-	"	lda %0, 2b-1b(%2)\n"					\
+	"	.long 2b - .\n"						\
+	"	lda %0, 3b-2b(%2)\n"					\
 	".previous"							\
 		: "=&r"(__gu_val), "=&r"(__gu_tmp), "=r"(__gu_err)	\
 		: "r"(addr), "2"(__gu_err));				\
@@ -192,7 +192,7 @@
 	"	extbl %0,%2,%0\n"					\
 	"2:\n"								\
 	".section __ex_table,\"a\"\n"					\
-	"	.gprel32 1b\n"						\
+	"	.long 1b - .\n"						\
 	"	lda %0, 2b-1b(%1)\n"					\
 	".previous"							\
 		: "=&r"(__gu_val), "=r"(__gu_err)			\
@@ -240,7 +240,7 @@
 __asm__ __volatile__("1: stq %r2,%1\n"				\
 	"2:\n"							\
 	".section __ex_table,\"a\"\n"				\
-	"	.gprel32 1b\n"					\
+	"	.long 1b - .\n"					\
 	"	lda $31,2b-1b(%0)\n"				\
 	".previous"						\
 		: "=r"(__pu_err)				\
@@ -250,7 +250,7 @@
 __asm__ __volatile__("1: stl %r2,%1\n"				\
 	"2:\n"							\
 	".section __ex_table,\"a\"\n"				\
-	"	.gprel32 1b\n"					\
+	"	.long 1b - .\n"					\
 	"	lda $31,2b-1b(%0)\n"				\
 	".previous"						\
 		: "=r"(__pu_err)				\
@@ -263,7 +263,7 @@
 __asm__ __volatile__("1: stw %r2,%1\n"				\
 	"2:\n"							\
 	".section __ex_table,\"a\"\n"				\
-	"	.gprel32 1b\n"					\
+	"	.long 1b - .\n"					\
 	"	lda $31,2b-1b(%0)\n"				\
 	".previous"						\
 		: "=r"(__pu_err)				\
@@ -273,7 +273,7 @@
 __asm__ __volatile__("1: stb %r2,%1\n"				\
 	"2:\n"							\
 	".section __ex_table,\"a\"\n"				\
-	"	.gprel32 1b\n"					\
+	"	.long 1b - .\n"					\
 	"	lda $31,2b-1b(%0)\n"				\
 	".previous"						\
 		: "=r"(__pu_err)				\
@@ -298,13 +298,13 @@
 	"4:	stq_u %1,0(%5)\n"				\
 	"5:\n"							\
 	".section __ex_table,\"a\"\n"				\
-	"	.gprel32 1b\n"					\
+	"	.long 1b - .\n"					\
 	"	lda $31, 5b-1b(%0)\n"				\
-	"	.gprel32 2b\n"					\
+	"	.long 2b - .\n"					\
 	"	lda $31, 5b-2b(%0)\n"				\
-	"	.gprel32 3b\n"					\
+	"	.long 3b - .\n"					\
 	"	lda $31, 5b-3b(%0)\n"				\
-	"	.gprel32 4b\n"					\
+	"	.long 4b - .\n"					\
 	"	lda $31, 5b-4b(%0)\n"				\
 	".previous"						\
 		: "=r"(__pu_err), "=&r"(__pu_tmp1),		\
@@ -324,9 +324,9 @@
 	"2:	stq_u %1,0(%4)\n"				\
 	"3:\n"							\
 	".section __ex_table,\"a\"\n"				\
-	"	.gprel32 1b\n"					\
+	"	.long 1b - .\n"					\
 	"	lda $31, 3b-1b(%0)\n"				\
-	"	.gprel32 2b\n"					\
+	"	.long 2b - .\n"					\
 	"	lda $31, 3b-2b(%0)\n"				\
 	".previous"						\
 		: "=r"(__pu_err),				\
@@ -356,7 +356,7 @@
 	register long __cu_len __asm__("$0") = len;
 
 	__asm__ __volatile__(
-		"jsr $28,(%3),__copy_user\n\tldgp $29,0($28)"
+		"jsr $28,(%3),__copy_user"
 		: "=r" (__cu_len), "=r" (__cu_from), "=r" (__cu_to), "=r"(pv)
 		: "0" (__cu_len), "1" (__cu_from), "2" (__cu_to), "3"(pv)
 		: "$1","$2","$3","$4","$5","$28","memory");
@@ -373,7 +373,7 @@
 		register const void * __cu_from __asm__("$7") = from;
 		register long __cu_len __asm__("$0") = len;
 		__asm__ __volatile__(
-			"jsr $28,(%3),__copy_user\n\tldgp $29,0($28)"
+			"jsr $28,(%3),__copy_user"
 			: "=r"(__cu_len), "=r"(__cu_from), "=r"(__cu_to),
 			  "=r" (pv)
 			: "0" (__cu_len), "1" (__cu_from), "2" (__cu_to), 
@@ -413,7 +413,7 @@
 	register void * __cl_to __asm__("$6") = to;
 	register long __cl_len __asm__("$0") = len;
 	__asm__ __volatile__(
-		"jsr $28,(%2),__do_clear_user\n\tldgp $29,0($28)"
+		"jsr $28,(%2),__do_clear_user"
 		: "=r"(__cl_len), "=r"(__cl_to), "=r"(pv)
 		: "0"(__cl_len), "1"(__cl_to), "2"(pv)
 		: "$1","$2","$3","$4","$5","$28","memory");
@@ -428,7 +428,7 @@
 		register void * __cl_to __asm__("$6") = to;
 		register long __cl_len __asm__("$0") = len;
 		__asm__ __volatile__(
-			"jsr $28,(%2),__do_clear_user\n\tldgp $29,0($28)"
+			"jsr $28,(%2),__do_clear_user"
 			: "=r"(__cl_len), "=r"(__cl_to), "=r"(pv)
 			: "0"(__cl_len), "1"(__cl_to), "2"(pv)
 			: "$1","$2","$3","$4","$5","$28","memory");
@@ -471,7 +471,7 @@
 /*
  * About the exception table:
  *
- * - insn is a 32-bit offset off of the kernel's or module's gp.
+ * - insn is a 32-bit pc-relative offset from the faulting insn.
  * - nextinsn is a 16-bit offset off of the faulting instruction
  *   (not off of the *next* instruction as branches are).
  * - errreg is the register in which to place -EFAULT.
@@ -502,7 +502,7 @@
 };
 
 /* Returns 0 if exception not found and fixup.unit otherwise.  */
-extern unsigned search_exception_table(unsigned long, unsigned long);
+extern unsigned search_exception_table(unsigned long);
 
 /* Returns the new pc */
 #define fixup_exception(map_reg, fixup_unit, pc)		\

  reply	other threads:[~2002-12-15 18:51 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-12-14 18:31 2.5.51 on Alpha oopses on mount Matt Reppert
2002-12-15 18:57 ` Richard Henderson [this message]
2002-12-15 21:01   ` Matt Reppert

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=20021215105722.A3831@twiddle.net \
    --to=rth@twiddle.net \
    --cc=arashi@arashi.yi.org \
    --cc=linux-kernel@vger.kernel.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