From: Michal Hocko <mhocko@kernel.org> To: Johannes Weiner <hannes@cmpxchg.org> Cc: "David S. Miller" <davem@davemloft.net>, Andrew Morton <akpm@linux-foundation.org>, Vladimir Davydov <vdavydov@virtuozzo.com>, Tejun Heo <tj@kernel.org>, netdev@vger.kernel.org, linux-mm@kvack.org, cgroups@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH 4/8] mm: memcontrol: prepare for unified hierarchy socket accounting Date: Fri, 23 Oct 2015 14:39:30 +0200 [thread overview] Message-ID: <20151023123930.GM2410@dhcp22.suse.cz> (raw) In-Reply-To: <1445487696-21545-5-git-send-email-hannes@cmpxchg.org> On Thu 22-10-15 00:21:32, Johannes Weiner wrote: > The unified hierarchy memory controller will account socket > memory. Move the infrastructure functions accordingly. > > Signed-off-by: Johannes Weiner <hannes@cmpxchg.org> Acked-by: Michal Hocko <mhocko@suse.com> > --- > mm/memcontrol.c | 136 ++++++++++++++++++++++++++++---------------------------- > 1 file changed, 68 insertions(+), 68 deletions(-) > > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > index c41e6d7..3789050 100644 > --- a/mm/memcontrol.c > +++ b/mm/memcontrol.c > @@ -287,74 +287,6 @@ static inline struct mem_cgroup *mem_cgroup_from_id(unsigned short id) > return mem_cgroup_from_css(css); > } > > -/* Writing them here to avoid exposing memcg's inner layout */ > -#if defined(CONFIG_INET) && defined(CONFIG_MEMCG_KMEM) > - > -DEFINE_STATIC_KEY_FALSE(mem_cgroup_sockets); > - > -void sock_update_memcg(struct sock *sk) > -{ > - struct mem_cgroup *memcg; > - /* > - * Socket cloning can throw us here with sk_cgrp already > - * filled. It won't however, necessarily happen from > - * process context. So the test for root memcg given > - * the current task's memcg won't help us in this case. > - * > - * Respecting the original socket's memcg is a better > - * decision in this case. > - */ > - if (sk->sk_memcg) { > - BUG_ON(mem_cgroup_is_root(sk->sk_memcg)); > - css_get(&sk->sk_memcg->css); > - return; > - } > - > - rcu_read_lock(); > - memcg = mem_cgroup_from_task(current); > - if (css_tryget_online(&memcg->css)) > - sk->sk_memcg = memcg; > - rcu_read_unlock(); > -} > -EXPORT_SYMBOL(sock_update_memcg); > - > -void sock_release_memcg(struct sock *sk) > -{ > - if (sk->sk_memcg) > - css_put(&sk->sk_memcg->css); > -} > - > -/** > - * mem_cgroup_charge_skmem - charge socket memory > - * @memcg: memcg to charge > - * @nr_pages: number of pages to charge > - * > - * Charges @nr_pages to @memcg. Returns %true if the charge fit within > - * the memcg's configured limit, %false if the charge had to be forced. > - */ > -bool mem_cgroup_charge_skmem(struct mem_cgroup *memcg, unsigned int nr_pages) > -{ > - struct page_counter *counter; > - > - if (page_counter_try_charge(&memcg->skmem, nr_pages, &counter)) > - return true; > - > - page_counter_charge(&memcg->skmem, nr_pages); > - return false; > -} > - > -/** > - * mem_cgroup_uncharge_skmem - uncharge socket memory > - * @memcg: memcg to uncharge > - * @nr_pages: number of pages to uncharge > - */ > -void mem_cgroup_uncharge_skmem(struct mem_cgroup *memcg, unsigned int nr_pages) > -{ > - page_counter_uncharge(&memcg->skmem, nr_pages); > -} > - > -#endif > - > #ifdef CONFIG_MEMCG_KMEM > /* > * This will be the memcg's index in each cache's ->memcg_params.memcg_caches. > @@ -5521,6 +5453,74 @@ void mem_cgroup_replace_page(struct page *oldpage, struct page *newpage) > commit_charge(newpage, memcg, true); > } > > +/* Writing them here to avoid exposing memcg's inner layout */ > +#if defined(CONFIG_INET) && defined(CONFIG_MEMCG_KMEM) > + > +DEFINE_STATIC_KEY_FALSE(mem_cgroup_sockets); > + > +void sock_update_memcg(struct sock *sk) > +{ > + struct mem_cgroup *memcg; > + /* > + * Socket cloning can throw us here with sk_cgrp already > + * filled. It won't however, necessarily happen from > + * process context. So the test for root memcg given > + * the current task's memcg won't help us in this case. > + * > + * Respecting the original socket's memcg is a better > + * decision in this case. > + */ > + if (sk->sk_memcg) { > + BUG_ON(mem_cgroup_is_root(sk->sk_memcg)); > + css_get(&sk->sk_memcg->css); > + return; > + } > + > + rcu_read_lock(); > + memcg = mem_cgroup_from_task(current); > + if (css_tryget_online(&memcg->css)) > + sk->sk_memcg = memcg; > + rcu_read_unlock(); > +} > +EXPORT_SYMBOL(sock_update_memcg); > + > +void sock_release_memcg(struct sock *sk) > +{ > + if (sk->sk_memcg) > + css_put(&sk->sk_memcg->css); > +} > + > +/** > + * mem_cgroup_charge_skmem - charge socket memory > + * @memcg: memcg to charge > + * @nr_pages: number of pages to charge > + * > + * Charges @nr_pages to @memcg. Returns %true if the charge fit within > + * the memcg's configured limit, %false if the charge had to be forced. > + */ > +bool mem_cgroup_charge_skmem(struct mem_cgroup *memcg, unsigned int nr_pages) > +{ > + struct page_counter *counter; > + > + if (page_counter_try_charge(&memcg->skmem, nr_pages, &counter)) > + return true; > + > + page_counter_charge(&memcg->skmem, nr_pages); > + return false; > +} > + > +/** > + * mem_cgroup_uncharge_skmem - uncharge socket memory > + * @memcg: memcg to uncharge > + * @nr_pages: number of pages to uncharge > + */ > +void mem_cgroup_uncharge_skmem(struct mem_cgroup *memcg, unsigned int nr_pages) > +{ > + page_counter_uncharge(&memcg->skmem, nr_pages); > +} > + > +#endif > + > /* > * subsys_initcall() for memory controller. > * > -- > 2.6.1 -- Michal Hocko SUSE Labs
WARNING: multiple messages have this Message-ID (diff)
From: Michal Hocko <mhocko@kernel.org> To: Johannes Weiner <hannes@cmpxchg.org> Cc: "David S. Miller" <davem@davemloft.net>, Andrew Morton <akpm@linux-foundation.org>, Vladimir Davydov <vdavydov@virtuozzo.com>, Tejun Heo <tj@kernel.org>, netdev@vger.kernel.org, linux-mm@kvack.org, cgroups@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH 4/8] mm: memcontrol: prepare for unified hierarchy socket accounting Date: Fri, 23 Oct 2015 14:39:30 +0200 [thread overview] Message-ID: <20151023123930.GM2410@dhcp22.suse.cz> (raw) In-Reply-To: <1445487696-21545-5-git-send-email-hannes@cmpxchg.org> On Thu 22-10-15 00:21:32, Johannes Weiner wrote: > The unified hierarchy memory controller will account socket > memory. Move the infrastructure functions accordingly. > > Signed-off-by: Johannes Weiner <hannes@cmpxchg.org> Acked-by: Michal Hocko <mhocko@suse.com> > --- > mm/memcontrol.c | 136 ++++++++++++++++++++++++++++---------------------------- > 1 file changed, 68 insertions(+), 68 deletions(-) > > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > index c41e6d7..3789050 100644 > --- a/mm/memcontrol.c > +++ b/mm/memcontrol.c > @@ -287,74 +287,6 @@ static inline struct mem_cgroup *mem_cgroup_from_id(unsigned short id) > return mem_cgroup_from_css(css); > } > > -/* Writing them here to avoid exposing memcg's inner layout */ > -#if defined(CONFIG_INET) && defined(CONFIG_MEMCG_KMEM) > - > -DEFINE_STATIC_KEY_FALSE(mem_cgroup_sockets); > - > -void sock_update_memcg(struct sock *sk) > -{ > - struct mem_cgroup *memcg; > - /* > - * Socket cloning can throw us here with sk_cgrp already > - * filled. It won't however, necessarily happen from > - * process context. So the test for root memcg given > - * the current task's memcg won't help us in this case. > - * > - * Respecting the original socket's memcg is a better > - * decision in this case. > - */ > - if (sk->sk_memcg) { > - BUG_ON(mem_cgroup_is_root(sk->sk_memcg)); > - css_get(&sk->sk_memcg->css); > - return; > - } > - > - rcu_read_lock(); > - memcg = mem_cgroup_from_task(current); > - if (css_tryget_online(&memcg->css)) > - sk->sk_memcg = memcg; > - rcu_read_unlock(); > -} > -EXPORT_SYMBOL(sock_update_memcg); > - > -void sock_release_memcg(struct sock *sk) > -{ > - if (sk->sk_memcg) > - css_put(&sk->sk_memcg->css); > -} > - > -/** > - * mem_cgroup_charge_skmem - charge socket memory > - * @memcg: memcg to charge > - * @nr_pages: number of pages to charge > - * > - * Charges @nr_pages to @memcg. Returns %true if the charge fit within > - * the memcg's configured limit, %false if the charge had to be forced. > - */ > -bool mem_cgroup_charge_skmem(struct mem_cgroup *memcg, unsigned int nr_pages) > -{ > - struct page_counter *counter; > - > - if (page_counter_try_charge(&memcg->skmem, nr_pages, &counter)) > - return true; > - > - page_counter_charge(&memcg->skmem, nr_pages); > - return false; > -} > - > -/** > - * mem_cgroup_uncharge_skmem - uncharge socket memory > - * @memcg: memcg to uncharge > - * @nr_pages: number of pages to uncharge > - */ > -void mem_cgroup_uncharge_skmem(struct mem_cgroup *memcg, unsigned int nr_pages) > -{ > - page_counter_uncharge(&memcg->skmem, nr_pages); > -} > - > -#endif > - > #ifdef CONFIG_MEMCG_KMEM > /* > * This will be the memcg's index in each cache's ->memcg_params.memcg_caches. > @@ -5521,6 +5453,74 @@ void mem_cgroup_replace_page(struct page *oldpage, struct page *newpage) > commit_charge(newpage, memcg, true); > } > > +/* Writing them here to avoid exposing memcg's inner layout */ > +#if defined(CONFIG_INET) && defined(CONFIG_MEMCG_KMEM) > + > +DEFINE_STATIC_KEY_FALSE(mem_cgroup_sockets); > + > +void sock_update_memcg(struct sock *sk) > +{ > + struct mem_cgroup *memcg; > + /* > + * Socket cloning can throw us here with sk_cgrp already > + * filled. It won't however, necessarily happen from > + * process context. So the test for root memcg given > + * the current task's memcg won't help us in this case. > + * > + * Respecting the original socket's memcg is a better > + * decision in this case. > + */ > + if (sk->sk_memcg) { > + BUG_ON(mem_cgroup_is_root(sk->sk_memcg)); > + css_get(&sk->sk_memcg->css); > + return; > + } > + > + rcu_read_lock(); > + memcg = mem_cgroup_from_task(current); > + if (css_tryget_online(&memcg->css)) > + sk->sk_memcg = memcg; > + rcu_read_unlock(); > +} > +EXPORT_SYMBOL(sock_update_memcg); > + > +void sock_release_memcg(struct sock *sk) > +{ > + if (sk->sk_memcg) > + css_put(&sk->sk_memcg->css); > +} > + > +/** > + * mem_cgroup_charge_skmem - charge socket memory > + * @memcg: memcg to charge > + * @nr_pages: number of pages to charge > + * > + * Charges @nr_pages to @memcg. Returns %true if the charge fit within > + * the memcg's configured limit, %false if the charge had to be forced. > + */ > +bool mem_cgroup_charge_skmem(struct mem_cgroup *memcg, unsigned int nr_pages) > +{ > + struct page_counter *counter; > + > + if (page_counter_try_charge(&memcg->skmem, nr_pages, &counter)) > + return true; > + > + page_counter_charge(&memcg->skmem, nr_pages); > + return false; > +} > + > +/** > + * mem_cgroup_uncharge_skmem - uncharge socket memory > + * @memcg: memcg to uncharge > + * @nr_pages: number of pages to uncharge > + */ > +void mem_cgroup_uncharge_skmem(struct mem_cgroup *memcg, unsigned int nr_pages) > +{ > + page_counter_uncharge(&memcg->skmem, nr_pages); > +} > + > +#endif > + > /* > * subsys_initcall() for memory controller. > * > -- > 2.6.1 -- Michal Hocko SUSE Labs -- 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:[~2015-10-23 12:39 UTC|newest] Thread overview: 156+ messages / expand[flat|nested] mbox.gz Atom feed top 2015-10-22 4:21 [PATCH 0/8] mm: memcontrol: account socket memory in unified hierarchy Johannes Weiner 2015-10-22 4:21 ` Johannes Weiner 2015-10-22 4:21 ` [PATCH 1/8] mm: page_counter: let page_counter_try_charge() return bool Johannes Weiner 2015-10-22 4:21 ` Johannes Weiner 2015-10-23 11:31 ` Michal Hocko 2015-10-23 11:31 ` Michal Hocko 2015-10-22 4:21 ` [PATCH 2/8] mm: memcontrol: export root_mem_cgroup Johannes Weiner 2015-10-22 4:21 ` Johannes Weiner 2015-10-23 11:32 ` Michal Hocko 2015-10-23 11:32 ` Michal Hocko 2015-10-22 4:21 ` [PATCH 3/8] net: consolidate memcg socket buffer tracking and accounting Johannes Weiner 2015-10-22 4:21 ` Johannes Weiner 2015-10-22 18:46 ` Vladimir Davydov 2015-10-22 18:46 ` Vladimir Davydov 2015-10-22 18:46 ` Vladimir Davydov 2015-10-22 19:09 ` Johannes Weiner 2015-10-22 19:09 ` Johannes Weiner 2015-10-23 13:42 ` Vladimir Davydov 2015-10-23 13:42 ` Vladimir Davydov 2015-10-23 13:42 ` Vladimir Davydov 2015-10-23 12:38 ` Michal Hocko 2015-10-23 12:38 ` Michal Hocko 2015-10-22 4:21 ` [PATCH 4/8] mm: memcontrol: prepare for unified hierarchy socket accounting Johannes Weiner 2015-10-22 4:21 ` Johannes Weiner 2015-10-23 12:39 ` Michal Hocko [this message] 2015-10-23 12:39 ` Michal Hocko 2015-10-22 4:21 ` [PATCH 5/8] mm: memcontrol: account socket memory on unified hierarchy Johannes Weiner 2015-10-22 4:21 ` Johannes Weiner 2015-10-22 18:47 ` Vladimir Davydov 2015-10-22 18:47 ` Vladimir Davydov 2015-10-22 18:47 ` Vladimir Davydov 2015-10-23 13:19 ` Michal Hocko 2015-10-23 13:19 ` Michal Hocko 2015-10-23 13:19 ` Michal Hocko 2015-10-23 13:59 ` David Miller 2015-10-23 13:59 ` David Miller 2015-10-23 13:59 ` David Miller 2015-10-26 16:56 ` Johannes Weiner 2015-10-26 16:56 ` Johannes Weiner 2015-10-27 12:26 ` Michal Hocko 2015-10-27 12:26 ` Michal Hocko 2015-10-27 13:49 ` David Miller 2015-10-27 13:49 ` David Miller 2015-10-27 13:49 ` David Miller 2015-10-27 15:41 ` Johannes Weiner 2015-10-27 15:41 ` Johannes Weiner 2015-10-27 15:41 ` Johannes Weiner 2015-10-27 16:15 ` Michal Hocko 2015-10-27 16:15 ` Michal Hocko 2015-10-27 16:42 ` Johannes Weiner 2015-10-27 16:42 ` Johannes Weiner 2015-10-28 0:45 ` David Miller 2015-10-28 0:45 ` David Miller 2015-10-28 0:45 ` David Miller 2015-10-28 3:05 ` Johannes Weiner 2015-10-28 3:05 ` Johannes Weiner 2015-10-29 15:25 ` Michal Hocko 2015-10-29 15:25 ` Michal Hocko 2015-10-29 16:10 ` Johannes Weiner 2015-10-29 16:10 ` Johannes Weiner 2015-10-29 16:10 ` Johannes Weiner 2015-11-04 10:42 ` Michal Hocko 2015-11-04 10:42 ` Michal Hocko 2015-11-04 19:50 ` Johannes Weiner 2015-11-04 19:50 ` Johannes Weiner 2015-11-04 19:50 ` Johannes Weiner 2015-11-05 14:40 ` Michal Hocko 2015-11-05 14:40 ` Michal Hocko 2015-11-05 16:16 ` David Miller 2015-11-05 16:16 ` David Miller 2015-11-05 16:28 ` Michal Hocko 2015-11-05 16:28 ` Michal Hocko 2015-11-05 16:28 ` Michal Hocko 2015-11-05 16:30 ` David Miller 2015-11-05 16:30 ` David Miller 2015-11-05 22:32 ` Johannes Weiner 2015-11-05 22:32 ` Johannes Weiner 2015-11-05 22:32 ` Johannes Weiner 2015-11-06 12:51 ` Michal Hocko 2015-11-06 12:51 ` Michal Hocko 2015-11-05 20:55 ` Johannes Weiner 2015-11-05 20:55 ` Johannes Weiner 2015-11-05 22:52 ` Johannes Weiner 2015-11-05 22:52 ` Johannes Weiner 2015-11-05 22:52 ` Johannes Weiner 2015-11-06 10:57 ` Michal Hocko 2015-11-06 10:57 ` Michal Hocko 2015-11-06 16:19 ` Johannes Weiner 2015-11-06 16:19 ` Johannes Weiner 2015-11-06 16:46 ` Michal Hocko 2015-11-06 16:46 ` Michal Hocko 2015-11-06 16:46 ` Michal Hocko 2015-11-06 17:45 ` Johannes Weiner 2015-11-06 17:45 ` Johannes Weiner 2015-11-06 17:45 ` Johannes Weiner 2015-11-07 3:45 ` David Miller 2015-11-07 3:45 ` David Miller 2015-11-12 18:36 ` Mel Gorman 2015-11-12 18:36 ` Mel Gorman 2015-11-12 18:36 ` Mel Gorman 2015-11-12 19:12 ` Johannes Weiner 2015-11-12 19:12 ` Johannes Weiner 2015-11-06 9:05 ` Vladimir Davydov 2015-11-06 9:05 ` Vladimir Davydov 2015-11-06 9:05 ` Vladimir Davydov 2015-11-06 9:05 ` Vladimir Davydov 2015-11-06 13:29 ` Michal Hocko 2015-11-06 13:29 ` Michal Hocko 2015-11-06 16:35 ` Johannes Weiner 2015-11-06 16:35 ` Johannes Weiner 2015-11-06 13:21 ` Michal Hocko 2015-11-06 13:21 ` Michal Hocko 2015-10-22 4:21 ` [PATCH 6/8] mm: vmscan: simplify memcg vs. global shrinker invocation Johannes Weiner 2015-10-22 4:21 ` Johannes Weiner 2015-10-23 13:26 ` Michal Hocko 2015-10-23 13:26 ` Michal Hocko 2015-10-22 4:21 ` [PATCH 7/8] mm: vmscan: report vmpressure at the level of reclaim activity Johannes Weiner 2015-10-22 4:21 ` Johannes Weiner 2015-10-22 18:48 ` Vladimir Davydov 2015-10-22 18:48 ` Vladimir Davydov 2015-10-22 18:48 ` Vladimir Davydov 2015-10-22 18:48 ` Vladimir Davydov 2015-10-23 13:49 ` Michal Hocko 2015-10-23 13:49 ` Michal Hocko 2015-10-23 13:49 ` Michal Hocko 2015-10-22 4:21 ` [PATCH 8/8] mm: memcontrol: hook up vmpressure to socket pressure Johannes Weiner 2015-10-22 4:21 ` Johannes Weiner 2015-10-22 18:57 ` Vladimir Davydov 2015-10-22 18:57 ` Vladimir Davydov 2015-10-22 18:57 ` Vladimir Davydov 2015-10-22 18:45 ` [PATCH 0/8] mm: memcontrol: account socket memory in unified hierarchy Vladimir Davydov 2015-10-22 18:45 ` Vladimir Davydov 2015-10-22 18:45 ` Vladimir Davydov 2015-10-26 17:22 ` Johannes Weiner 2015-10-26 17:22 ` Johannes Weiner 2015-10-26 17:22 ` Johannes Weiner 2015-10-26 17:22 ` Johannes Weiner 2015-10-27 8:43 ` Vladimir Davydov 2015-10-27 8:43 ` Vladimir Davydov 2015-10-27 8:43 ` Vladimir Davydov 2015-10-27 16:01 ` Johannes Weiner 2015-10-27 16:01 ` Johannes Weiner 2015-10-28 8:20 ` Vladimir Davydov 2015-10-28 8:20 ` Vladimir Davydov 2015-10-28 8:20 ` Vladimir Davydov 2015-10-28 18:58 ` Johannes Weiner 2015-10-28 18:58 ` Johannes Weiner 2015-10-29 9:27 ` Vladimir Davydov 2015-10-29 9:27 ` Vladimir Davydov 2015-10-29 9:27 ` Vladimir Davydov 2015-10-29 17:52 ` Johannes Weiner 2015-10-29 17:52 ` Johannes Weiner 2015-10-29 17:52 ` Johannes Weiner 2015-11-02 14:47 ` Vladimir Davydov 2015-11-02 14:47 ` Vladimir Davydov 2015-11-02 14:47 ` 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=20151023123930.GM2410@dhcp22.suse.cz \ --to=mhocko@kernel.org \ --cc=akpm@linux-foundation.org \ --cc=cgroups@vger.kernel.org \ --cc=davem@davemloft.net \ --cc=hannes@cmpxchg.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=netdev@vger.kernel.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: linkBe 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.