From: Muchun Song <songmuchun@bytedance.com> To: Pankaj Gupta <pankaj.gupta.linux@gmail.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>, "Rafael J. Wysocki" <rafael@kernel.org>, Alexey Dobriyan <adobriyan@gmail.com>, Andrew Morton <akpm@linux-foundation.org>, Johannes Weiner <hannes@cmpxchg.org>, Michal Hocko <mhocko@kernel.org>, Vladimir Davydov <vdavydov.dev@gmail.com>, Hugh Dickins <hughd@google.com>, Shakeel Butt <shakeelb@google.com>, Roman Gushchin <guro@fb.com>, Sami Tolvanen <samitolvanen@google.com>, Feng Tang <feng.tang@intel.com>, Neil Brown <neilb@suse.de>, Joonsoo Kim <iamjoonsoo.kim@lge.com>, Randy Dunlap <rdunlap@infradead.org>, LKML <linux-kernel@vger.kernel.org>, linux-fsdevel <linux-fsdevel@vger.kernel.org>, Linux MM <linux-mm@kvack.org>, Cgroups <cgroups@vger.kernel.org> Subject: Re: [External] Re: [PATCH v3 7/7] mm: memcontrol: make the slab calculation consistent Date: Tue, 8 Dec 2020 15:53:05 +0800 [thread overview] Message-ID: <CAMZfGtV=tc3=ZbePPEWTA2ziDb1hw8KzJXc+Uiedx+xmXY--XA@mail.gmail.com> (raw) In-Reply-To: <CAM9Jb+jg7dD3u4b8P4X_6ginSM3UwVtmbdQzjaencb0r3_bAuQ@mail.gmail.com> On Tue, Dec 8, 2020 at 3:21 PM Pankaj Gupta <pankaj.gupta.linux@gmail.com> wrote: > > > Although the ratio of the slab is one, we also should read the ratio > > from the related memory_stats instead of hard-coding. And the local > > variable of size is already the value of slab_unreclaimable. So we > > do not need to read again. > > > > We can drop the ratio in struct memory_stat. This can make the code > > clean and simple. And get rid of the awkward mix of static and runtime > > initialization of the memory_stats table. > > > > Signed-off-by: Muchun Song <songmuchun@bytedance.com> > > --- > > mm/memcontrol.c | 112 ++++++++++++++++++++++++++++++++++++-------------------- > > 1 file changed, 73 insertions(+), 39 deletions(-) > > > > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > > index a40797a27f87..841ea37cc123 100644 > > --- a/mm/memcontrol.c > > +++ b/mm/memcontrol.c > > @@ -1511,49 +1511,78 @@ static bool mem_cgroup_wait_acct_move(struct mem_cgroup *memcg) > > > > struct memory_stat { > > const char *name; > > - unsigned int ratio; > > unsigned int idx; > > }; > > > > static const struct memory_stat memory_stats[] = { > > - { "anon", PAGE_SIZE, NR_ANON_MAPPED }, > > - { "file", PAGE_SIZE, NR_FILE_PAGES }, > > - { "kernel_stack", 1024, NR_KERNEL_STACK_KB }, > > - { "pagetables", PAGE_SIZE, NR_PAGETABLE }, > > - { "percpu", 1, MEMCG_PERCPU_B }, > > - { "sock", PAGE_SIZE, MEMCG_SOCK }, > > - { "shmem", PAGE_SIZE, NR_SHMEM }, > > - { "file_mapped", PAGE_SIZE, NR_FILE_MAPPED }, > > - { "file_dirty", PAGE_SIZE, NR_FILE_DIRTY }, > > - { "file_writeback", PAGE_SIZE, NR_WRITEBACK }, > > + { "anon", NR_ANON_MAPPED }, > > + { "file", NR_FILE_PAGES }, > > + { "kernel_stack", NR_KERNEL_STACK_KB }, > > + { "pagetables", NR_PAGETABLE }, > > + { "percpu", MEMCG_PERCPU_B }, > > + { "sock", MEMCG_SOCK }, > > + { "shmem", NR_SHMEM }, > > + { "file_mapped", NR_FILE_MAPPED }, > > + { "file_dirty", NR_FILE_DIRTY }, > > + { "file_writeback", NR_WRITEBACK }, > > #ifdef CONFIG_TRANSPARENT_HUGEPAGE > > - { "anon_thp", PAGE_SIZE, NR_ANON_THPS }, > > - { "file_thp", PAGE_SIZE, NR_FILE_THPS }, > > - { "shmem_thp", PAGE_SIZE, NR_SHMEM_THPS }, > > + { "anon_thp", NR_ANON_THPS }, > > + { "file_thp", NR_FILE_THPS }, > > + { "shmem_thp", NR_SHMEM_THPS }, > > #endif > > - { "inactive_anon", PAGE_SIZE, NR_INACTIVE_ANON }, > > - { "active_anon", PAGE_SIZE, NR_ACTIVE_ANON }, > > - { "inactive_file", PAGE_SIZE, NR_INACTIVE_FILE }, > > - { "active_file", PAGE_SIZE, NR_ACTIVE_FILE }, > > - { "unevictable", PAGE_SIZE, NR_UNEVICTABLE }, > > - > > - /* > > - * Note: The slab_reclaimable and slab_unreclaimable must be > > - * together and slab_reclaimable must be in front. > > - */ > > - { "slab_reclaimable", 1, NR_SLAB_RECLAIMABLE_B }, > > - { "slab_unreclaimable", 1, NR_SLAB_UNRECLAIMABLE_B }, > > + { "inactive_anon", NR_INACTIVE_ANON }, > > + { "active_anon", NR_ACTIVE_ANON }, > > + { "inactive_file", NR_INACTIVE_FILE }, > > + { "active_file", NR_ACTIVE_FILE }, > > + { "unevictable", NR_UNEVICTABLE }, > > + { "slab_reclaimable", NR_SLAB_RECLAIMABLE_B }, > > + { "slab_unreclaimable", NR_SLAB_UNRECLAIMABLE_B }, > > > > /* The memory events */ > > - { "workingset_refault_anon", 1, WORKINGSET_REFAULT_ANON }, > > - { "workingset_refault_file", 1, WORKINGSET_REFAULT_FILE }, > > - { "workingset_activate_anon", 1, WORKINGSET_ACTIVATE_ANON }, > > - { "workingset_activate_file", 1, WORKINGSET_ACTIVATE_FILE }, > > - { "workingset_restore_anon", 1, WORKINGSET_RESTORE_ANON }, > > - { "workingset_restore_file", 1, WORKINGSET_RESTORE_FILE }, > > - { "workingset_nodereclaim", 1, WORKINGSET_NODERECLAIM }, > > + { "workingset_refault_anon", WORKINGSET_REFAULT_ANON }, > > + { "workingset_refault_file", WORKINGSET_REFAULT_FILE }, > > + { "workingset_activate_anon", WORKINGSET_ACTIVATE_ANON }, > > + { "workingset_activate_file", WORKINGSET_ACTIVATE_FILE }, > > + { "workingset_restore_anon", WORKINGSET_RESTORE_ANON }, > > + { "workingset_restore_file", WORKINGSET_RESTORE_FILE }, > > + { "workingset_nodereclaim", WORKINGSET_NODERECLAIM }, > > }; > > > > +/* Translate stat items to the correct unit for memory.stat output */ > > +static int memcg_page_state_unit(int item) > > +{ > > + int unit; > > + > > + switch (item) { > > + case MEMCG_PERCPU_B: > > + case NR_SLAB_RECLAIMABLE_B: > > + case NR_SLAB_UNRECLAIMABLE_B: > > + case WORKINGSET_REFAULT_ANON: > > + case WORKINGSET_REFAULT_FILE: > > + case WORKINGSET_ACTIVATE_ANON: > > + case WORKINGSET_ACTIVATE_FILE: > > + case WORKINGSET_RESTORE_ANON: > > + case WORKINGSET_RESTORE_FILE: > > + case WORKINGSET_NODERECLAIM: > > + unit = 1; > > + break; > > + case NR_KERNEL_STACK_KB: > > + unit = SZ_1K; > > + break; > > + default: > > + unit = PAGE_SIZE; > > + break; > break not needed here, or maybe we can return for every case, > that will avoid "unit" variable. Yeah, thanks. > > > + } > > + > > + return unit; > > +} > > + > > +static inline unsigned long memcg_page_state_output(struct mem_cgroup *memcg, > > + int item) > > +{ > > + return memcg_page_state(memcg, item) * memcg_page_state_unit(item); > > +} > > + > > static char *memory_stat_format(struct mem_cgroup *memcg) > > { > > struct seq_buf s; > > @@ -1577,13 +1606,12 @@ static char *memory_stat_format(struct mem_cgroup *memcg) > > for (i = 0; i < ARRAY_SIZE(memory_stats); i++) { > > u64 size; > > > > - size = memcg_page_state(memcg, memory_stats[i].idx); > > - size *= memory_stats[i].ratio; > > + size = memcg_page_state_output(memcg, memory_stats[i].idx); > > seq_buf_printf(&s, "%s %llu\n", memory_stats[i].name, size); > > > > if (unlikely(memory_stats[i].idx == NR_SLAB_UNRECLAIMABLE_B)) { > > - size = memcg_page_state(memcg, NR_SLAB_RECLAIMABLE_B) + > > - memcg_page_state(memcg, NR_SLAB_UNRECLAIMABLE_B); > > + size += > (memcg, > > + NR_SLAB_RECLAIMABLE_B); > > seq_buf_printf(&s, "slab %llu\n", size); > > } > > } > > @@ -6377,6 +6405,12 @@ static int memory_stat_show(struct seq_file *m, void *v) > > } > > > > #ifdef CONFIG_NUMA > > +static inline unsigned long lruvec_page_state_output(struct lruvec *lruvec, > > + int item) > > +{ > > + return lruvec_page_state(lruvec, item) * memcg_page_state_unit(item); > > +} > > + > > static int memory_numa_stat_show(struct seq_file *m, void *v) > > { > > int i; > > @@ -6394,8 +6428,8 @@ static int memory_numa_stat_show(struct seq_file *m, void *v) > > struct lruvec *lruvec; > > > > lruvec = mem_cgroup_lruvec(memcg, NODE_DATA(nid)); > > - size = lruvec_page_state(lruvec, memory_stats[i].idx); > > - size *= memory_stats[i].ratio; > > + size = lruvec_page_state_output(lruvec, > > + memory_stats[i].idx); > > seq_printf(m, " N%d=%llu", nid, size); > > } > > seq_putc(m, '\n'); > > -- > > 2.11.0 > > > > -- Yours, Muchun
WARNING: multiple messages have this Message-ID (diff)
From: Muchun Song <songmuchun-EC8Uxl6Npydl57MIdRCFDg@public.gmane.org> To: Pankaj Gupta <pankaj.gupta.linux-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> Cc: Greg Kroah-Hartman <gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org>, "Rafael J. Wysocki" <rafael-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>, Alexey Dobriyan <adobriyan-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>, Andrew Morton <akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>, Johannes Weiner <hannes-druUgvl0LCNAfugRpC6u6w@public.gmane.org>, Michal Hocko <mhocko-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>, Vladimir Davydov <vdavydov.dev-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>, Hugh Dickins <hughd-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>, Shakeel Butt <shakeelb-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>, Roman Gushchin <guro-b10kYP2dOMg@public.gmane.org>, Sami Tolvanen <samitolvanen-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>, Feng Tang <feng.tang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>, Neil Brown <neilb-l3A5Bk7waGM@public.gmane.org>, Joonsoo Kim <iamjoonsoo.kim-Hm3cg6mZ9cc@public.gmane.org>, Randy Dunlap <rdunlap-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>, LKML <linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>, linux-fsdevel <linux-fsdevel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>, Linux MM <linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org>, Cgroups <cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org> Subject: Re: [External] Re: [PATCH v3 7/7] mm: memcontrol: make the slab calculation consistent Date: Tue, 8 Dec 2020 15:53:05 +0800 [thread overview] Message-ID: <CAMZfGtV=tc3=ZbePPEWTA2ziDb1hw8KzJXc+Uiedx+xmXY--XA@mail.gmail.com> (raw) In-Reply-To: <CAM9Jb+jg7dD3u4b8P4X_6ginSM3UwVtmbdQzjaencb0r3_bAuQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> On Tue, Dec 8, 2020 at 3:21 PM Pankaj Gupta <pankaj.gupta.linux-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > Although the ratio of the slab is one, we also should read the ratio > > from the related memory_stats instead of hard-coding. And the local > > variable of size is already the value of slab_unreclaimable. So we > > do not need to read again. > > > > We can drop the ratio in struct memory_stat. This can make the code > > clean and simple. And get rid of the awkward mix of static and runtime > > initialization of the memory_stats table. > > > > Signed-off-by: Muchun Song <songmuchun-EC8Uxl6Npydl57MIdRCFDg@public.gmane.org> > > --- > > mm/memcontrol.c | 112 ++++++++++++++++++++++++++++++++++++-------------------- > > 1 file changed, 73 insertions(+), 39 deletions(-) > > > > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > > index a40797a27f87..841ea37cc123 100644 > > --- a/mm/memcontrol.c > > +++ b/mm/memcontrol.c > > @@ -1511,49 +1511,78 @@ static bool mem_cgroup_wait_acct_move(struct mem_cgroup *memcg) > > > > struct memory_stat { > > const char *name; > > - unsigned int ratio; > > unsigned int idx; > > }; > > > > static const struct memory_stat memory_stats[] = { > > - { "anon", PAGE_SIZE, NR_ANON_MAPPED }, > > - { "file", PAGE_SIZE, NR_FILE_PAGES }, > > - { "kernel_stack", 1024, NR_KERNEL_STACK_KB }, > > - { "pagetables", PAGE_SIZE, NR_PAGETABLE }, > > - { "percpu", 1, MEMCG_PERCPU_B }, > > - { "sock", PAGE_SIZE, MEMCG_SOCK }, > > - { "shmem", PAGE_SIZE, NR_SHMEM }, > > - { "file_mapped", PAGE_SIZE, NR_FILE_MAPPED }, > > - { "file_dirty", PAGE_SIZE, NR_FILE_DIRTY }, > > - { "file_writeback", PAGE_SIZE, NR_WRITEBACK }, > > + { "anon", NR_ANON_MAPPED }, > > + { "file", NR_FILE_PAGES }, > > + { "kernel_stack", NR_KERNEL_STACK_KB }, > > + { "pagetables", NR_PAGETABLE }, > > + { "percpu", MEMCG_PERCPU_B }, > > + { "sock", MEMCG_SOCK }, > > + { "shmem", NR_SHMEM }, > > + { "file_mapped", NR_FILE_MAPPED }, > > + { "file_dirty", NR_FILE_DIRTY }, > > + { "file_writeback", NR_WRITEBACK }, > > #ifdef CONFIG_TRANSPARENT_HUGEPAGE > > - { "anon_thp", PAGE_SIZE, NR_ANON_THPS }, > > - { "file_thp", PAGE_SIZE, NR_FILE_THPS }, > > - { "shmem_thp", PAGE_SIZE, NR_SHMEM_THPS }, > > + { "anon_thp", NR_ANON_THPS }, > > + { "file_thp", NR_FILE_THPS }, > > + { "shmem_thp", NR_SHMEM_THPS }, > > #endif > > - { "inactive_anon", PAGE_SIZE, NR_INACTIVE_ANON }, > > - { "active_anon", PAGE_SIZE, NR_ACTIVE_ANON }, > > - { "inactive_file", PAGE_SIZE, NR_INACTIVE_FILE }, > > - { "active_file", PAGE_SIZE, NR_ACTIVE_FILE }, > > - { "unevictable", PAGE_SIZE, NR_UNEVICTABLE }, > > - > > - /* > > - * Note: The slab_reclaimable and slab_unreclaimable must be > > - * together and slab_reclaimable must be in front. > > - */ > > - { "slab_reclaimable", 1, NR_SLAB_RECLAIMABLE_B }, > > - { "slab_unreclaimable", 1, NR_SLAB_UNRECLAIMABLE_B }, > > + { "inactive_anon", NR_INACTIVE_ANON }, > > + { "active_anon", NR_ACTIVE_ANON }, > > + { "inactive_file", NR_INACTIVE_FILE }, > > + { "active_file", NR_ACTIVE_FILE }, > > + { "unevictable", NR_UNEVICTABLE }, > > + { "slab_reclaimable", NR_SLAB_RECLAIMABLE_B }, > > + { "slab_unreclaimable", NR_SLAB_UNRECLAIMABLE_B }, > > > > /* The memory events */ > > - { "workingset_refault_anon", 1, WORKINGSET_REFAULT_ANON }, > > - { "workingset_refault_file", 1, WORKINGSET_REFAULT_FILE }, > > - { "workingset_activate_anon", 1, WORKINGSET_ACTIVATE_ANON }, > > - { "workingset_activate_file", 1, WORKINGSET_ACTIVATE_FILE }, > > - { "workingset_restore_anon", 1, WORKINGSET_RESTORE_ANON }, > > - { "workingset_restore_file", 1, WORKINGSET_RESTORE_FILE }, > > - { "workingset_nodereclaim", 1, WORKINGSET_NODERECLAIM }, > > + { "workingset_refault_anon", WORKINGSET_REFAULT_ANON }, > > + { "workingset_refault_file", WORKINGSET_REFAULT_FILE }, > > + { "workingset_activate_anon", WORKINGSET_ACTIVATE_ANON }, > > + { "workingset_activate_file", WORKINGSET_ACTIVATE_FILE }, > > + { "workingset_restore_anon", WORKINGSET_RESTORE_ANON }, > > + { "workingset_restore_file", WORKINGSET_RESTORE_FILE }, > > + { "workingset_nodereclaim", WORKINGSET_NODERECLAIM }, > > }; > > > > +/* Translate stat items to the correct unit for memory.stat output */ > > +static int memcg_page_state_unit(int item) > > +{ > > + int unit; > > + > > + switch (item) { > > + case MEMCG_PERCPU_B: > > + case NR_SLAB_RECLAIMABLE_B: > > + case NR_SLAB_UNRECLAIMABLE_B: > > + case WORKINGSET_REFAULT_ANON: > > + case WORKINGSET_REFAULT_FILE: > > + case WORKINGSET_ACTIVATE_ANON: > > + case WORKINGSET_ACTIVATE_FILE: > > + case WORKINGSET_RESTORE_ANON: > > + case WORKINGSET_RESTORE_FILE: > > + case WORKINGSET_NODERECLAIM: > > + unit = 1; > > + break; > > + case NR_KERNEL_STACK_KB: > > + unit = SZ_1K; > > + break; > > + default: > > + unit = PAGE_SIZE; > > + break; > break not needed here, or maybe we can return for every case, > that will avoid "unit" variable. Yeah, thanks. > > > + } > > + > > + return unit; > > +} > > + > > +static inline unsigned long memcg_page_state_output(struct mem_cgroup *memcg, > > + int item) > > +{ > > + return memcg_page_state(memcg, item) * memcg_page_state_unit(item); > > +} > > + > > static char *memory_stat_format(struct mem_cgroup *memcg) > > { > > struct seq_buf s; > > @@ -1577,13 +1606,12 @@ static char *memory_stat_format(struct mem_cgroup *memcg) > > for (i = 0; i < ARRAY_SIZE(memory_stats); i++) { > > u64 size; > > > > - size = memcg_page_state(memcg, memory_stats[i].idx); > > - size *= memory_stats[i].ratio; > > + size = memcg_page_state_output(memcg, memory_stats[i].idx); > > seq_buf_printf(&s, "%s %llu\n", memory_stats[i].name, size); > > > > if (unlikely(memory_stats[i].idx == NR_SLAB_UNRECLAIMABLE_B)) { > > - size = memcg_page_state(memcg, NR_SLAB_RECLAIMABLE_B) + > > - memcg_page_state(memcg, NR_SLAB_UNRECLAIMABLE_B); > > + size += > (memcg, > > + NR_SLAB_RECLAIMABLE_B); > > seq_buf_printf(&s, "slab %llu\n", size); > > } > > } > > @@ -6377,6 +6405,12 @@ static int memory_stat_show(struct seq_file *m, void *v) > > } > > > > #ifdef CONFIG_NUMA > > +static inline unsigned long lruvec_page_state_output(struct lruvec *lruvec, > > + int item) > > +{ > > + return lruvec_page_state(lruvec, item) * memcg_page_state_unit(item); > > +} > > + > > static int memory_numa_stat_show(struct seq_file *m, void *v) > > { > > int i; > > @@ -6394,8 +6428,8 @@ static int memory_numa_stat_show(struct seq_file *m, void *v) > > struct lruvec *lruvec; > > > > lruvec = mem_cgroup_lruvec(memcg, NODE_DATA(nid)); > > - size = lruvec_page_state(lruvec, memory_stats[i].idx); > > - size *= memory_stats[i].ratio; > > + size = lruvec_page_state_output(lruvec, > > + memory_stats[i].idx); > > seq_printf(m, " N%d=%llu", nid, size); > > } > > seq_putc(m, '\n'); > > -- > > 2.11.0 > > > > -- Yours, Muchun
next prev parent reply other threads:[~2020-12-08 7:54 UTC|newest] Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-12-08 4:18 [PATCH v3 0/7] Convert all THP vmstat counters to pages Muchun Song 2020-12-08 4:18 ` [PATCH v3 1/7] mm: memcontrol: fix NR_ANON_THPS account Muchun Song 2020-12-09 1:58 ` Roman Gushchin 2020-12-09 1:58 ` Roman Gushchin 2020-12-08 4:18 ` [PATCH v3 2/7] mm: memcontrol: convert NR_ANON_THPS account to pages Muchun Song 2020-12-08 4:18 ` Muchun Song 2020-12-15 13:30 ` Michal Hocko 2020-12-15 13:37 ` [External] " Muchun Song 2020-12-15 13:37 ` Muchun Song 2020-12-08 4:18 ` [PATCH v3 3/7] mm: memcontrol: convert NR_FILE_THPS " Muchun Song 2020-12-08 4:18 ` Muchun Song 2020-12-08 4:18 ` [PATCH v3 4/7] mm: memcontrol: convert NR_SHMEM_THPS " Muchun Song 2020-12-08 4:18 ` Muchun Song 2020-12-08 4:18 ` [PATCH v3 5/7] mm: memcontrol: convert NR_SHMEM_PMDMAPPED " Muchun Song 2020-12-08 4:18 ` [PATCH v3 6/7] mm: memcontrol: convert NR_FILE_PMDMAPPED " Muchun Song 2020-12-08 4:18 ` Muchun Song 2020-12-08 4:18 ` [PATCH v3 7/7] mm: memcontrol: make the slab calculation consistent Muchun Song 2020-12-08 7:20 ` Pankaj Gupta 2020-12-08 7:20 ` Pankaj Gupta 2020-12-08 7:20 ` Pankaj Gupta 2020-12-08 7:53 ` Muchun Song [this message] 2020-12-08 7:53 ` [External] " Muchun Song 2020-12-08 7:53 ` Muchun Song 2020-12-15 13:35 ` Michal Hocko 2020-12-15 16:21 ` [External] " Muchun Song 2020-12-15 16:21 ` Muchun Song
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='CAMZfGtV=tc3=ZbePPEWTA2ziDb1hw8KzJXc+Uiedx+xmXY--XA@mail.gmail.com' \ --to=songmuchun@bytedance.com \ --cc=adobriyan@gmail.com \ --cc=akpm@linux-foundation.org \ --cc=cgroups@vger.kernel.org \ --cc=feng.tang@intel.com \ --cc=gregkh@linuxfoundation.org \ --cc=guro@fb.com \ --cc=hannes@cmpxchg.org \ --cc=hughd@google.com \ --cc=iamjoonsoo.kim@lge.com \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=mhocko@kernel.org \ --cc=neilb@suse.de \ --cc=pankaj.gupta.linux@gmail.com \ --cc=rafael@kernel.org \ --cc=rdunlap@infradead.org \ --cc=samitolvanen@google.com \ --cc=shakeelb@google.com \ --cc=vdavydov.dev@gmail.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.