From: Peter Zijlstra <a.p.zijlstra@chello.nl>
To: Pekka Enberg <penberg@cs.helsinki.fi>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
Andrew Morton <akpm@linux-foundation.org>,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
netdev@vger.kernel.org, trond.myklebust@fys.uio.no,
Daniel Lezcano <dlezcano@fr.ibm.com>, Neil Brown <neilb@suse.de>,
cl@linux-foundation.org
Subject: Re: [PATCH 06/30] mm: kmem_alloc_estimate()
Date: Wed, 30 Jul 2008 15:31:02 +0200 [thread overview]
Message-ID: <1217424662.8157.58.camel@twins> (raw)
In-Reply-To: <1217420503.7813.170.camel@penberg-laptop>
On Wed, 2008-07-30 at 15:21 +0300, Pekka Enberg wrote:
> Hi Peter,
>
> On Thu, 2008-07-24 at 16:00 +0200, Peter Zijlstra wrote:
> Just a nitpick, but:
>
> > +unsigned kmalloc_estimate_fixed(size_t, gfp_t, int);
>
> kmalloc_estimate_objs()?
>
> > +unsigned kmalloc_estimate_variable(gfp_t, size_t);
>
> kmalloc_estimate_bytes()?
Sounds good, I'll do some sed magic on the patch-set to make it happen.
> >
> > /*
> > * Allocator specific definitions. These are mainly used to establish optimized
> > Index: linux-2.6/mm/slub.c
> > ===================================================================
> > --- linux-2.6.orig/mm/slub.c
> > +++ linux-2.6/mm/slub.c
> > @@ -2412,6 +2412,42 @@ const char *kmem_cache_name(struct kmem_
> > }
> > EXPORT_SYMBOL(kmem_cache_name);
> >
> > +/*
> > + * Calculate the upper bound of pages required to sequentially allocate
> > + * @objects objects from @cachep.
> > + *
> > + * We should use s->min_objects because those are the least efficient.
> > + */
> > +unsigned kmem_alloc_estimate(struct kmem_cache *s, gfp_t flags, int objects)
> > +{
> > + unsigned long pages;
> > + struct kmem_cache_order_objects x;
> > +
> > + if (WARN_ON(!s) || WARN_ON(!oo_objects(s->min)))
> > + return 0;
> > +
> > + x = s->min;
> > + pages = DIV_ROUND_UP(objects, oo_objects(x)) << oo_order(x);
> > +
> > + /*
> > + * Account the possible additional overhead if the slab holds more that
> > + * one object. Use s->max_objects because that's the worst case.
> > + */
> > + x = s->oo;
> > + if (oo_objects(x) > 1) {
>
> Hmm, I'm not sure why slab with just one object is treated separately
> here. Surely you have per-CPU slabs then as well?
The thought was that if the slab only contains 1 obj, then the per-cpu
slabs are always full (or empty but already there), so you don't loose
memory to other cpu's having half-filled slabs.
Say you want to reserve memory for 10 object.
In the 1 object per slab case, you will always allocate a slab, no
matter what cpu you do the allocation on.
With say, 16 objects per slab and allocations spread across 2 cpus, you
have to allow for per-cpu slabs to be half-filled.
> > + /*
> > + * Account the possible additional overhead if per cpu slabs
> > + * are currently empty and have to be allocated. This is very
> > + * unlikely but a possible scenario immediately after
> > + * kmem_cache_shrink.
> > + */
> > + pages += num_online_cpus() << oo_order(x);
>
> Isn't this problematic with CPU hotplug? Shouldn't we use
> num_possible_cpus() here?
ACK, thanks!
> > +/*
> > + * Calculate the upper bound of pages requires to sequentially allocate @bytes
> > + * from kmalloc in an unspecified number of allocations of nonuniform size.
> > + */
> > +unsigned kmalloc_estimate_variable(gfp_t flags, size_t bytes)
> > +{
> > + int i;
> > + unsigned long pages;
> > +
> > + /*
> > + * multiply by two, in order to account the worst case slack space
> > + * due to the power-of-two allocation sizes.
> > + */
> > + pages = DIV_ROUND_UP(2 * bytes, PAGE_SIZE);
>
> For bytes > PAGE_SIZE this doesn't look right (for SLUB). We do page
> allocator pass-through which means that we'll be grabbing high order
> pages which can be bigger than what 'pages' is here.
Hehe - you actually made me think here.
Satisfying allocations from a bucket distribution with power-of-two
(which page alloc order satisfies) has a worst case slack space of:
S(x) = 2^n - (2^(n-1)) - 1, n = ceil(log2(x))
This can be seen for the cases where x = 2^i + 1.
If we approximate S(x) by 2^(n-1) and compute the slack ratio for any
given x:
R(x) ~ 2^n / 2^(n-1) = 2
We'll see that for any amount of x, we can only use half that due to
slack space.
Therefore, by multiplying the demand @bytes by 2 we'll always have
enough to cover the worst case slack considering the power-of-two
allocation buckets.
In example, if @bytes asks for 4 pages + 1 byte = 16385 bytes (assuming
4k pages), then the above will request 8 pages + 2 bytes, rounded up to
pages, is 9 pages. Which is enough to satisfy the order 3 allocation
needed for the 8 contiguous pages to store the requested 16385 bytes.
> > Index: linux-2.6/mm/slab.c
> > ===================================================================
> > --- linux-2.6.orig/mm/slab.c
> > +++ linux-2.6/mm/slab.c
> > @@ -3854,6 +3854,81 @@ const char *kmem_cache_name(struct kmem_
> > EXPORT_SYMBOL_GPL(kmem_cache_name);
> >
> > /*
> > + * Calculate the upper bound of pages required to sequentially allocate
> > + * @objects objects from @cachep.
> > + */
> > +unsigned kmem_alloc_estimate(struct kmem_cache *cachep,
> > + gfp_t flags, int objects)
> > +{
> > + /*
> > + * (1) memory for objects,
> > + */
> > + unsigned nr_slabs = DIV_ROUND_UP(objects, cachep->num);
> > + unsigned nr_pages = nr_slabs << cachep->gfporder;
> > +
> > + /*
> > + * (2) memory for each per-cpu queue (nr_cpu_ids),
> > + * (3) memory for each per-node alien queues (nr_cpu_ids), and
> > + * (4) some amount of memory for the slab management structures
> > + *
> > + * XXX: truely account these
>
> Heh, yes please. Or add a comment why it doesn't matter.
Since you were the one I cribbed that comment from some (long) time ago,
can you advise on how well the below approximation is to an upper bound
on the above factors - assuming SLAB will live long enough to make it
worth the effort?
> > + */
> > + nr_pages += 1 + ilog2(nr_pages);
> > +
> > + return nr_pages;
> > +}
WARNING: multiple messages have this Message-ID (diff)
From: Peter Zijlstra <a.p.zijlstra@chello.nl>
To: Pekka Enberg <penberg@cs.helsinki.fi>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
Andrew Morton <akpm@linux-foundation.org>,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
netdev@vger.kernel.org, trond.myklebust@fys.uio.no,
Daniel Lezcano <dlezcano@fr.ibm.com>, Neil Brown <neilb@suse.de>,
cl@linux-foundation.org
Subject: Re: [PATCH 06/30] mm: kmem_alloc_estimate()
Date: Wed, 30 Jul 2008 15:31:02 +0200 [thread overview]
Message-ID: <1217424662.8157.58.camel@twins> (raw)
In-Reply-To: <1217420503.7813.170.camel@penberg-laptop>
On Wed, 2008-07-30 at 15:21 +0300, Pekka Enberg wrote:
> Hi Peter,
>
> On Thu, 2008-07-24 at 16:00 +0200, Peter Zijlstra wrote:
> Just a nitpick, but:
>
> > +unsigned kmalloc_estimate_fixed(size_t, gfp_t, int);
>
> kmalloc_estimate_objs()?
>
> > +unsigned kmalloc_estimate_variable(gfp_t, size_t);
>
> kmalloc_estimate_bytes()?
Sounds good, I'll do some sed magic on the patch-set to make it happen.
> >
> > /*
> > * Allocator specific definitions. These are mainly used to establish optimized
> > Index: linux-2.6/mm/slub.c
> > ===================================================================
> > --- linux-2.6.orig/mm/slub.c
> > +++ linux-2.6/mm/slub.c
> > @@ -2412,6 +2412,42 @@ const char *kmem_cache_name(struct kmem_
> > }
> > EXPORT_SYMBOL(kmem_cache_name);
> >
> > +/*
> > + * Calculate the upper bound of pages required to sequentially allocate
> > + * @objects objects from @cachep.
> > + *
> > + * We should use s->min_objects because those are the least efficient.
> > + */
> > +unsigned kmem_alloc_estimate(struct kmem_cache *s, gfp_t flags, int objects)
> > +{
> > + unsigned long pages;
> > + struct kmem_cache_order_objects x;
> > +
> > + if (WARN_ON(!s) || WARN_ON(!oo_objects(s->min)))
> > + return 0;
> > +
> > + x = s->min;
> > + pages = DIV_ROUND_UP(objects, oo_objects(x)) << oo_order(x);
> > +
> > + /*
> > + * Account the possible additional overhead if the slab holds more that
> > + * one object. Use s->max_objects because that's the worst case.
> > + */
> > + x = s->oo;
> > + if (oo_objects(x) > 1) {
>
> Hmm, I'm not sure why slab with just one object is treated separately
> here. Surely you have per-CPU slabs then as well?
The thought was that if the slab only contains 1 obj, then the per-cpu
slabs are always full (or empty but already there), so you don't loose
memory to other cpu's having half-filled slabs.
Say you want to reserve memory for 10 object.
In the 1 object per slab case, you will always allocate a slab, no
matter what cpu you do the allocation on.
With say, 16 objects per slab and allocations spread across 2 cpus, you
have to allow for per-cpu slabs to be half-filled.
> > + /*
> > + * Account the possible additional overhead if per cpu slabs
> > + * are currently empty and have to be allocated. This is very
> > + * unlikely but a possible scenario immediately after
> > + * kmem_cache_shrink.
> > + */
> > + pages += num_online_cpus() << oo_order(x);
>
> Isn't this problematic with CPU hotplug? Shouldn't we use
> num_possible_cpus() here?
ACK, thanks!
> > +/*
> > + * Calculate the upper bound of pages requires to sequentially allocate @bytes
> > + * from kmalloc in an unspecified number of allocations of nonuniform size.
> > + */
> > +unsigned kmalloc_estimate_variable(gfp_t flags, size_t bytes)
> > +{
> > + int i;
> > + unsigned long pages;
> > +
> > + /*
> > + * multiply by two, in order to account the worst case slack space
> > + * due to the power-of-two allocation sizes.
> > + */
> > + pages = DIV_ROUND_UP(2 * bytes, PAGE_SIZE);
>
> For bytes > PAGE_SIZE this doesn't look right (for SLUB). We do page
> allocator pass-through which means that we'll be grabbing high order
> pages which can be bigger than what 'pages' is here.
Hehe - you actually made me think here.
Satisfying allocations from a bucket distribution with power-of-two
(which page alloc order satisfies) has a worst case slack space of:
S(x) = 2^n - (2^(n-1)) - 1, n = ceil(log2(x))
This can be seen for the cases where x = 2^i + 1.
If we approximate S(x) by 2^(n-1) and compute the slack ratio for any
given x:
R(x) ~ 2^n / 2^(n-1) = 2
We'll see that for any amount of x, we can only use half that due to
slack space.
Therefore, by multiplying the demand @bytes by 2 we'll always have
enough to cover the worst case slack considering the power-of-two
allocation buckets.
In example, if @bytes asks for 4 pages + 1 byte = 16385 bytes (assuming
4k pages), then the above will request 8 pages + 2 bytes, rounded up to
pages, is 9 pages. Which is enough to satisfy the order 3 allocation
needed for the 8 contiguous pages to store the requested 16385 bytes.
> > Index: linux-2.6/mm/slab.c
> > ===================================================================
> > --- linux-2.6.orig/mm/slab.c
> > +++ linux-2.6/mm/slab.c
> > @@ -3854,6 +3854,81 @@ const char *kmem_cache_name(struct kmem_
> > EXPORT_SYMBOL_GPL(kmem_cache_name);
> >
> > /*
> > + * Calculate the upper bound of pages required to sequentially allocate
> > + * @objects objects from @cachep.
> > + */
> > +unsigned kmem_alloc_estimate(struct kmem_cache *cachep,
> > + gfp_t flags, int objects)
> > +{
> > + /*
> > + * (1) memory for objects,
> > + */
> > + unsigned nr_slabs = DIV_ROUND_UP(objects, cachep->num);
> > + unsigned nr_pages = nr_slabs << cachep->gfporder;
> > +
> > + /*
> > + * (2) memory for each per-cpu queue (nr_cpu_ids),
> > + * (3) memory for each per-node alien queues (nr_cpu_ids), and
> > + * (4) some amount of memory for the slab management structures
> > + *
> > + * XXX: truely account these
>
> Heh, yes please. Or add a comment why it doesn't matter.
Since you were the one I cribbed that comment from some (long) time ago,
can you advise on how well the below approximation is to an upper bound
on the above factors - assuming SLAB will live long enough to make it
worth the effort?
> > + */
> > + nr_pages += 1 + ilog2(nr_pages);
> > +
> > + return nr_pages;
> > +}
--
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/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2008-07-30 13:31 UTC|newest]
Thread overview: 148+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-07-24 14:00 [PATCH 00/30] Swap over NFS -v18 Peter Zijlstra
2008-07-24 14:00 ` Peter Zijlstra
2008-07-24 14:00 ` [PATCH 01/30] swap over network documentation Peter Zijlstra
2008-07-24 14:00 ` Peter Zijlstra, Neil Brown
2008-07-24 14:00 ` [PATCH 02/30] mm: gfp_to_alloc_flags() Peter Zijlstra
2008-07-24 14:00 ` Peter Zijlstra
2008-08-12 5:01 ` Neil Brown
2008-08-12 5:01 ` Neil Brown
2008-08-12 7:33 ` Peter Zijlstra
2008-08-12 7:33 ` Peter Zijlstra
2008-08-12 9:33 ` Neil Brown
2008-08-12 9:33 ` Neil Brown
2008-07-24 14:00 ` [PATCH 03/30] mm: tag reseve pages Peter Zijlstra
2008-07-24 14:00 ` Peter Zijlstra
2008-07-24 14:00 ` [PATCH 04/30] mm: slub: trivial cleanups Peter Zijlstra
2008-07-24 14:00 ` Peter Zijlstra
2008-07-28 9:43 ` Pekka Enberg
2008-07-28 9:43 ` Pekka Enberg
2008-07-28 10:19 ` Peter Zijlstra
2008-07-28 10:19 ` Peter Zijlstra
2008-07-30 13:59 ` Christoph Lameter
2008-07-30 13:59 ` Christoph Lameter
2008-07-30 14:13 ` Peter Zijlstra
2008-07-30 14:13 ` Peter Zijlstra
2008-07-29 22:15 ` Pekka Enberg
2008-07-29 22:15 ` Pekka Enberg
2008-07-24 14:00 ` [PATCH 05/30] mm: slb: add knowledge of reserve pages Peter Zijlstra
2008-07-24 14:00 ` Peter Zijlstra
2008-08-12 5:35 ` Neil Brown
2008-08-12 5:35 ` Neil Brown
2008-08-12 7:22 ` Peter Zijlstra
2008-08-12 7:22 ` Peter Zijlstra
2008-08-12 9:35 ` Neil Brown
2008-08-12 9:35 ` Neil Brown
2008-08-12 10:23 ` Peter Zijlstra
2008-08-12 10:23 ` Peter Zijlstra
2008-07-24 14:00 ` [PATCH 06/30] mm: kmem_alloc_estimate() Peter Zijlstra
2008-07-24 14:00 ` Peter Zijlstra
2008-07-30 12:21 ` Pekka Enberg
2008-07-30 12:21 ` Pekka Enberg
2008-07-30 13:31 ` Peter Zijlstra [this message]
2008-07-30 13:31 ` Peter Zijlstra
2008-07-30 20:02 ` Christoph Lameter
2008-07-30 20:02 ` Christoph Lameter
2008-07-24 14:00 ` [PATCH 07/30] mm: allow PF_MEMALLOC from softirq context Peter Zijlstra
2008-07-24 14:00 ` Peter Zijlstra
2008-07-24 14:00 ` [PATCH 08/30] mm: serialize access to min_free_kbytes Peter Zijlstra
2008-07-24 14:00 ` Peter Zijlstra
2008-07-30 12:36 ` Pekka Enberg
2008-07-30 12:36 ` Pekka Enberg
2008-07-24 14:00 ` [PATCH 09/30] mm: emergency pool Peter Zijlstra
2008-07-24 14:00 ` Peter Zijlstra
2008-07-24 14:00 ` [PATCH 10/30] mm: system wide ALLOC_NO_WATERMARK Peter Zijlstra
2008-07-24 14:00 ` Peter Zijlstra
2008-07-24 14:00 ` [PATCH 11/30] mm: __GFP_MEMALLOC Peter Zijlstra
2008-07-24 14:00 ` Peter Zijlstra
2008-07-25 9:29 ` KOSAKI Motohiro
2008-07-25 9:29 ` KOSAKI Motohiro
2008-07-25 9:35 ` Peter Zijlstra
2008-07-25 9:35 ` Peter Zijlstra
2008-07-25 9:39 ` KOSAKI Motohiro
2008-07-25 9:39 ` KOSAKI Motohiro
2008-07-24 14:00 ` [PATCH 12/30] mm: memory reserve management Peter Zijlstra
2008-07-24 14:00 ` Peter Zijlstra
2008-07-28 10:06 ` Pekka Enberg
2008-07-28 10:06 ` Pekka Enberg
2008-07-28 10:17 ` Peter Zijlstra
2008-07-28 10:17 ` Peter Zijlstra
2008-07-28 10:29 ` Pekka Enberg
2008-07-28 10:29 ` Pekka Enberg
2008-07-28 10:39 ` Peter Zijlstra
2008-07-28 10:39 ` Peter Zijlstra
2008-07-28 10:41 ` Pekka Enberg
2008-07-28 10:41 ` Pekka Enberg
2008-07-28 16:59 ` Matt Mackall
2008-07-28 16:59 ` Matt Mackall
2008-07-28 17:13 ` Peter Zijlstra
2008-07-28 17:13 ` Peter Zijlstra
2008-07-28 16:49 ` Matt Mackall
2008-07-28 16:49 ` Matt Mackall
2008-07-28 17:13 ` Peter Zijlstra
2008-07-28 17:13 ` Peter Zijlstra
2008-08-12 6:23 ` Neil Brown
2008-08-12 6:23 ` Neil Brown
2008-08-12 8:10 ` Peter Zijlstra
2008-08-12 8:10 ` Peter Zijlstra
2008-08-12 7:46 ` Neil Brown
2008-08-12 7:46 ` Neil Brown
2008-08-12 8:12 ` Peter Zijlstra
2008-08-12 8:12 ` Peter Zijlstra
2008-07-24 14:00 ` [PATCH 13/30] selinux: tag avc cache alloc as non-critical Peter Zijlstra
2008-07-24 14:00 ` Peter Zijlstra
2008-07-24 14:00 ` [PATCH 14/30] net: wrap sk->sk_backlog_rcv() Peter Zijlstra
2008-07-24 14:00 ` Peter Zijlstra
2008-07-24 14:00 ` [PATCH 15/30] net: packet split receive api Peter Zijlstra
2008-07-24 14:00 ` Peter Zijlstra
2008-07-24 14:00 ` [PATCH 16/30] net: sk_allocation() - concentrate socket related allocations Peter Zijlstra
2008-07-24 14:00 ` Peter Zijlstra
2008-07-24 14:00 ` [PATCH 17/30] netvm: network reserve infrastructure Peter Zijlstra
2008-07-24 14:00 ` Peter Zijlstra
2008-07-24 14:01 ` [PATCH 18/30] netvm: INET reserves Peter Zijlstra
2008-07-24 14:01 ` Peter Zijlstra
2008-10-01 11:38 ` Daniel Lezcano
2008-10-01 11:38 ` Daniel Lezcano
2008-10-01 18:56 ` Peter Zijlstra
2008-10-01 18:56 ` Peter Zijlstra
2008-07-24 14:01 ` [PATCH 19/30] netvm: hook skb allocation to reserves Peter Zijlstra
2008-07-24 14:01 ` Peter Zijlstra
2008-07-24 14:01 ` [PATCH 20/30] netvm: filter emergency skbs Peter Zijlstra
2008-07-24 14:01 ` Peter Zijlstra
2008-07-24 14:01 ` [PATCH 21/30] netvm: prevent a stream specific deadlock Peter Zijlstra
2008-07-24 14:01 ` Peter Zijlstra
2008-07-24 14:01 ` [PATCH 22/30] netfilter: NF_QUEUE vs emergency skbs Peter Zijlstra
2008-07-24 14:01 ` Peter Zijlstra
2008-07-24 14:01 ` [PATCH 23/30] netvm: skb processing Peter Zijlstra
2008-07-24 14:01 ` Peter Zijlstra
2008-07-24 14:01 ` [PATCH 24/30] mm: add support for non block device backed swap files Peter Zijlstra
2008-07-24 14:01 ` Peter Zijlstra
2008-07-24 14:01 ` [PATCH 25/30] mm: methods for teaching filesystems about PG_swapcache pages Peter Zijlstra
2008-07-24 14:01 ` Peter Zijlstra
2008-07-24 14:01 ` [PATCH 26/30] nfs: remove mempools Peter Zijlstra
2008-07-24 14:01 ` Peter Zijlstra
2008-07-24 14:46 ` Nick Piggin
2008-07-24 14:46 ` Nick Piggin
2008-07-24 14:53 ` Peter Zijlstra
2008-07-24 14:53 ` Peter Zijlstra
2008-07-24 14:01 ` [PATCH 27/30] nfs: teach the NFS client how to treat PG_swapcache pages Peter Zijlstra
2008-07-24 14:01 ` Peter Zijlstra
2008-07-24 14:01 ` [PATCH 28/30] nfs: disable data cache revalidation for swapfiles Peter Zijlstra
2008-07-24 14:01 ` Peter Zijlstra
2008-07-24 14:01 ` [PATCH 29/30] nfs: enable swap on NFS Peter Zijlstra
2008-07-24 14:01 ` Peter Zijlstra
2008-07-24 14:01 ` [PATCH 30/30] nfs: fix various memory recursions possible with swap over NFS Peter Zijlstra
2008-07-24 14:01 ` Peter Zijlstra
2008-07-25 10:46 ` KOSAKI Motohiro
2008-07-25 10:46 ` KOSAKI Motohiro
2008-07-25 10:57 ` Peter Zijlstra
2008-07-25 10:57 ` Peter Zijlstra
2008-07-25 11:15 ` KOSAKI Motohiro
2008-07-25 11:15 ` KOSAKI Motohiro
2008-07-25 11:19 ` Peter Zijlstra
2008-07-25 11:19 ` Peter Zijlstra
2008-09-30 12:41 ` [PATCH 00/30] Swap over NFS -v18 Peter Zijlstra
2008-09-30 12:41 ` Peter Zijlstra
2008-09-30 15:46 ` Daniel Lezcano
2008-09-30 15:46 ` Daniel Lezcano
-- strict thread matches above, loose matches on Subject: below --
2008-03-20 20:10 [PATCH 00/30] Swap over NFS -v17 Peter Zijlstra
2008-03-20 20:10 ` [PATCH 06/30] mm: kmem_alloc_estimate() Peter Zijlstra
2008-03-20 20:10 ` Peter Zijlstra
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=1217424662.8157.58.camel@twins \
--to=a.p.zijlstra@chello.nl \
--cc=akpm@linux-foundation.org \
--cc=cl@linux-foundation.org \
--cc=dlezcano@fr.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=neilb@suse.de \
--cc=netdev@vger.kernel.org \
--cc=penberg@cs.helsinki.fi \
--cc=torvalds@linux-foundation.org \
--cc=trond.myklebust@fys.uio.no \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.