linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
To: Oleg Nesterov <oleg@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@elte.hu>, Steven Rostedt <rostedt@goodmis.org>,
	Linux-mm <linux-mm@kvack.org>,
	Arnaldo Carvalho de Melo <acme@infradead.org>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Ananth N Mavinakayanahalli <ananth@in.ibm.com>,
	Hugh Dickins <hughd@google.com>,
	Christoph Hellwig <hch@infradead.org>,
	Jonathan Corbet <corbet@lwn.net>,
	Thomas Gleixner <tglx@linutronix.de>,
	Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Jim Keniston <jkenisto@linux.vnet.ibm.com>,
	Roland McGrath <roland@hack.frob.com>,
	Andi Kleen <andi@firstfloor.org>,
	LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v5 3.1.0-rc4-tip 4/26]   uprobes: Define hooks for mmap/munmap.
Date: Thu, 6 Oct 2011 16:35:31 +0530	[thread overview]
Message-ID: <20111006110531.GE17591@linux.vnet.ibm.com> (raw)
In-Reply-To: <20111003133710.GA28118@redhat.com>

* Oleg Nesterov <oleg@redhat.com> [2011-10-03 15:37:10]:

> On 09/20, Srikar Dronamraju wrote:
> >
> > @@ -739,6 +740,10 @@ struct mm_struct *dup_mm(struct task_struct *tsk)
> >  #ifdef CONFIG_TRANSPARENT_HUGEPAGE
> >  	mm->pmd_huge_pte = NULL;
> >  #endif
> > +#ifdef CONFIG_UPROBES
> > +	atomic_set(&mm->mm_uprobes_count,
> > +			atomic_read(&oldmm->mm_uprobes_count));
> 
> Hmm. Why this can't race with install_breakpoint/remove_breakpoint
> between _read and _set ?

At this time the child vmas are not yet created, so I dont see a 
install_breakpoints/remove_breakpoints from child affecting.

However if install_breakpoints/remove_breakpoints happen from a parent
context, from now on till we do a vma_prio_tree_add (actually down_write(oldmm->mmap_sem) in dup_mmap()),  then the count in the child may not be the right one. If you are pointing to this race, then its probably bigger than just between read and set.

or are you talking of some other issue?

> 
> What about VM_DONTCOPY vma's with breakpoints ?

Ah... I have missed this.

One solution could be to call mmap_uprobe() like routine just before we
release the mmap_sem of the child but after we do a vma_prio_tree_add.

This should also solve the problem of install_breakpoints/remove
breakpoints called in parent context that we talked about above.

> 
> > -static int match_uprobe(struct uprobe *l, struct uprobe *r)
> > +static int match_uprobe(struct uprobe *l, struct uprobe *r, int *match_inode)
> >  {
> > +	/*
> > +	 * if match_inode is non NULL then indicate if the
> > +	 * inode atleast match.
> > +	 */
> > +	if (match_inode)
> > +		*match_inode = 0;
> > +
> >  	if (l->inode < r->inode)
> >  		return -1;
> >  	if (l->inode > r->inode)
> >  		return 1;
> >  	else {
> > +		if (match_inode)
> > +			*match_inode = 1;
> > +
> 
> It is very possible I missed something, but imho this looks confusing.
> 
> This close_match logic is only needed for build_probe_list() and
> dec_mm_uprobes_count(), and both do not actually need the returned
> uprobe.
> 
> Instead of complicating match_uprobe() and __find_uprobe(), perhaps
> it makes sense to add "struct rb_node *__find_close_rb_node(inode)" ?


Yes, we do this too.

> 
> > +static int install_breakpoint(struct mm_struct *mm, struct uprobe *uprobe)
> >  {
> >  	/* Placeholder: Yet to be implemented */
> > +	if (!uprobe->consumers)
> > +		return 0;
> 
> How it is possible to see ->consumers == NULL?
> 

consumers == NULL check is mostly for the mmap_uprobe path.
_register_uprobe and _unregister_uprobe() use the same lock to serialize
so they can check consumers after taking the lock.

> OK, afaics it _is_ possible, but only because unregister does del_consumer()
> without ->i_mutex, but this is bug afaics (see the previous email).

We have discussed this in the other thread.

> 
> Another user is mmap_uprobe() and it checks ->consumers != NULL itself (but
> see below).
> 
> > +int mmap_uprobe(struct vm_area_struct *vma)
> > +{
> > +	struct list_head tmp_list;
> > +	struct uprobe *uprobe, *u;
> > +	struct inode *inode;
> > +	int ret = 0;
> > +
> > +	if (!valid_vma(vma))
> > +		return ret;	/* Bail-out */
> > +
> > +	inode = igrab(vma->vm_file->f_mapping->host);
> > +	if (!inode)
> > +		return ret;
> > +
> > +	INIT_LIST_HEAD(&tmp_list);
> > +	mutex_lock(&uprobes_mmap_mutex);
> > +	build_probe_list(inode, &tmp_list);
> > +	list_for_each_entry_safe(uprobe, u, &tmp_list, pending_list) {
> > +		loff_t vaddr;
> > +
> > +		list_del(&uprobe->pending_list);
> > +		if (!ret && uprobe->consumers) {
> > +			vaddr = vma->vm_start + uprobe->offset;
> > +			vaddr -= vma->vm_pgoff << PAGE_SHIFT;
> > +			if (vaddr < vma->vm_start || vaddr >= vma->vm_end)
> > +				continue;
> > +			ret = install_breakpoint(vma->vm_mm, uprobe);
> 
> So. We are adding the new mapping, we should find all breakpoints this
> file has in the start/end range.
> 
> We are holding ->mmap_sem... this seems enough to protect against the
> races with register/unregister. Except, what if __register_uprobe()
> fails? In this case __unregister_uprobe() does delete_uprobe() at the
> very end. What if mmap mmap_uprobe() is called right before delete_?
> 

Because consumers would be NULL before _unregister_uprobe kicks in, we
shouldnt have a problem here.

_unregister_uprobe and mmap_uprobe() would race for
down_read(&mm->mmap_sem), if _unregister_uprobe() gets the read_lock,
then by the time mmap_uprobe() gets to run, consumers would be NULL and
we are fine since we dont go ahead an insert.

If mmap_uprobe() were to get the write_lock, _unregister_uprobe would do
the necessary cleanup.

we are checking consumers twice, but thats just being conservative.
we should able to do with just one check too.

Am I missing something?

> > +static void dec_mm_uprobes_count(struct vm_area_struct *vma,
> > +		struct inode *inode)
> > +{
> > +	struct uprobe *uprobe;
> > +	struct rb_node *n;
> > +	unsigned long flags;
> > +
> > +	n = uprobes_tree.rb_node;
> > +	spin_lock_irqsave(&uprobes_treelock, flags);
> > +	uprobe = __find_uprobe(inode, 0, &n);
> > +
> > +	/*
> > +	 * If indeed there is a probe for the inode and with offset zero,
> > +	 * then lets release its reference. (ref got thro __find_uprobe)
> > +	 */
> > +	if (uprobe)
> > +		put_uprobe(uprobe);
> > +	for (; n; n = rb_next(n)) {
> > +		loff_t vaddr;
> > +
> > +		uprobe = rb_entry(n, struct uprobe, rb_node);
> > +		if (uprobe->inode != inode)
> > +			break;
> > +		vaddr = vma->vm_start + uprobe->offset;
> > +		vaddr -= vma->vm_pgoff << PAGE_SHIFT;
> > +		if (vaddr < vma->vm_start || vaddr >= vma->vm_end)
> > +			continue;
> > +		atomic_dec(&vma->vm_mm->mm_uprobes_count);
> 
> So, this does atomic_dec() for each bp in this vma?

yes.

> 
> And the caller is
> 
> > @@ -1337,6 +1338,9 @@ unsigned long unmap_vmas(struct mmu_gather *tlb,
> >  		if (unlikely(is_pfn_mapping(vma)))
> >  			untrack_pfn_vma(vma, 0, 0);
> >
> > +		if (vma->vm_file)
> > +			munmap_uprobe(vma);
> 
> Doesn't look right...
> 
> munmap_uprobe() assumes that the whole region goes away. This is
> true in munmap() case afaics, it does __split_vma() if necessary.
> 
> But what about truncate() ? In this case this vma is not unmapped,
> but unmap_vmas() is called anyway and [start, end) can be different.
> IOW, unless I missed something (this is very possible) we can do
> more atomic_dec's then needed.
> 
would unlink_file_vma be a good place to call munmap_uprobe().

The other idea could be to call munmap_uprobe in unmap_region() just
before free_pgtables() and call atomic_set to set the count to 0 in
exit_mmap() (again before free_pgtables.).


One other thing that we probably need to do at mmap_uprobe() is cache
the number of probes mmap_uprobe installed successfully and then
substract the same from mm_uprobes_count if and only if mmap_uprobe()
were to return -ve number.

> Also, truncate() obviously changes ->i_size. Doesn't this mean
> unregister_uprobe() should return if offset > i_size ? We need to
> free uprobes anyway.

Do you mean we shouldnt check for the offset in unregister_uprobe() and
just search in the rbtree for the matching uprobe?
Thats also possible to do.

> 
> MADV_DONTNEED? It calls unmap_vmas() too. And application can do
> madvise(DONTNEED) in a loop.
> 

I think this would be taken care of if we move the munmap_uprobe() hook
from unmap_vmas to unlink_file_vma().

The other thing that I need to investigate a bit more is if I have
handle all cases of mremap correctly.

-- 
Thanks and Regards
Srikar

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

  reply	other threads:[~2011-10-06 11:23 UTC|newest]

Thread overview: 160+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-09-20 11:59 [PATCH v5 3.1.0-rc4-tip 0/26] Uprobes patchset with perf probe support Srikar Dronamraju
2011-09-20 11:59 ` [PATCH v5 3.1.0-rc4-tip 1/26] uprobes: Auxillary routines to insert, find, delete uprobes Srikar Dronamraju
2011-09-20 15:42   ` Stefan Hajnoczi
2011-09-26 11:18     ` Peter Zijlstra
2011-09-26 11:59       ` Srikar Dronamraju
2011-09-26 11:18   ` Peter Zijlstra
2011-09-26 12:02     ` Srikar Dronamraju
2011-09-26 13:35   ` Peter Zijlstra
2011-09-26 16:19     ` Srikar Dronamraju
2011-09-20 12:00 ` [PATCH v5 3.1.0-rc4-tip 2/26] Uprobes: Allow multiple consumers for an uprobe Srikar Dronamraju
2011-09-26 12:29   ` Peter Zijlstra
2011-09-20 12:00 ` [PATCH v5 3.1.0-rc4-tip 3/26] Uprobes: register/unregister probes Srikar Dronamraju
2011-09-20 16:50   ` Stefan Hajnoczi
2011-09-21  4:07     ` Srikar Dronamraju
2011-09-26 13:15   ` Peter Zijlstra
2011-09-26 13:23     ` Srikar Dronamraju
2011-10-03 12:46   ` Oleg Nesterov
2011-10-05 17:04     ` Srikar Dronamraju
2011-10-05 18:50       ` Oleg Nesterov
2011-10-06  6:51         ` Srikar Dronamraju
2011-10-07 17:03           ` Oleg Nesterov
2011-09-20 12:00 ` [PATCH v5 3.1.0-rc4-tip 4/26] uprobes: Define hooks for mmap/munmap Srikar Dronamraju
2011-09-20 17:03   ` Stefan Hajnoczi
2011-09-21  4:03     ` Srikar Dronamraju
2011-09-26 13:53   ` Peter Zijlstra
2011-09-26 15:44     ` Srikar Dronamraju
2011-09-27 11:37       ` Peter Zijlstra
2011-09-27 13:08         ` Srikar Dronamraju
2011-09-27 11:41       ` Peter Zijlstra
2011-09-27 12:59         ` Srikar Dronamraju
2011-09-27 11:42       ` Peter Zijlstra
2011-10-03 13:37   ` Oleg Nesterov
2011-10-06 11:05     ` Srikar Dronamraju [this message]
2011-10-07 17:36       ` Oleg Nesterov
2011-10-10 12:31         ` Srikar Dronamraju
2011-09-20 12:00 ` [PATCH v5 3.1.0-rc4-tip 5/26] Uprobes: copy of the original instruction Srikar Dronamraju
2011-10-03 16:29   ` Oleg Nesterov
2011-10-05 10:52     ` Srikar Dronamraju
2011-10-05 15:11       ` Oleg Nesterov
2011-10-05 16:09     ` Srikar Dronamraju
2011-10-05 17:53       ` Oleg Nesterov
2011-09-20 12:01 ` [PATCH v5 3.1.0-rc4-tip 6/26] Uprobes: define fixups Srikar Dronamraju
2011-09-20 12:01 ` [PATCH v5 3.1.0-rc4-tip 7/26] Uprobes: uprobes arch info Srikar Dronamraju
2011-09-20 12:01 ` [PATCH v5 3.1.0-rc4-tip 8/26] x86: analyze instruction and determine fixups Srikar Dronamraju
2011-09-20 17:13   ` Stefan Hajnoczi
2011-09-20 18:12     ` Christoph Hellwig
2011-09-20 20:53       ` Stefan Hajnoczi
2011-09-23 11:53         ` Masami Hiramatsu
2011-09-23 16:51           ` Stefan Hajnoczi
2011-09-26 19:59             ` Josh Stone
2011-09-27  1:32               ` Masami Hiramatsu
2011-09-27  2:59                 ` Josh Stone
2011-09-27  7:08               ` Stefan Hajnoczi
2011-09-22  1:05   ` Josh Stone
2011-10-05 15:48   ` Oleg Nesterov
2011-10-05 16:12     ` Srikar Dronamraju
2011-09-20 12:01 ` [PATCH v5 3.1.0-rc4-tip 9/26] Uprobes: Background page replacement Srikar Dronamraju
2011-10-05 16:19   ` Oleg Nesterov
2011-10-06  6:53     ` Srikar Dronamraju
2011-09-20 12:01 ` [PATCH v5 3.1.0-rc4-tip 10/26] x86: Set instruction pointer Srikar Dronamraju
2011-10-05 16:29   ` Oleg Nesterov
2011-09-20 12:02 ` [PATCH v5 3.1.0-rc4-tip 11/26] x86: Introduce TIF_UPROBE FLAG Srikar Dronamraju
2011-09-20 12:02 ` [PATCH v5 3.1.0-rc4-tip 12/26] Uprobes: Handle breakpoint and Singlestep Srikar Dronamraju
2011-09-26 13:59   ` Peter Zijlstra
2011-09-26 16:01     ` Srikar Dronamraju
2011-09-26 16:25       ` Peter Zijlstra
2011-10-05 17:48         ` Oleg Nesterov
2011-09-26 14:02   ` Peter Zijlstra
2011-10-07 18:28   ` Oleg Nesterov
2011-10-09 13:31     ` Oleg Nesterov
2011-09-20 12:02 ` [PATCH v5 3.1.0-rc4-tip 13/26] x86: define a x86 specific exception notifier Srikar Dronamraju
2011-09-26 14:19   ` Peter Zijlstra
2011-09-26 15:52     ` Srikar Dronamraju
2011-09-27 11:46       ` Peter Zijlstra
2011-10-07 18:31   ` Oleg Nesterov
2011-09-20 12:02 ` [PATCH v5 3.1.0-rc4-tip 14/26] uprobe: register " Srikar Dronamraju
2011-09-20 12:03 ` [PATCH v5 3.1.0-rc4-tip 15/26] x86: Define x86_64 specific uprobe_task_arch_info structure Srikar Dronamraju
2011-09-20 12:03 ` [PATCH v5 3.1.0-rc4-tip 16/26] uprobes: Introduce " Srikar Dronamraju
2011-09-20 12:03 ` [PATCH v5 3.1.0-rc4-tip 17/26] x86: arch specific hooks for pre/post singlestep handling Srikar Dronamraju
2011-09-26 14:23   ` Peter Zijlstra
2011-09-26 16:34     ` Srikar Dronamraju
2011-09-27 11:44       ` Peter Zijlstra
2011-09-20 12:03 ` [PATCH v5 3.1.0-rc4-tip 18/26] uprobes: slot allocation Srikar Dronamraju
2011-09-27 11:49   ` Peter Zijlstra
2011-09-27 12:32     ` Srikar Dronamraju
2011-09-27 12:59       ` Peter Zijlstra
2011-09-27 12:18   ` Peter Zijlstra
2011-09-27 12:45     ` Srikar Dronamraju
2011-09-27 12:36   ` Peter Zijlstra
2011-09-27 12:37   ` Peter Zijlstra
2011-09-27 12:50     ` Srikar Dronamraju
2011-09-27 12:50   ` Peter Zijlstra
2011-09-27 12:55   ` Peter Zijlstra
2011-10-07 18:37   ` Oleg Nesterov
2011-10-09 11:47     ` Srikar Dronamraju
2011-09-20 12:03 ` [PATCH v5 3.1.0-rc4-tip 19/26] tracing: Extract out common code for kprobes/uprobes traceevents Srikar Dronamraju
2011-09-28  5:04   ` Masami Hiramatsu
2011-09-20 12:04 ` [PATCH v5 3.1.0-rc4-tip 20/26] tracing: uprobes trace_event interface Srikar Dronamraju
2011-09-20 12:04 ` [PATCH v5 3.1.0-rc4-tip 21/26] tracing: uprobes Documentation Srikar Dronamraju
2011-09-20 12:04 ` [PATCH v5 3.1.0-rc4-tip 22/26] perf: rename target_module to target Srikar Dronamraju
2011-09-20 12:04 ` [PATCH v5 3.1.0-rc4-tip 23/26] perf: perf interface for uprobes Srikar Dronamraju
2011-09-20 12:04 ` [PATCH v5 3.1.0-rc4-tip 24/26] perf: show possible probes in a given executable file or library Srikar Dronamraju
2011-09-20 12:05 ` [PATCH v5 3.1.0-rc4-tip 25/26] perf: Documentation for perf uprobes Srikar Dronamraju
2011-09-28  9:20   ` Masami Hiramatsu
2011-09-20 12:05 ` [PATCH v5 3.1.0-rc4-tip 26/26] uprobes: queue signals while thread is singlestepping Srikar Dronamraju
2011-09-27 13:03   ` Peter Zijlstra
2011-09-27 13:12     ` Srikar Dronamraju
2011-10-05 18:01       ` Oleg Nesterov
2011-10-06  5:47         ` Srikar Dronamraju
2011-10-07 16:58           ` Oleg Nesterov
2011-10-10 12:25             ` Srikar Dronamraju
2011-10-10 18:25               ` Oleg Nesterov
2011-10-11 17:24                 ` Oleg Nesterov
2011-10-11 17:38                   ` Srikar Dronamraju
2011-10-11 17:26                 ` Srikar Dronamraju
2011-10-11 18:56                   ` Oleg Nesterov
2011-10-12 12:01                     ` Srikar Dronamraju
2011-10-12 19:34                       ` Oleg Nesterov
2011-10-12 19:59                   ` Oleg Nesterov
2011-09-20 13:34 ` [PATCH v5 3.1.0-rc4-tip 0/26] Uprobes patchset with perf probe support Christoph Hellwig
2011-09-20 14:12   ` Srikar Dronamraju
2011-09-20 14:28     ` Christoph Hellwig
2011-09-20 15:19       ` Srikar Dronamraju
2011-10-15 19:00 ` [PATCH 0/X] (Was: Uprobes patchset with perf probe support) Oleg Nesterov
2011-10-15 19:00   ` [PATCH 1/X] uprobes: write_opcode: the new page needs PG_uptodate Oleg Nesterov
2011-10-17 10:59     ` Srikar Dronamraju
2011-10-15 19:00   ` [PATCH 2/X] uprobes: write_opcode() needs put_page(new_page) unconditionally Oleg Nesterov
2011-10-18 16:47     ` Srikar Dronamraju
2011-10-15 19:01   ` [PATCH 3/X] uprobes: xol_add_vma: fix ->uprobes_xol_area initialization Oleg Nesterov
2011-10-15 19:01   ` [PATCH 4/X] uprobes: xol_add_vma: misc cleanups Oleg Nesterov
2011-10-15 19:01   ` [PATCH 5/X] uprobes: xol_alloc_area() needs memory barriers Oleg Nesterov
2011-10-16 16:13   ` [PATCH 6/X] uprobes: reimplement xol_add_vma() via install_special_mapping() Oleg Nesterov
2011-10-17 10:50     ` Srikar Dronamraju
2011-10-17 13:34       ` Stephen Smalley
2011-10-17 18:55         ` Oleg Nesterov
2011-10-16 16:14   ` [PATCH 7/X] uprobes: xol_add_vma: simply use TASK_SIZE as a hint Oleg Nesterov
2011-10-19 21:51   ` [PATCH 8-14/X] (Was: Uprobes patchset with perf probe support) Oleg Nesterov
2011-10-19 21:52     ` [PATCH 8/X] uprobes: kill sstep_complete() Oleg Nesterov
2011-10-19 21:52     ` [PATCH 9/X] uprobes: introduce UTASK_SSTEP_ACK state Oleg Nesterov
2011-10-19 21:52     ` [PATCH 10/X] uprobes: introduce uprobe_deny_signal() Oleg Nesterov
2011-10-19 21:53     ` [PATCH 11/X] uprobes: x86: introduce xol_was_trapped() Oleg Nesterov
2011-10-24 14:55       ` Srikar Dronamraju
2011-10-24 16:07         ` Oleg Nesterov
2011-10-19 21:53     ` [PATCH 12/X] uprobes: x86: introduce abort_xol() Oleg Nesterov
2011-10-21 14:42       ` Srikar Dronamraju
2011-10-21 16:22         ` Oleg Nesterov
2011-10-21 16:26         ` Ananth N Mavinakayanahalli
2011-10-21 16:42           ` Oleg Nesterov
2011-10-21 17:59             ` test-case (Was: [PATCH 12/X] uprobes: x86: introduce abort_xol()) Oleg Nesterov
2011-10-25 14:06               ` Srikar Dronamraju
2011-10-25 15:49                 ` Oleg Nesterov
2011-10-22  7:09             ` [PATCH 12/X] uprobes: x86: introduce abort_xol() Ananth N Mavinakayanahalli
2011-10-19 21:53     ` [PATCH 13/X] uprobes: introduce UTASK_SSTEP_TRAPPED logic Oleg Nesterov
2011-10-22  7:20       ` Ananth N Mavinakayanahalli
2011-10-24 14:41         ` Oleg Nesterov
2011-10-24 15:16           ` Ananth N Mavinakayanahalli
2011-10-24 16:13             ` Oleg Nesterov
2011-10-25  6:01               ` Ananth N Mavinakayanahalli
2011-10-25 14:30                 ` Oleg Nesterov
2011-10-19 21:54     ` [PATCH 14/X] uprobes: uprobe_deny_signal: check __fatal_signal_pending() Oleg Nesterov

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=20111006110531.GE17591@linux.vnet.ibm.com \
    --to=srikar@linux.vnet.ibm.com \
    --cc=acme@infradead.org \
    --cc=akpm@linux-foundation.org \
    --cc=ananth@in.ibm.com \
    --cc=andi@firstfloor.org \
    --cc=corbet@lwn.net \
    --cc=hch@infradead.org \
    --cc=hughd@google.com \
    --cc=jkenisto@linux.vnet.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=masami.hiramatsu.pt@hitachi.com \
    --cc=mingo@elte.hu \
    --cc=oleg@redhat.com \
    --cc=peterz@infradead.org \
    --cc=roland@hack.frob.com \
    --cc=rostedt@goodmis.org \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.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).