linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: stable@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: Daniel Borkmann <daniel@iogearbox.net>,
	Theodore Ts'o <tytso@mit.edu>,
	Stephan Mueller <smueller@chronox.de>,
	Hannes Frederic Sowa <hannes@stressinduktion.org>,
	mancha security <mancha1@zoho.com>,
	Mark Charlebois <charlebm@gmail.com>,
	Behan Webster <behanw@converseincode.com>,
	Herbert Xu <herbert@gondor.apana.org.au>,
	Sasha Levin <sashal@kernel.org>
Subject: [PATCH AUTOSEL 3.18 71/98] lib: make memzero_explicit more robust against dead store elimination
Date: Thu, 25 Oct 2018 10:18:26 -0400	[thread overview]
Message-ID: <20181025141853.214051-71-sashal@kernel.org> (raw)
In-Reply-To: <20181025141853.214051-1-sashal@kernel.org>

From: Daniel Borkmann <daniel@iogearbox.net>

[ Upstream commit 7829fb09a2b4268b30dd9bc782fa5ebee278b137 ]

In commit 0b053c951829 ("lib: memzero_explicit: use barrier instead
of OPTIMIZER_HIDE_VAR"), we made memzero_explicit() more robust in
case LTO would decide to inline memzero_explicit() and eventually
find out it could be elimiated as dead store.

While using barrier() works well for the case of gcc, recent efforts
from LLVMLinux people suggest to use llvm as an alternative to gcc,
and there, Stephan found in a simple stand-alone user space example
that llvm could nevertheless optimize and thus elimitate the memset().
A similar issue has been observed in the referenced llvm bug report,
which is regarded as not-a-bug.

Based on some experiments, icc is a bit special on its own, while it
doesn't seem to eliminate the memset(), it could do so with an own
implementation, and then result in similar findings as with llvm.

The fix in this patch now works for all three compilers (also tested
with more aggressive optimization levels). Arguably, in the current
kernel tree it's more of a theoretical issue, but imho, it's better
to be pedantic about it.

It's clearly visible with gcc/llvm though, with the below code: if we
would have used barrier() only here, llvm would have omitted clearing,
not so with barrier_data() variant:

  static inline void memzero_explicit(void *s, size_t count)
  {
    memset(s, 0, count);
    barrier_data(s);
  }

  int main(void)
  {
    char buff[20];
    memzero_explicit(buff, sizeof(buff));
    return 0;
  }

  $ gcc -O2 test.c
  $ gdb a.out
  (gdb) disassemble main
  Dump of assembler code for function main:
   0x0000000000400400  <+0>: lea   -0x28(%rsp),%rax
   0x0000000000400405  <+5>: movq  $0x0,-0x28(%rsp)
   0x000000000040040e <+14>: movq  $0x0,-0x20(%rsp)
   0x0000000000400417 <+23>: movl  $0x0,-0x18(%rsp)
   0x000000000040041f <+31>: xor   %eax,%eax
   0x0000000000400421 <+33>: retq
  End of assembler dump.

  $ clang -O2 test.c
  $ gdb a.out
  (gdb) disassemble main
  Dump of assembler code for function main:
   0x00000000004004f0  <+0>: xorps  %xmm0,%xmm0
   0x00000000004004f3  <+3>: movaps %xmm0,-0x18(%rsp)
   0x00000000004004f8  <+8>: movl   $0x0,-0x8(%rsp)
   0x0000000000400500 <+16>: lea    -0x18(%rsp),%rax
   0x0000000000400505 <+21>: xor    %eax,%eax
   0x0000000000400507 <+23>: retq
  End of assembler dump.

As gcc, clang, but also icc defines __GNUC__, it's sufficient to define
this in compiler-gcc.h only to be picked up. For a fallback or otherwise
unsupported compiler, we define it as a barrier. Similarly, for ecc which
does not support gcc inline asm.

Reference: https://llvm.org/bugs/show_bug.cgi?id=15495
Reported-by: Stephan Mueller <smueller@chronox.de>
Tested-by: Stephan Mueller <smueller@chronox.de>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Cc: Theodore Ts'o <tytso@mit.edu>
Cc: Stephan Mueller <smueller@chronox.de>
Cc: Hannes Frederic Sowa <hannes@stressinduktion.org>
Cc: mancha security <mancha1@zoho.com>
Cc: Mark Charlebois <charlebm@gmail.com>
Cc: Behan Webster <behanw@converseincode.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 include/linux/compiler-gcc.h   | 16 +++++++++++++++-
 include/linux/compiler-intel.h |  3 +++
 include/linux/compiler.h       |  4 ++++
 lib/string.c                   |  2 +-
 4 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
index 633716ef19b0..4d9e673bd76c 100644
--- a/include/linux/compiler-gcc.h
+++ b/include/linux/compiler-gcc.h
@@ -9,10 +9,24 @@
 		   + __GNUC_MINOR__ * 100 \
 		   + __GNUC_PATCHLEVEL__)
 
-
 /* Optimization barrier */
+
 /* The "volatile" is due to gcc bugs */
 #define barrier() __asm__ __volatile__("": : :"memory")
+/*
+ * This version is i.e. to prevent dead stores elimination on @ptr
+ * where gcc and llvm may behave differently when otherwise using
+ * normal barrier(): while gcc behavior gets along with a normal
+ * barrier(), llvm needs an explicit input variable to be assumed
+ * clobbered. The issue is as follows: while the inline asm might
+ * access any memory it wants, the compiler could have fit all of
+ * @ptr into memory registers instead, and since @ptr never escaped
+ * from that, it proofed that the inline asm wasn't touching any of
+ * it. This version works well with both compilers, i.e. we're telling
+ * the compiler that the inline asm absolutely may see the contents
+ * of @ptr. See also: https://llvm.org/bugs/show_bug.cgi?id=15495
+ */
+#define barrier_data(ptr) __asm__ __volatile__("": :"r"(ptr) :"memory")
 
 /*
  * This macro obfuscates arithmetic on a variable address so that gcc
diff --git a/include/linux/compiler-intel.h b/include/linux/compiler-intel.h
index ba147a1727e6..0c9a2f2c2802 100644
--- a/include/linux/compiler-intel.h
+++ b/include/linux/compiler-intel.h
@@ -13,9 +13,12 @@
 /* Intel ECC compiler doesn't support gcc specific asm stmts.
  * It uses intrinsics to do the equivalent things.
  */
+#undef barrier_data
 #undef RELOC_HIDE
 #undef OPTIMIZER_HIDE_VAR
 
+#define barrier_data(ptr) barrier()
+
 #define RELOC_HIDE(ptr, off)					\
   ({ unsigned long __ptr;					\
      __ptr = (unsigned long) (ptr);				\
diff --git a/include/linux/compiler.h b/include/linux/compiler.h
index 8cf7a33e1b72..78b27883744c 100644
--- a/include/linux/compiler.h
+++ b/include/linux/compiler.h
@@ -165,6 +165,10 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
 # define barrier() __memory_barrier()
 #endif
 
+#ifndef barrier_data
+# define barrier_data(ptr) barrier()
+#endif
+
 /* Unreachable code */
 #ifndef unreachable
 # define unreachable() do { } while (1)
diff --git a/lib/string.c b/lib/string.c
index 8e8a2e9e9522..de4bf3778958 100644
--- a/lib/string.c
+++ b/lib/string.c
@@ -699,7 +699,7 @@ EXPORT_SYMBOL(memset);
 void memzero_explicit(void *s, size_t count)
 {
 	memset(s, 0, count);
-	barrier();
+	barrier_data(s);
 }
 EXPORT_SYMBOL(memzero_explicit);
 
-- 
2.17.1


  parent reply	other threads:[~2018-10-25 14:20 UTC|newest]

Thread overview: 107+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-25 14:17 [PATCH AUTOSEL 3.18 01/98] dm thin: restore requested 'error_if_no_space' setting on OODS to WRITE transition Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 02/98] ocfs2: fix journal commit deadlock in ocfs2_convert_inline_data_to_extents Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 03/98] s390/kvm: REPLACE barrier fixup with READ_ONCE Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 04/98] USB: qcserial: Fix support for HP lt4112 LTE/HSPA+ Gobi 4G Modem Sasha Levin
2018-10-26  8:49   ` Johan Hovold
2018-10-26  9:02     ` Bjørn Mork
2018-10-26  9:11       ` Johan Hovold
2018-10-26 10:59     ` Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 05/98] cxl: Fix issues when unmapping contexts Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 06/98] s390/ftrace/jprobes: Fix conflict between jprobes and function graph tracing Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 07/98] mmc: sdhci: restore behavior when setting VDD via external regulator Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 08/98] ARM: OMAP5 / DRA7: Fix HYP mode boot for thumb2 build Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 09/98] usb: gadget: gadgetfs: fix an oops in ep_write() Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 10/98] ahci_xgene: Fix the DMA state machine lockup for the ATA_CMD_PACKET PIO mode command Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 11/98] Revert "drm/i915: Fix mutex->owner inspection race under DEBUG_MUTEXES" Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 12/98] pinctrl: at91: fix null pointer dereference Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 13/98] PCI: Mark Atheros AR9580 to avoid bus reset Sasha Levin
2018-10-25 20:33   ` Tom Psyborg
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 14/98] ARM: shmobile: r8a7740: Instantiate GIC from C board code in legacy builds Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 15/98] usb: musb: Fix a few off-by-one lengths Sasha Levin
2018-10-26 10:47   ` Rasmus Villemoes
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 16/98] usb: gadget: f_uac1: access freed memory at f_audio_free_inst Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 17/98] usb: musb: Fix randconfig build issues for Kconfig options Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 18/98] usb: dwc2: gadget: kill requests with 'force' in s3c_hsotg_udc_stop() Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 19/98] phy-sun4i-usb: Change disconnect threshold value for sun6i Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 20/98] phy: phy-ti-pipe3: fix inconsistent enumeration of PCIe gen2 cards Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 21/98] iio: iio: Fix iio_channel_read return if channel havn't info Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 22/98] ARM: dra7xx: Fix counter frequency drift for AM572x errata i856 Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 23/98] ARM: OMAP2+: Fix n900 board name for legacy user space Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 24/98] NFSv4: Cache the NFSv4/v4.1 client owner_id in the struct nfs_client Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 25/98] NFSv4/v4.1: Verify the client owner id during trunking detection Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 26/98] NFS: Ignore transport protocol when detecting server trunking Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 27/98] NFSv4: Remove incorrect check in can_open_delegated() Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 28/98] arm: dts: Use pmu_system_controller phandle for dp phy Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 29/98] scsi: ->queue_rq can't sleep Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 30/98] USB: EHCI: adjust error return code Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 31/98] uas: disable UAS on Apricorn SATA dongles Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 32/98] usb: host: ehci-tegra: request deferred probe when failing to get phy Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 33/98] Revert "tty: Fix pty master poll() after slave closes v2" Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 34/98] serial: samsung: Add the support for Exynos5433 SoC Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 35/98] mcb: mcb-pci: Only remap the 1st 0x200 bytes of BAR 0 Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 36/98] usb: serial: handle -ENODEV quietly in generic_submit_read_urb Sasha Levin
2018-10-26  8:39   ` Johan Hovold
2018-10-26 10:54     ` Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 37/98] ARM: at91/dt: sama5d4: fix the timer reg length Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 38/98] ARM: at91: sama5d3: dt: correct the sound route Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 39/98] ARM: at91/dt: sam9263: Add missing clocks to lcdc node Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 40/98] ARM: at91: board-dt-sama5: add phy_fixup to override NAND_Tree Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 41/98] fbdev/broadsheetfb: fix memory leak Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 42/98] tracing: Fix enabling of syscall events on the command line Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 43/98] perf/rapl: Fix sysfs_show() initialization for RAPL PMU Sasha Levin
2018-10-25 14:17 ` [PATCH AUTOSEL 3.18 44/98] perf/x86/intel: Fix bug for "cycles:p" and "cycles:pp" on SLM Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 45/98] perf machine: Fix __machine__findnew_thread() error path Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 46/98] perf tools: Fix statfs.f_type data type mismatch build error with uclibc Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 47/98] perf tools: Avoid build splat for syscall numbers " Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 48/98] perf tools: Fix segfault for symbol annotation on TUI Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 49/98] drivers: bus: check cci device tree node status Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 50/98] ARM: dts: disable CCI on exynos5420 based arndale-octa Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 51/98] clk: rockchip: fix deadlock possibility in cpuclk Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 52/98] quota: Fix maximum quota limit settings Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 53/98] rtnl: don't account unused struct ifla_port_vsi in rtnl_port_size Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 54/98] nfs: fix high load average due to callback thread sleeping Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 55/98] rcu: Clear need_qs flag to prevent splat Sasha Levin
2018-10-25 15:31   ` Paul E. McKenney
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 56/98] x86/irq: Check for valid irq descriptor in check_irq_vectors_for_cpu_disable() Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 57/98] of/pci: Remove duplicate kfree in of_pci_get_host_bridge_resources() Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 58/98] Btrfs: avoid syncing log in the fast fsync path when not necessary Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 59/98] pinctrl: imx25: ensure that a pin with id i is at position i in the info array Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 60/98] dm: fix AB-BA deadlock in __dm_destroy() Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 61/98] arm/arm64: KVM: Take mmap_sem in stage2_unmap_vm Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 62/98] net/mlx4_en: Remove dependency between timestamping capability and service_task Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 63/98] iommu/vt-d: Fix VM domain ID leak Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 64/98] tty: serial: fsl_lpuart: fix clearing of receive flag Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 65/98] x86/idle: Restore trace_cpu_idle to mwait_idle() calls Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 66/98] ext4: fix an ext3 collapse range regression in xfstests Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 67/98] net: ethernet: davicom: fix devicetree irq resource Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 68/98] perf bench numa: Fix to show proper convergence stats Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 69/98] MIPS: Fix up obsolete cpu_set usage Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 70/98] dm9000: Fix irq trigger type setup on non-dt platforms Sasha Levin
2018-10-25 14:18 ` Sasha Levin [this message]
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 72/98] ASoC: dapm: Don't add prefix to widget stream name Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 73/98] mtd: blkdevs: fix potential deadlock + lockdep warnings Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 74/98] selftests: Introduce a new script to generate tc batch file Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 75/98] rtlwifi: rtl8821ae: Fix system lockups on boot Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 76/98] rtlwifi: rtl8821ae: Fix " Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 77/98] clocksource/exynos_mct: Clear interrupt when cpu is shut down Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 78/98] ALSA: hda - Add headset mic support for Acer Aspire V5-573G Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 79/98] ALSA: usb-audio: Add a more accurate volume quirk for AudioQuest DragonFly Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 80/98] tty: audit: Fix audit source Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 81/98] Btrfs: do not ignore errors from btrfs_lookup_xattr in do_setxattr Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 82/98] igb: Unpair the queues when changing the number of queues Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 83/98] libata: blacklist Micron 500IT SSD with MU01 firmware Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 84/98] perf: Fix PERF_EVENT_IOC_PERIOD deadlock Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 85/98] mm: migrate: hugetlb: putback destination hugepage to active list Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 86/98] Revert "SCSI: Fix NULL pointer dereference in runtime PM" Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 87/98] x86/ldt: Fix small LDT allocation for Xen Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 88/98] PCI: Fix devfn for VPD access through function 0 Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 89/98] vfs: Make sendfile(2) killable even better Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 90/98] sctp: translate network order to host order when users get a hmacid Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 91/98] iwlwifi: pcie: correctly define 7265-D cfg Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 92/98] ovl: fix open in stacked overlay Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 93/98] igb: fix NULL derefs due to skipped SR-IOV enabling Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 94/98] KEYS: put keyring if install_session_keyring_to_cred() fails Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 95/98] USB: hub: fix up early-exit pathway in hub_activate Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 96/98] net: fix warnings in 'make htmldocs' by moving macro definition out of field declaration Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 97/98] x86/PCI: Mark Broadwell-EP Home Agent 1 as having non-compliant BARs Sasha Levin
2018-10-25 14:18 ` [PATCH AUTOSEL 3.18 98/98] unix: correctly track in-flight fds in sending process user_struct Sasha Levin

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=20181025141853.214051-71-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=behanw@converseincode.com \
    --cc=charlebm@gmail.com \
    --cc=daniel@iogearbox.net \
    --cc=hannes@stressinduktion.org \
    --cc=herbert@gondor.apana.org.au \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mancha1@zoho.com \
    --cc=smueller@chronox.de \
    --cc=stable@vger.kernel.org \
    --cc=tytso@mit.edu \
    /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).