mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Mel Gorman <mel@csn.ul.ie>
To: Yinghai Lu <yinghai@kernel.org>
Cc: Ingo Molnar <mingo@elte.hu>, Thomas Gleixner <tglx@linutronix.de>,
	"H. Peter Anvin" <hpa@zytor.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Christoph Lameter <cl@linux-foundation.org>,
	Suresh Siddha <suresh.b.siddha@intel.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Al Viro <viro@zeniv.linux.org.uk>,
	Rusty Russell <rusty@rustcorp.com.au>
Subject: Re: [PATCH] x86: remove MEMORY_HOTPLUG_RESERVE related code -v2
Date: Wed, 13 May 2009 15:59:50 +0100	[thread overview]
Message-ID: <20090513145950.GB28097@csn.ul.ie> (raw)
In-Reply-To: <4A0A64FB.4080504@kernel.org>

On Tue, May 12, 2009 at 11:13:15PM -0700, Yinghai Lu wrote:
> 
> after
> | commit b263295dbffd33b0fbff670720fa178c30e3392a
> | Author: Christoph Lameter <clameter@sgi.com>
> | Date:   Wed Jan 30 13:30:47 2008 +0100
> |
> |    x86: 64-bit, make sparsemem vmemmap the only memory model
> 
> we don't have MEMORY_HOTPLUG_RESERVE anymore.
> 
> Historically, x86-64 had an architecture-specific method for memory hotplug
> whereby it scanned the SRAT for physical memory ranges that could be
> potentially used for memory hot-add later. By reserving those ranges
> without physical memory, the memmap would be allocated and left dormant
> until needed. This depended on the DISCONTIG memory model which has been
> removed so the code implementing HOTPLUG_RESERVE is now dead.
> 
> This patch removes the dead code used by MEMORY_HOTPLUG_RESERVE
> 
> Changelog updated by Mel.
> 
> v2: updated changelog, and remove hotadd= in doc
> 
> [ Impact: remove dead code ]
> 
> Signed-off-by: Yinghai Lu <yinghai@kernel.org>
> Reviewed-by: Christoph Lameter <cl@linux-foundation.org>
> Cc: Mel Gorman <mel@csn.ul.ie>

Patch looks good and successfully boot-tested on a small number of
machines. Nice work.

Reviewed-by: Mel Gorman <mel@csn.ul.ie>

> 
> ---
>  Documentation/x86/x86_64/boot-options.txt |    5 --
>  arch/x86/include/asm/numa_64.h            |    3 -
>  arch/x86/mm/numa_64.c                     |    5 --
>  arch/x86/mm/srat_64.c                     |   63 +++++----------------------
>  include/linux/mm.h                        |    2 
>  mm/page_alloc.c                           |   69 ------------------------------
>  6 files changed, 12 insertions(+), 135 deletions(-)
> 
> Index: linux-2.6/arch/x86/include/asm/numa_64.h
> ===================================================================
> --- linux-2.6.orig/arch/x86/include/asm/numa_64.h
> +++ linux-2.6/arch/x86/include/asm/numa_64.h
> @@ -17,9 +17,6 @@ extern int compute_hash_shift(struct boo
>  extern void numa_init_array(void);
>  extern int numa_off;
>  
> -extern void srat_reserve_add_area(int nodeid);
> -extern int hotadd_percent;
> -
>  extern s16 apicid_to_node[MAX_LOCAL_APIC];
>  
>  extern unsigned long numa_free_all_bootmem(void);
> Index: linux-2.6/arch/x86/mm/numa_64.c
> ===================================================================
> --- linux-2.6.orig/arch/x86/mm/numa_64.c
> +++ linux-2.6/arch/x86/mm/numa_64.c
> @@ -272,9 +272,6 @@ void __init setup_node_bootmem(int nodei
>  		reserve_bootmem_node(NODE_DATA(nodeid), bootmap_start,
>  				 bootmap_pages<<PAGE_SHIFT, BOOTMEM_DEFAULT);
>  
> -#ifdef CONFIG_ACPI_NUMA
> -	srat_reserve_add_area(nodeid);
> -#endif
>  	node_set_online(nodeid);
>  }
>  
> @@ -593,8 +590,6 @@ static __init int numa_setup(char *opt)
>  #ifdef CONFIG_ACPI_NUMA
>  	if (!strncmp(opt, "noacpi", 6))
>  		acpi_numa = -1;
> -	if (!strncmp(opt, "hotadd=", 7))
> -		hotadd_percent = simple_strtoul(opt+7, NULL, 10);
>  #endif
>  	return 0;
>  }
> Index: linux-2.6/arch/x86/mm/srat_64.c
> ===================================================================
> --- linux-2.6.orig/arch/x86/mm/srat_64.c
> +++ linux-2.6/arch/x86/mm/srat_64.c
> @@ -31,8 +31,6 @@ static nodemask_t nodes_parsed __initdat
>  static nodemask_t cpu_nodes_parsed __initdata;
>  static struct bootnode nodes[MAX_NUMNODES] __initdata;
>  static struct bootnode nodes_add[MAX_NUMNODES];
> -static int found_add_area __initdata;
> -int hotadd_percent __initdata = 0;
>  
>  static int num_node_memblks __initdata;
>  static struct bootnode node_memblk_range[NR_NODE_MEMBLKS] __initdata;
> @@ -66,9 +64,6 @@ static __init void cutoff_node(int i, un
>  {
>  	struct bootnode *nd = &nodes[i];
>  
> -	if (found_add_area)
> -		return;
> -
>  	if (nd->start < start) {
>  		nd->start = start;
>  		if (nd->end < nd->start)
> @@ -86,7 +81,6 @@ static __init void bad_srat(void)
>  	int i;
>  	printk(KERN_ERR "SRAT: SRAT not used.\n");
>  	acpi_numa = -1;
> -	found_add_area = 0;
>  	for (i = 0; i < MAX_LOCAL_APIC; i++)
>  		apicid_to_node[i] = NUMA_NO_NODE;
>  	for (i = 0; i < MAX_NUMNODES; i++)
> @@ -182,24 +176,21 @@ acpi_numa_processor_affinity_init(struct
>  	       pxm, apic_id, node);
>  }
>  
> -static int update_end_of_memory(unsigned long end) {return -1;}
> -static int hotadd_enough_memory(struct bootnode *nd) {return 1;}
>  #ifdef CONFIG_MEMORY_HOTPLUG_SPARSE
>  static inline int save_add_info(void) {return 1;}
>  #else
>  static inline int save_add_info(void) {return 0;}
>  #endif
>  /*
> - * Update nodes_add and decide if to include add are in the zone.
> - * Both SPARSE and RESERVE need nodes_add information.
> - * This code supports one contiguous hot add area per node.
> + * Update nodes_add[]
> + * This code supports one contiguous hot add area per node
>   */
> -static int __init
> -reserve_hotadd(int node, unsigned long start, unsigned long end)
> +static void __init
> +update_nodes_add(int node, unsigned long start, unsigned long end)
>  {
>  	unsigned long s_pfn = start >> PAGE_SHIFT;
>  	unsigned long e_pfn = end >> PAGE_SHIFT;
> -	int ret = 0, changed = 0;
> +	int changed = 0;
>  	struct bootnode *nd = &nodes_add[node];
>  
>  	/* I had some trouble with strange memory hotadd regions breaking
> @@ -210,7 +201,7 @@ reserve_hotadd(int node, unsigned long s
>  	   mistakes */
>  	if ((signed long)(end - start) < NODE_MIN_SIZE) {
>  		printk(KERN_ERR "SRAT: Hotplug area too small\n");
> -		return -1;
> +		return;
>  	}
>  
>  	/* This check might be a bit too strict, but I'm keeping it for now. */
> @@ -218,12 +209,7 @@ reserve_hotadd(int node, unsigned long s
>  		printk(KERN_ERR
>  			"SRAT: Hotplug area %lu -> %lu has existing memory\n",
>  			s_pfn, e_pfn);
> -		return -1;
> -	}
> -
> -	if (!hotadd_enough_memory(&nodes_add[node]))  {
> -		printk(KERN_ERR "SRAT: Hotplug area too large\n");
> -		return -1;
> +		return;
>  	}
>  
>  	/* Looks good */
> @@ -245,11 +231,9 @@ reserve_hotadd(int node, unsigned long s
>  			printk(KERN_ERR "SRAT: Hotplug zone not continuous. Partly ignored\n");
>  	}
>  
> -	ret = update_end_of_memory(nd->end);
> -
>  	if (changed)
> -	 	printk(KERN_INFO "SRAT: hot plug zone found %Lx - %Lx\n", nd->start, nd->end);
> -	return ret;
> +		printk(KERN_INFO "SRAT: hot plug zone found %Lx - %Lx\n",
> +				 nd->start, nd->end);
>  }
>  
>  /* Callback for parsing of the Proximity Domain <-> Memory Area mappings */
> @@ -310,13 +294,10 @@ acpi_numa_memory_affinity_init(struct ac
>  	       start, end);
>  	e820_register_active_regions(node, start >> PAGE_SHIFT,
>  				     end >> PAGE_SHIFT);
> -	push_node_boundaries(node, nd->start >> PAGE_SHIFT,
> -						nd->end >> PAGE_SHIFT);
>  
> -	if ((ma->flags & ACPI_SRAT_MEM_HOT_PLUGGABLE) &&
> -	    (reserve_hotadd(node, start, end) < 0)) {
> -		/* Ignore hotadd region. Undo damage */
> -		printk(KERN_NOTICE "SRAT: Hotplug region ignored\n");
> +	if (ma->flags & ACPI_SRAT_MEM_HOT_PLUGGABLE) {
> +		update_nodes_add(node, start, end);
> +		/* restore nodes[node] */
>  		*nd = oldnode;
>  		if ((nd->start | nd->end) == 0)
>  			node_clear(node, nodes_parsed);
> @@ -510,26 +491,6 @@ static int null_slit_node_compare(int a,
>  }
>  #endif /* CONFIG_NUMA_EMU */
>  
> -void __init srat_reserve_add_area(int nodeid)
> -{
> -	if (found_add_area && nodes_add[nodeid].end) {
> -		u64 total_mb;
> -
> -		printk(KERN_INFO "SRAT: Reserving hot-add memory space "
> -				"for node %d at %Lx-%Lx\n",
> -			nodeid, nodes_add[nodeid].start, nodes_add[nodeid].end);
> -		total_mb = (nodes_add[nodeid].end - nodes_add[nodeid].start)
> -					>> PAGE_SHIFT;
> -		total_mb *= sizeof(struct page);
> -		total_mb >>= 20;
> -		printk(KERN_INFO "SRAT: This will cost you %Lu MB of "
> -				"pre-allocated memory.\n", (unsigned long long)total_mb);
> -		reserve_bootmem_node(NODE_DATA(nodeid), nodes_add[nodeid].start,
> -			       nodes_add[nodeid].end - nodes_add[nodeid].start,
> -			       BOOTMEM_DEFAULT);
> -	}
> -}
> -
>  int __node_distance(int a, int b)
>  {
>  	int index;
> Index: linux-2.6/include/linux/mm.h
> ===================================================================
> --- linux-2.6.orig/include/linux/mm.h
> +++ linux-2.6/include/linux/mm.h
> @@ -1032,8 +1032,6 @@ extern void add_active_range(unsigned in
>  					unsigned long end_pfn);
>  extern void remove_active_range(unsigned int nid, unsigned long start_pfn,
>  					unsigned long end_pfn);
> -extern void push_node_boundaries(unsigned int nid, unsigned long start_pfn,
> -					unsigned long end_pfn);
>  extern void remove_all_active_ranges(void);
>  extern unsigned long absent_pages_in_range(unsigned long start_pfn,
>  						unsigned long end_pfn);
> Index: linux-2.6/mm/page_alloc.c
> ===================================================================
> --- linux-2.6.orig/mm/page_alloc.c
> +++ linux-2.6/mm/page_alloc.c
> @@ -150,10 +150,6 @@ static unsigned long __meminitdata dma_r
>    static int __meminitdata nr_nodemap_entries;
>    static unsigned long __meminitdata arch_zone_lowest_possible_pfn[MAX_NR_ZONES];
>    static unsigned long __meminitdata arch_zone_highest_possible_pfn[MAX_NR_ZONES];
> -#ifdef CONFIG_MEMORY_HOTPLUG_RESERVE
> -  static unsigned long __meminitdata node_boundary_start_pfn[MAX_NUMNODES];
> -  static unsigned long __meminitdata node_boundary_end_pfn[MAX_NUMNODES];
> -#endif /* CONFIG_MEMORY_HOTPLUG_RESERVE */
>    static unsigned long __initdata required_kernelcore;
>    static unsigned long __initdata required_movablecore;
>    static unsigned long __meminitdata zone_movable_pfn[MAX_NUMNODES];
> @@ -3121,64 +3117,6 @@ void __init sparse_memory_present_with_a
>  }
>  
>  /**
> - * push_node_boundaries - Push node boundaries to at least the requested boundary
> - * @nid: The nid of the node to push the boundary for
> - * @start_pfn: The start pfn of the node
> - * @end_pfn: The end pfn of the node
> - *
> - * In reserve-based hot-add, mem_map is allocated that is unused until hotadd
> - * time. Specifically, on x86_64, SRAT will report ranges that can potentially
> - * be hotplugged even though no physical memory exists. This function allows
> - * an arch to push out the node boundaries so mem_map is allocated that can
> - * be used later.
> - */
> -#ifdef CONFIG_MEMORY_HOTPLUG_RESERVE
> -void __init push_node_boundaries(unsigned int nid,
> -		unsigned long start_pfn, unsigned long end_pfn)
> -{
> -	mminit_dprintk(MMINIT_TRACE, "zoneboundary",
> -			"Entering push_node_boundaries(%u, %lu, %lu)\n",
> -			nid, start_pfn, end_pfn);
> -
> -	/* Initialise the boundary for this node if necessary */
> -	if (node_boundary_end_pfn[nid] == 0)
> -		node_boundary_start_pfn[nid] = -1UL;
> -
> -	/* Update the boundaries */
> -	if (node_boundary_start_pfn[nid] > start_pfn)
> -		node_boundary_start_pfn[nid] = start_pfn;
> -	if (node_boundary_end_pfn[nid] < end_pfn)
> -		node_boundary_end_pfn[nid] = end_pfn;
> -}
> -
> -/* If necessary, push the node boundary out for reserve hotadd */
> -static void __meminit account_node_boundary(unsigned int nid,
> -		unsigned long *start_pfn, unsigned long *end_pfn)
> -{
> -	mminit_dprintk(MMINIT_TRACE, "zoneboundary",
> -			"Entering account_node_boundary(%u, %lu, %lu)\n",
> -			nid, *start_pfn, *end_pfn);
> -
> -	/* Return if boundary information has not been provided */
> -	if (node_boundary_end_pfn[nid] == 0)
> -		return;
> -
> -	/* Check the boundaries and update if necessary */
> -	if (node_boundary_start_pfn[nid] < *start_pfn)
> -		*start_pfn = node_boundary_start_pfn[nid];
> -	if (node_boundary_end_pfn[nid] > *end_pfn)
> -		*end_pfn = node_boundary_end_pfn[nid];
> -}
> -#else
> -void __init push_node_boundaries(unsigned int nid,
> -		unsigned long start_pfn, unsigned long end_pfn) {}
> -
> -static void __meminit account_node_boundary(unsigned int nid,
> -		unsigned long *start_pfn, unsigned long *end_pfn) {}
> -#endif
> -
> -
> -/**
>   * get_pfn_range_for_nid - Return the start and end page frames for a node
>   * @nid: The nid to return the range for. If MAX_NUMNODES, the min and max PFN are returned.
>   * @start_pfn: Passed by reference. On return, it will have the node start_pfn.
> @@ -3203,9 +3141,6 @@ void __meminit get_pfn_range_for_nid(uns
>  
>  	if (*start_pfn == -1UL)
>  		*start_pfn = 0;
> -
> -	/* Push the node boundaries out if requested */
> -	account_node_boundary(nid, start_pfn, end_pfn);
>  }
>  
>  /*
> @@ -3810,10 +3745,6 @@ void __init remove_all_active_ranges(voi
>  {
>  	memset(early_node_map, 0, sizeof(early_node_map));
>  	nr_nodemap_entries = 0;
> -#ifdef CONFIG_MEMORY_HOTPLUG_RESERVE
> -	memset(node_boundary_start_pfn, 0, sizeof(node_boundary_start_pfn));
> -	memset(node_boundary_end_pfn, 0, sizeof(node_boundary_end_pfn));
> -#endif /* CONFIG_MEMORY_HOTPLUG_RESERVE */
>  }
>  
>  /* Compare two active node_active_regions */
> Index: linux-2.6/Documentation/x86/x86_64/boot-options.txt
> ===================================================================
> --- linux-2.6.orig/Documentation/x86/x86_64/boot-options.txt
> +++ linux-2.6/Documentation/x86/x86_64/boot-options.txt
> @@ -150,11 +150,6 @@ NUMA
>  		Otherwise, the remaining system RAM is allocated to an
>  		additional node.
>  
> -  numa=hotadd=percent
> -		Only allow hotadd memory to preallocate page structures upto
> -		percent of already available memory.
> -		numa=hotadd=0 will disable hotadd memory.
> -
>  ACPI
>  
>    acpi=off	Don't enable ACPI
> 

-- 
Mel Gorman
Part-time Phd Student                          Linux Technology Center
University of Limerick                         IBM Dublin Software Lab

  reply	other threads:[~2009-05-13 15:00 UTC|newest]

Thread overview: 90+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-05-09  6:45 [PATCH 1/3] x86: remove MEMORY_HOTPLUG_RESERVE related code Yinghai Lu
2009-05-09  6:48 ` [PATCH 2/3] x86: add numa_move_cpus_to_node Yinghai Lu
2009-05-09  7:05   ` Justin P. Mattock
2009-05-12  1:27   ` Christoph Lameter
2009-05-11 21:53     ` Yinghai Lu
2009-05-12 20:59       ` Christoph Lameter
2009-05-12 17:16         ` Yinghai Lu
2009-05-12 21:21           ` Christoph Lameter
2009-05-13  5:39             ` Yinghai Lu
2009-05-14 19:34               ` Christoph Lameter
2009-05-14 20:58                 ` Yinghai Lu
2009-05-09  6:50 ` [PATCH 3/3] x86: fix node_possible_map logic -v2 Yinghai Lu
2009-05-11 17:53   ` Jack Steiner
2009-05-11 19:15     ` Yinghai Lu
2009-05-11 19:36       ` Yinghai Lu
2009-05-11 19:27     ` David Rientjes
2009-05-11 21:12       ` H. Peter Anvin
2009-05-11 21:26         ` Alan Cox
2009-05-11 22:25         ` David Rientjes
2009-05-12 15:06           ` Jack Steiner
2009-05-12 15:10             ` Yinghai Lu
2009-05-12 16:16               ` Jack Steiner
2009-05-12 16:40                 ` Yinghai Lu
2009-05-12 18:03                   ` Jack Steiner
2009-05-12 21:31                     ` Yinghai Lu
2009-05-12 21:58                       ` Jack Steiner
2009-05-12 23:13                         ` Yinghai Lu
2009-05-12 23:26                           ` Yinghai Lu
2009-05-12 15:43             ` Andi Kleen
2009-05-13  1:34             ` [PATCH] x86: fix system without memory on node0 Yinghai Lu
2009-05-13  8:00               ` Andi Kleen
2009-05-13 15:58                 ` Yinghai Lu
2009-05-13 13:35               ` Ingo Molnar
2009-05-13 16:52               ` Jack Steiner
2009-05-13 17:43                 ` Yinghai Lu
2009-05-13 18:08                 ` Yinghai Lu
2009-05-12  7:15         ` [PATCH 3/3] x86: fix node_possible_map logic -v2 Andi Kleen
2009-05-11 21:33       ` Jack Steiner
2009-05-11 22:56         ` David Rientjes
2009-05-11 23:00           ` Yinghai Lu
2009-05-12  7:09       ` Andi Kleen
2009-05-12  1:02 ` [PATCH 1/3] x86: remove MEMORY_HOTPLUG_RESERVE related code Christoph Lameter
2009-05-12 11:16 ` Mel Gorman
2009-05-13  5:29   ` Yinghai Lu
2009-05-13  9:55     ` Mel Gorman
2009-05-13  6:13   ` [PATCH] x86: remove MEMORY_HOTPLUG_RESERVE related code -v2 Yinghai Lu
2009-05-13 14:59     ` Mel Gorman [this message]
2009-05-14 16:38       ` [PATCH 1/5] " Yinghai Lu
2009-05-14 16:40         ` [PATCH 2/5] x86: add numa_move_cpus_to_node Yinghai Lu
2009-05-14 16:41         ` [PATCH 3/5] x86: fix node_possible_map logic -v2 Yinghai Lu
2009-05-18  7:40           ` [tip:x86/mm] x86, mm: Fix node_possible_map logic tip-bot for Yinghai Lu
2009-05-14 16:42         ` [PATCH 4/5] x86: fix system without memory on node0 -v2 Yinghai Lu
2009-05-18  7:40           ` [tip:x86/mm] x86: fix system without memory on node0 tip-bot for Yinghai Lu
2009-05-14 16:43         ` [PATCH 5/5] mm: clear N_HIGH_MEMORY map before se set it again -v2 Yinghai Lu
2009-05-14 16:54           ` Andrew Morton
2009-05-14 17:05             ` Yinghai Lu
2009-05-14 17:25               ` Andrew Morton
2009-05-14 17:34                 ` Yinghai Lu
2009-05-14 19:44                   ` Christoph Lameter
2009-06-04  5:16                   ` [RESEND PATCH] " Yinghai Lu
2009-06-04 16:38                     ` Christoph Lameter
2009-06-04 16:48                       ` Yinghai Lu
2009-06-04 17:11                         ` Christoph Lameter
2009-06-04 17:26                           ` [PATCH] mm: clear N_HIGH_MEMORY map before se set it again -v4 Yinghai Lu
2009-06-19  6:42                             ` Nathan Lynch
2009-06-19  8:18                               ` Yinghai Lu
2009-06-19  8:43                                 ` Nathan Lynch
2009-06-19 16:16                                   ` Yinghai Lu
2009-06-20 23:43                                   ` Yinghai Lu
2009-06-22  4:39                                     ` Nathan Lynch
2009-06-22 15:38                                       ` [PATCH] x86: only clear node_states for 64bit Yinghai Lu
2009-06-26 20:54                                         ` Andrew Morton
2009-06-26 21:09                                           ` Yinghai Lu
2009-06-27 17:17                                             ` Ingo Molnar
2009-06-27 20:40                                               ` Yinghai Lu
2009-06-29  7:39                                                 ` Yinghai Lu
2009-05-18  7:39         ` [tip:x86/mm] mm, x86: remove MEMORY_HOTPLUG_RESERVE related code tip-bot for Yinghai Lu
     [not found] ` <20090511095022.GA23121@elte.hu>
     [not found]   ` <20090511163158.c4e4d334.akpm@linux-foundation.org>
     [not found]     ` <20090512090704.GC18004@elte.hu>
     [not found]       ` <4A0A6700.3070100@kernel.org>
     [not found]         ` <20090513133635.GB7384@elte.hu>
     [not found]           ` <4A0AFA6E.5050200@kernel.org>
     [not found]             ` <20090515173521.GA29647@elte.hu>
2009-05-15 21:38               ` tip: patches in git for irq and numa Yinghai Lu
2009-05-18  7:29                 ` Ingo Molnar
2009-05-18 13:50                   ` Peter Zijlstra
2009-05-18 13:56                     ` Ingo Molnar
2009-05-18 15:03                     ` Yinghai Lu
2009-05-18 15:09                       ` Ingo Molnar
2009-05-18 15:11                       ` Peter Zijlstra
2009-05-18 17:23                         ` Yinghai Lu
2009-05-19  9:37                           ` Ingo Molnar
2009-05-19 10:31                             ` Peter Zijlstra
2009-05-19 12:26                               ` Ingo Molnar
2009-05-19  9:39                           ` [tip:irq/numa] x86, io-apic: Don't mark pin_programmed early tip-bot for Yinghai Lu
2009-05-19 12:30                           ` tip-bot for Yinghai Lu

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=20090513145950.GB28097@csn.ul.ie \
    --to=mel@csn.ul.ie \
    --cc=akpm@linux-foundation.org \
    --cc=cl@linux-foundation.org \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=rusty@rustcorp.com.au \
    --cc=suresh.b.siddha@intel.com \
    --cc=tglx@linutronix.de \
    --cc=viro@zeniv.linux.org.uk \
    --cc=yinghai@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

all inboxes | Powered by JetHome®