Message ID | 20190228021839.55779-5-dennis@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | introduce percpu block scan_hint | expand |
> -----Original Message----- > From: owner-linux-mm@kvack.org [mailto:owner-linux-mm@kvack.org] On > Behalf Of Dennis Zhou > Sent: 2019年2月28日 10:19 > To: Dennis Zhou <dennis@kernel.org>; Tejun Heo <tj@kernel.org>; Christoph > Lameter <cl@linux.com> > Cc: Vlad Buslov <vladbu@mellanox.com>; kernel-team@fb.com; > linux-mm@kvack.org; linux-kernel@vger.kernel.org > Subject: [PATCH 04/12] percpu: manage chunks based on contig_bits instead > of free_bytes > > When a chunk becomes fragmented, it can end up having a large number of > small allocation areas free. The free_bytes sorting of chunks leads to > unnecessary checking of chunks that cannot satisfy the allocation. > Switch to contig_bits sorting to prevent scanning chunks that may not be able > to service the allocation request. > > Signed-off-by: Dennis Zhou <dennis@kernel.org> > --- > mm/percpu.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/mm/percpu.c b/mm/percpu.c > index b40112b2fc59..c996bcffbb2a 100644 > --- a/mm/percpu.c > +++ b/mm/percpu.c > @@ -234,7 +234,7 @@ static int pcpu_chunk_slot(const struct pcpu_chunk > *chunk) > if (chunk->free_bytes < PCPU_MIN_ALLOC_SIZE || chunk->contig_bits > == 0) > return 0; > > - return pcpu_size_to_slot(chunk->free_bytes); > + return pcpu_size_to_slot(chunk->contig_bits * PCPU_MIN_ALLOC_SIZE); > } > > /* set the pointer to a chunk in a page struct */ Reviewed-by: Peng Fan <peng.fan@nxp.com> Not relevant to this patch, another optimization to percpu might be good to use per chunk spin_lock, not gobal pcpu_lock. Thanks, Peng. > -- > 2.17.1
On Sat, Mar 02, 2019 at 01:48:20PM +0000, Peng Fan wrote: > > > > -----Original Message----- > > From: owner-linux-mm@kvack.org [mailto:owner-linux-mm@kvack.org] On > > Behalf Of Dennis Zhou > > Sent: 2019年2月28日 10:19 > > To: Dennis Zhou <dennis@kernel.org>; Tejun Heo <tj@kernel.org>; Christoph > > Lameter <cl@linux.com> > > Cc: Vlad Buslov <vladbu@mellanox.com>; kernel-team@fb.com; > > linux-mm@kvack.org; linux-kernel@vger.kernel.org > > Subject: [PATCH 04/12] percpu: manage chunks based on contig_bits instead > > of free_bytes > > > > When a chunk becomes fragmented, it can end up having a large number of > > small allocation areas free. The free_bytes sorting of chunks leads to > > unnecessary checking of chunks that cannot satisfy the allocation. > > Switch to contig_bits sorting to prevent scanning chunks that may not be able > > to service the allocation request. > > > > Signed-off-by: Dennis Zhou <dennis@kernel.org> > > --- > > mm/percpu.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/mm/percpu.c b/mm/percpu.c > > index b40112b2fc59..c996bcffbb2a 100644 > > --- a/mm/percpu.c > > +++ b/mm/percpu.c > > @@ -234,7 +234,7 @@ static int pcpu_chunk_slot(const struct pcpu_chunk > > *chunk) > > if (chunk->free_bytes < PCPU_MIN_ALLOC_SIZE || chunk->contig_bits > > == 0) > > return 0; > > > > - return pcpu_size_to_slot(chunk->free_bytes); > > + return pcpu_size_to_slot(chunk->contig_bits * PCPU_MIN_ALLOC_SIZE); > > } > > > > /* set the pointer to a chunk in a page struct */ > > Reviewed-by: Peng Fan <peng.fan@nxp.com> > > Not relevant to this patch, another optimization to percpu might be good > to use per chunk spin_lock, not gobal pcpu_lock. > Percpu memory itself is expensive and for the most part shouldn't be part of the critical path. Ideally, we don't have multiple chunks being allocated simultaneously because once an allocation is given out, the chunk is pinned until all allocations are freed. Thanks, Dennis
> -----Original Message----- > From: Dennis Zhou [mailto:dennis@kernel.org] > Sent: 2019年3月3日 6:32 > To: Peng Fan <peng.fan@nxp.com> > Cc: Tejun Heo <tj@kernel.org>; Christoph Lameter <cl@linux.com>; Vlad > Buslov <vladbu@mellanox.com>; kernel-team@fb.com; linux-mm@kvack.org; > linux-kernel@vger.kernel.org > Subject: Re: [PATCH 04/12] percpu: manage chunks based on contig_bits > instead of free_bytes > > On Sat, Mar 02, 2019 at 01:48:20PM +0000, Peng Fan wrote: > > > > > > > -----Original Message----- > > > From: owner-linux-mm@kvack.org [mailto:owner-linux-mm@kvack.org] > On > > > Behalf Of Dennis Zhou > > > Sent: 2019年2月28日 10:19 > > > To: Dennis Zhou <dennis@kernel.org>; Tejun Heo <tj@kernel.org>; > > > Christoph Lameter <cl@linux.com> > > > Cc: Vlad Buslov <vladbu@mellanox.com>; kernel-team@fb.com; > > > linux-mm@kvack.org; linux-kernel@vger.kernel.org > > > Subject: [PATCH 04/12] percpu: manage chunks based on contig_bits > > > instead of free_bytes > > > > > > When a chunk becomes fragmented, it can end up having a large number > > > of small allocation areas free. The free_bytes sorting of chunks > > > leads to unnecessary checking of chunks that cannot satisfy the allocation. > > > Switch to contig_bits sorting to prevent scanning chunks that may > > > not be able to service the allocation request. > > > > > > Signed-off-by: Dennis Zhou <dennis@kernel.org> > > > --- > > > mm/percpu.c | 2 +- > > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > > > diff --git a/mm/percpu.c b/mm/percpu.c index > > > b40112b2fc59..c996bcffbb2a 100644 > > > --- a/mm/percpu.c > > > +++ b/mm/percpu.c > > > @@ -234,7 +234,7 @@ static int pcpu_chunk_slot(const struct > > > pcpu_chunk > > > *chunk) > > > if (chunk->free_bytes < PCPU_MIN_ALLOC_SIZE || > chunk->contig_bits > > > == 0) > > > return 0; > > > > > > - return pcpu_size_to_slot(chunk->free_bytes); > > > + return pcpu_size_to_slot(chunk->contig_bits * > > > +PCPU_MIN_ALLOC_SIZE); > > > } > > > > > > /* set the pointer to a chunk in a page struct */ > > > > Reviewed-by: Peng Fan <peng.fan@nxp.com> > > > > Not relevant to this patch, another optimization to percpu might be > > good to use per chunk spin_lock, not gobal pcpu_lock. > > > > Percpu memory itself is expensive and for the most part shouldn't be part of > the critical path. Ideally, we don't have multiple chunks being allocated > simultaneously because once an allocation is given out, the chunk is pinned > until all allocations are freed. Thanks for clarification, since not critical patch, use global lock should be ok. Thanks, Peng. > > Thanks, > Dennis
diff --git a/mm/percpu.c b/mm/percpu.c index b40112b2fc59..c996bcffbb2a 100644 --- a/mm/percpu.c +++ b/mm/percpu.c @@ -234,7 +234,7 @@ static int pcpu_chunk_slot(const struct pcpu_chunk *chunk) if (chunk->free_bytes < PCPU_MIN_ALLOC_SIZE || chunk->contig_bits == 0) return 0; - return pcpu_size_to_slot(chunk->free_bytes); + return pcpu_size_to_slot(chunk->contig_bits * PCPU_MIN_ALLOC_SIZE); } /* set the pointer to a chunk in a page struct */
When a chunk becomes fragmented, it can end up having a large number of small allocation areas free. The free_bytes sorting of chunks leads to unnecessary checking of chunks that cannot satisfy the allocation. Switch to contig_bits sorting to prevent scanning chunks that may not be able to service the allocation request. Signed-off-by: Dennis Zhou <dennis@kernel.org> --- mm/percpu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)