All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jason Baron <jbaron@akamai.com>
To: Johannes Weiner <hannes@cmpxchg.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	David Miller <davem@davemloft.net>,
	Vladimir Davydov <vdavydov@virtuozzo.com>,
	Michal Hocko <mhocko@suse.cz>, Tejun Heo <tj@kernel.org>,
	Eric Dumazet <eric.dumazet@gmail.com>,
	netdev@vger.kernel.org, linux-mm@kvack.org,
	cgroups@vger.kernel.org, linux-kernel@vger.kernel.org,
	kernel-team@fb.com, "peterz@infradead.org" <peterz@infradead.org>
Subject: Re: [PATCH 09/13] mm: memcontrol: generalize the socket accounting jump label
Date: Mon, 30 Nov 2015 17:28:49 -0500	[thread overview]
Message-ID: <565CCDA1.905@akamai.com> (raw)
In-Reply-To: <20151130215007.GA31903@cmpxchg.org>

On 11/30/2015 04:50 PM, Johannes Weiner wrote:
> On Mon, Nov 30, 2015 at 04:08:18PM -0500, Jason Baron wrote:
>> We're trying to move to the updated API, so this should be:
>> static_branch_unlikely(&memcg_sockets_enabled_key)
>>
>> see: include/linux/jump_label.h for details.
> 
> Good point. There is another struct static_key in there as well. How
> about the following on top of this series?
> 

Looks fine - you may be able to make use of
'static_branch_enable()/disable()' instead of the inc()/dec() to simply
set the branch direction, if you think its more readable. Although I
didn't look to see if it would be racy here.

Thanks,

-Jason


> ---
> From b784aa0323628d43272e13a67ead2a2ce0e93ea6 Mon Sep 17 00:00:00 2001
> From: Johannes Weiner <hannes@cmpxchg.org>
> Date: Mon, 30 Nov 2015 16:41:38 -0500
> Subject: [PATCH] mm: memcontrol: switch to the updated jump-label API
> 
> According to <linux/jump_label.h> the direct use of struct static_key
> is deprecated. Update the socket and slab accounting code accordingly.
> 
> Reported-by: Jason Baron <jbaron@akamai.com>
> Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>
> ---
>  include/linux/memcontrol.h |  8 ++++----
>  mm/memcontrol.c            | 12 ++++++------
>  net/ipv4/tcp_memcontrol.c  |  4 ++--
>  3 files changed, 12 insertions(+), 12 deletions(-)
> 
> diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
> index a8df46c..9a19590 100644
> --- a/include/linux/memcontrol.h
> +++ b/include/linux/memcontrol.h
> @@ -704,8 +704,8 @@ static inline void mem_cgroup_wb_stats(struct bdi_writeback *wb,
>  
>  #ifdef CONFIG_INET
>  struct sock;
> -extern struct static_key memcg_sockets_enabled_key;
> -#define mem_cgroup_sockets_enabled static_key_false(&memcg_sockets_enabled_key)
> +extern struct static_key_false memcg_sockets_enabled_key;
> +#define mem_cgroup_sockets_enabled static_branch_unlikely(&memcg_sockets_enabled_key)
>  void sock_update_memcg(struct sock *sk);
>  void sock_release_memcg(struct sock *sk);
>  bool mem_cgroup_charge_skmem(struct mem_cgroup *memcg, unsigned int nr_pages);
> @@ -727,7 +727,7 @@ static inline bool mem_cgroup_under_socket_pressure(struct mem_cgroup *memcg)
>  #endif /* CONFIG_INET */
>  
>  #ifdef CONFIG_MEMCG_KMEM
> -extern struct static_key memcg_kmem_enabled_key;
> +extern struct static_key_false memcg_kmem_enabled_key;
>  
>  extern int memcg_nr_cache_ids;
>  void memcg_get_cache_ids(void);
> @@ -743,7 +743,7 @@ void memcg_put_cache_ids(void);
>  
>  static inline bool memcg_kmem_enabled(void)
>  {
> -	return static_key_false(&memcg_kmem_enabled_key);
> +	return static_branch_unlikely(&memcg_kmem_enabled_key);
>  }
>  
>  static inline bool memcg_kmem_is_active(struct mem_cgroup *memcg)
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index a0da91f..5fe45d68 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -346,7 +346,7 @@ void memcg_put_cache_ids(void)
>   * conditional to this static branch, we'll have to allow modules that does
>   * kmem_cache_alloc and the such to see this symbol as well
>   */
> -struct static_key memcg_kmem_enabled_key;
> +DEFINE_STATIC_KEY_FALSE(memcg_kmem_enabled_key);
>  EXPORT_SYMBOL(memcg_kmem_enabled_key);
>  
>  #endif /* CONFIG_MEMCG_KMEM */
> @@ -2883,7 +2883,7 @@ static int memcg_activate_kmem(struct mem_cgroup *memcg,
>  	err = page_counter_limit(&memcg->kmem, nr_pages);
>  	VM_BUG_ON(err);
>  
> -	static_key_slow_inc(&memcg_kmem_enabled_key);
> +	static_branch_inc(&memcg_kmem_enabled_key);
>  	/*
>  	 * A memory cgroup is considered kmem-active as soon as it gets
>  	 * kmemcg_id. Setting the id after enabling static branching will
> @@ -3622,7 +3622,7 @@ static void memcg_destroy_kmem(struct mem_cgroup *memcg)
>  {
>  	if (memcg->kmem_acct_activated) {
>  		memcg_destroy_kmem_caches(memcg);
> -		static_key_slow_dec(&memcg_kmem_enabled_key);
> +		static_branch_dec(&memcg_kmem_enabled_key);
>  		WARN_ON(page_counter_read(&memcg->kmem));
>  	}
>  	tcp_destroy_cgroup(memcg);
> @@ -4258,7 +4258,7 @@ mem_cgroup_css_online(struct cgroup_subsys_state *css)
>  
>  #ifdef CONFIG_INET
>  	if (cgroup_subsys_on_dfl(memory_cgrp_subsys) && !cgroup_memory_nosocket)
> -		static_key_slow_inc(&memcg_sockets_enabled_key);
> +		static_branch_inc(&memcg_sockets_enabled_key);
>  #endif
>  
>  	/*
> @@ -4302,7 +4302,7 @@ static void mem_cgroup_css_free(struct cgroup_subsys_state *css)
>  	memcg_destroy_kmem(memcg);
>  #ifdef CONFIG_INET
>  	if (cgroup_subsys_on_dfl(memory_cgrp_subsys) && !cgroup_memory_nosocket)
> -		static_key_slow_dec(&memcg_sockets_enabled_key);
> +		static_branch_dec(&memcg_sockets_enabled_key);
>  #endif
>  	__mem_cgroup_free(memcg);
>  }
> @@ -5494,7 +5494,7 @@ void mem_cgroup_replace_page(struct page *oldpage, struct page *newpage)
>  
>  #ifdef CONFIG_INET
>  
> -struct static_key memcg_sockets_enabled_key;
> +DEFINE_STATIC_KEY_FALSE(memcg_sockets_enabled_key);
>  EXPORT_SYMBOL(memcg_sockets_enabled_key);
>  
>  void sock_update_memcg(struct sock *sk)
> diff --git a/net/ipv4/tcp_memcontrol.c b/net/ipv4/tcp_memcontrol.c
> index 9a22e2d..18bc7f7 100644
> --- a/net/ipv4/tcp_memcontrol.c
> +++ b/net/ipv4/tcp_memcontrol.c
> @@ -34,7 +34,7 @@ void tcp_destroy_cgroup(struct mem_cgroup *memcg)
>  		return;
>  
>  	if (memcg->tcp_mem.active)
> -		static_key_slow_dec(&memcg_sockets_enabled_key);
> +		static_branch_dec(&memcg_sockets_enabled_key);
>  }
>  
>  static int tcp_update_limit(struct mem_cgroup *memcg, unsigned long nr_pages)
> @@ -65,7 +65,7 @@ static int tcp_update_limit(struct mem_cgroup *memcg, unsigned long nr_pages)
>  		 * because when this value change, the code to process it is not
>  		 * patched in yet.
>  		 */
> -		static_key_slow_inc(&memcg_sockets_enabled_key);
> +		static_branch_inc(&memcg_sockets_enabled_key);
>  		memcg->tcp_mem.active = true;
>  	}
>  
> 

WARNING: multiple messages have this Message-ID (diff)
From: Jason Baron <jbaron@akamai.com>
To: Johannes Weiner <hannes@cmpxchg.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	David Miller <davem@davemloft.net>,
	Vladimir Davydov <vdavydov@virtuozzo.com>,
	Michal Hocko <mhocko@suse.cz>, Tejun Heo <tj@kernel.org>,
	Eric Dumazet <eric.dumazet@gmail.com>,
	netdev@vger.kernel.org, linux-mm@kvack.org,
	cgroups@vger.kernel.org, linux-kernel@vger.kernel.org,
	kernel-team@fb.com, "peterz@infradead.org" <peterz@infradead.org>
Subject: Re: [PATCH 09/13] mm: memcontrol: generalize the socket accounting jump label
Date: Mon, 30 Nov 2015 17:28:49 -0500	[thread overview]
Message-ID: <565CCDA1.905@akamai.com> (raw)
In-Reply-To: <20151130215007.GA31903@cmpxchg.org>

On 11/30/2015 04:50 PM, Johannes Weiner wrote:
> On Mon, Nov 30, 2015 at 04:08:18PM -0500, Jason Baron wrote:
>> We're trying to move to the updated API, so this should be:
>> static_branch_unlikely(&memcg_sockets_enabled_key)
>>
>> see: include/linux/jump_label.h for details.
> 
> Good point. There is another struct static_key in there as well. How
> about the following on top of this series?
> 

Looks fine - you may be able to make use of
'static_branch_enable()/disable()' instead of the inc()/dec() to simply
set the branch direction, if you think its more readable. Although I
didn't look to see if it would be racy here.

Thanks,

-Jason


> ---
> From b784aa0323628d43272e13a67ead2a2ce0e93ea6 Mon Sep 17 00:00:00 2001
> From: Johannes Weiner <hannes@cmpxchg.org>
> Date: Mon, 30 Nov 2015 16:41:38 -0500
> Subject: [PATCH] mm: memcontrol: switch to the updated jump-label API
> 
> According to <linux/jump_label.h> the direct use of struct static_key
> is deprecated. Update the socket and slab accounting code accordingly.
> 
> Reported-by: Jason Baron <jbaron@akamai.com>
> Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>
> ---
>  include/linux/memcontrol.h |  8 ++++----
>  mm/memcontrol.c            | 12 ++++++------
>  net/ipv4/tcp_memcontrol.c  |  4 ++--
>  3 files changed, 12 insertions(+), 12 deletions(-)
> 
> diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
> index a8df46c..9a19590 100644
> --- a/include/linux/memcontrol.h
> +++ b/include/linux/memcontrol.h
> @@ -704,8 +704,8 @@ static inline void mem_cgroup_wb_stats(struct bdi_writeback *wb,
>  
>  #ifdef CONFIG_INET
>  struct sock;
> -extern struct static_key memcg_sockets_enabled_key;
> -#define mem_cgroup_sockets_enabled static_key_false(&memcg_sockets_enabled_key)
> +extern struct static_key_false memcg_sockets_enabled_key;
> +#define mem_cgroup_sockets_enabled static_branch_unlikely(&memcg_sockets_enabled_key)
>  void sock_update_memcg(struct sock *sk);
>  void sock_release_memcg(struct sock *sk);
>  bool mem_cgroup_charge_skmem(struct mem_cgroup *memcg, unsigned int nr_pages);
> @@ -727,7 +727,7 @@ static inline bool mem_cgroup_under_socket_pressure(struct mem_cgroup *memcg)
>  #endif /* CONFIG_INET */
>  
>  #ifdef CONFIG_MEMCG_KMEM
> -extern struct static_key memcg_kmem_enabled_key;
> +extern struct static_key_false memcg_kmem_enabled_key;
>  
>  extern int memcg_nr_cache_ids;
>  void memcg_get_cache_ids(void);
> @@ -743,7 +743,7 @@ void memcg_put_cache_ids(void);
>  
>  static inline bool memcg_kmem_enabled(void)
>  {
> -	return static_key_false(&memcg_kmem_enabled_key);
> +	return static_branch_unlikely(&memcg_kmem_enabled_key);
>  }
>  
>  static inline bool memcg_kmem_is_active(struct mem_cgroup *memcg)
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index a0da91f..5fe45d68 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -346,7 +346,7 @@ void memcg_put_cache_ids(void)
>   * conditional to this static branch, we'll have to allow modules that does
>   * kmem_cache_alloc and the such to see this symbol as well
>   */
> -struct static_key memcg_kmem_enabled_key;
> +DEFINE_STATIC_KEY_FALSE(memcg_kmem_enabled_key);
>  EXPORT_SYMBOL(memcg_kmem_enabled_key);
>  
>  #endif /* CONFIG_MEMCG_KMEM */
> @@ -2883,7 +2883,7 @@ static int memcg_activate_kmem(struct mem_cgroup *memcg,
>  	err = page_counter_limit(&memcg->kmem, nr_pages);
>  	VM_BUG_ON(err);
>  
> -	static_key_slow_inc(&memcg_kmem_enabled_key);
> +	static_branch_inc(&memcg_kmem_enabled_key);
>  	/*
>  	 * A memory cgroup is considered kmem-active as soon as it gets
>  	 * kmemcg_id. Setting the id after enabling static branching will
> @@ -3622,7 +3622,7 @@ static void memcg_destroy_kmem(struct mem_cgroup *memcg)
>  {
>  	if (memcg->kmem_acct_activated) {
>  		memcg_destroy_kmem_caches(memcg);
> -		static_key_slow_dec(&memcg_kmem_enabled_key);
> +		static_branch_dec(&memcg_kmem_enabled_key);
>  		WARN_ON(page_counter_read(&memcg->kmem));
>  	}
>  	tcp_destroy_cgroup(memcg);
> @@ -4258,7 +4258,7 @@ mem_cgroup_css_online(struct cgroup_subsys_state *css)
>  
>  #ifdef CONFIG_INET
>  	if (cgroup_subsys_on_dfl(memory_cgrp_subsys) && !cgroup_memory_nosocket)
> -		static_key_slow_inc(&memcg_sockets_enabled_key);
> +		static_branch_inc(&memcg_sockets_enabled_key);
>  #endif
>  
>  	/*
> @@ -4302,7 +4302,7 @@ static void mem_cgroup_css_free(struct cgroup_subsys_state *css)
>  	memcg_destroy_kmem(memcg);
>  #ifdef CONFIG_INET
>  	if (cgroup_subsys_on_dfl(memory_cgrp_subsys) && !cgroup_memory_nosocket)
> -		static_key_slow_dec(&memcg_sockets_enabled_key);
> +		static_branch_dec(&memcg_sockets_enabled_key);
>  #endif
>  	__mem_cgroup_free(memcg);
>  }
> @@ -5494,7 +5494,7 @@ void mem_cgroup_replace_page(struct page *oldpage, struct page *newpage)
>  
>  #ifdef CONFIG_INET
>  
> -struct static_key memcg_sockets_enabled_key;
> +DEFINE_STATIC_KEY_FALSE(memcg_sockets_enabled_key);
>  EXPORT_SYMBOL(memcg_sockets_enabled_key);
>  
>  void sock_update_memcg(struct sock *sk)
> diff --git a/net/ipv4/tcp_memcontrol.c b/net/ipv4/tcp_memcontrol.c
> index 9a22e2d..18bc7f7 100644
> --- a/net/ipv4/tcp_memcontrol.c
> +++ b/net/ipv4/tcp_memcontrol.c
> @@ -34,7 +34,7 @@ void tcp_destroy_cgroup(struct mem_cgroup *memcg)
>  		return;
>  
>  	if (memcg->tcp_mem.active)
> -		static_key_slow_dec(&memcg_sockets_enabled_key);
> +		static_branch_dec(&memcg_sockets_enabled_key);
>  }
>  
>  static int tcp_update_limit(struct mem_cgroup *memcg, unsigned long nr_pages)
> @@ -65,7 +65,7 @@ static int tcp_update_limit(struct mem_cgroup *memcg, unsigned long nr_pages)
>  		 * because when this value change, the code to process it is not
>  		 * patched in yet.
>  		 */
> -		static_key_slow_inc(&memcg_sockets_enabled_key);
> +		static_branch_inc(&memcg_sockets_enabled_key);
>  		memcg->tcp_mem.active = true;
>  	}
>  
> 

--
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>

  reply	other threads:[~2015-11-30 22:28 UTC|newest]

Thread overview: 77+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-24 21:51 [PATCH 00/13] mm: memcontrol: account socket memory in unified hierarchy v4 Johannes Weiner
2015-11-24 21:51 ` Johannes Weiner
2015-11-24 21:51 ` [PATCH 01/13] mm: memcontrol: export root_mem_cgroup Johannes Weiner
2015-11-24 21:51   ` Johannes Weiner
2015-11-24 21:51 ` [PATCH 02/13] net: tcp_memcontrol: properly detect ancestor socket pressure Johannes Weiner
2015-11-24 21:51   ` Johannes Weiner
2015-11-24 21:51 ` [PATCH 03/13] net: tcp_memcontrol: remove bogus hierarchy pressure propagation Johannes Weiner
2015-11-24 21:51   ` Johannes Weiner
2015-11-24 21:51 ` [PATCH 04/13] net: tcp_memcontrol: protect all tcp_memcontrol calls by jump-label Johannes Weiner
2015-11-24 21:51   ` Johannes Weiner
2015-11-24 21:51 ` [PATCH 05/13] net: tcp_memcontrol: remove dead per-memcg count of allocated sockets Johannes Weiner
2015-11-24 21:51   ` Johannes Weiner
2015-11-24 21:51 ` [PATCH 06/13] net: tcp_memcontrol: simplify the per-memcg limit access Johannes Weiner
2015-11-24 21:51   ` Johannes Weiner
     [not found]   ` <1448401925-22501-7-git-send-email-hannes-druUgvl0LCNAfugRpC6u6w@public.gmane.org>
2015-11-25 16:26     ` David Miller
2015-11-25 16:26       ` David Miller
2015-11-25 16:26       ` David Miller
2015-11-24 21:51 ` [PATCH 07/13] net: tcp_memcontrol: sanitize tcp memory accounting callbacks Johannes Weiner
2015-11-24 21:51   ` Johannes Weiner
2015-11-25 16:28   ` David Miller
2015-11-25 16:28     ` David Miller
2015-11-24 21:52 ` [PATCH 08/13] net: tcp_memcontrol: simplify linkage between socket and page counter Johannes Weiner
2015-11-24 21:52   ` Johannes Weiner
     [not found]   ` <1448401925-22501-9-git-send-email-hannes-druUgvl0LCNAfugRpC6u6w@public.gmane.org>
2015-11-25 16:28     ` David Miller
2015-11-25 16:28       ` David Miller
2015-11-25 16:28       ` David Miller
2015-11-24 21:52 ` [PATCH 09/13] mm: memcontrol: generalize the socket accounting jump label Johannes Weiner
2015-11-24 21:52   ` Johannes Weiner
2015-11-25 16:29   ` David Miller
2015-11-25 16:29     ` David Miller
     [not found]   ` <1448401925-22501-10-git-send-email-hannes-druUgvl0LCNAfugRpC6u6w@public.gmane.org>
2015-11-30 21:08     ` Jason Baron
2015-11-30 21:08       ` Jason Baron
2015-11-30 21:08       ` Jason Baron
2015-11-30 21:50       ` Johannes Weiner
2015-11-30 21:50         ` Johannes Weiner
2015-11-30 21:50         ` Johannes Weiner
2015-11-30 21:50         ` Johannes Weiner
2015-11-30 22:28         ` Jason Baron [this message]
2015-11-30 22:28           ` Jason Baron
     [not found]           ` <565CCDA1.905-JqFfY2XvxFXQT0dZR+AlfA@public.gmane.org>
2015-11-30 22:46             ` Johannes Weiner
2015-11-30 22:46               ` Johannes Weiner
2015-11-30 22:46               ` Johannes Weiner
2015-11-24 21:52 ` [PATCH 10/13] mm: memcontrol: do not account memory+swap on unified hierarchy Johannes Weiner
2015-11-24 21:52   ` Johannes Weiner
2015-11-25 16:29   ` David Miller
2015-11-25 16:29     ` David Miller
2015-11-24 21:52 ` [PATCH 11/13] mm: memcontrol: move socket code for unified hierarchy accounting Johannes Weiner
2015-11-24 21:52   ` Johannes Weiner
2015-11-25 16:29   ` David Miller
2015-11-25 16:29     ` David Miller
2015-11-24 21:58 ` [PATCH 12/13] mm: memcontrol: account socket memory in unified hierarchy memory controller Johannes Weiner
2015-11-24 21:58   ` Johannes Weiner
2015-11-25 16:30   ` David Miller
2015-11-25 16:30     ` David Miller
2015-11-30 10:54   ` Vladimir Davydov
2015-11-30 10:54     ` Vladimir Davydov
2015-11-30 10:54     ` Vladimir Davydov
2015-11-30 15:26     ` Johannes Weiner
2015-11-30 15:26       ` Johannes Weiner
2015-11-30 15:26       ` Johannes Weiner
     [not found]       ` <20151130152638.GA30243-druUgvl0LCNAfugRpC6u6w@public.gmane.org>
2015-11-30 17:08         ` Vladimir Davydov
2015-11-30 17:08           ` Vladimir Davydov
2015-11-30 17:08           ` Vladimir Davydov
2015-11-30 17:08           ` Vladimir Davydov
2015-11-24 21:59 ` [PATCH 13/13] mm: memcontrol: hook up vmpressure to socket pressure Johannes Weiner
2015-11-24 21:59   ` Johannes Weiner
2015-11-25 16:30   ` David Miller
2015-11-25 16:30     ` David Miller
     [not found]   ` <20151124215940.GB1373-druUgvl0LCNAfugRpC6u6w@public.gmane.org>
2015-11-30 11:36     ` Vladimir Davydov
2015-11-30 11:36       ` Vladimir Davydov
2015-11-30 11:36       ` Vladimir Davydov
2015-11-30 11:36       ` Vladimir Davydov
2015-11-30 15:58       ` Johannes Weiner
2015-11-30 15:58         ` Johannes Weiner
2015-11-30 16:13         ` Vladimir Davydov
2015-11-30 16:13           ` Vladimir Davydov
2015-11-30 16:13           ` Vladimir Davydov

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=565CCDA1.905@akamai.com \
    --to=jbaron@akamai.com \
    --cc=akpm@linux-foundation.org \
    --cc=cgroups@vger.kernel.org \
    --cc=davem@davemloft.net \
    --cc=eric.dumazet@gmail.com \
    --cc=hannes@cmpxchg.org \
    --cc=kernel-team@fb.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mhocko@suse.cz \
    --cc=netdev@vger.kernel.org \
    --cc=peterz@infradead.org \
    --cc=tj@kernel.org \
    --cc=vdavydov@virtuozzo.com \
    /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.