All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peng Fan <peng.fan@nxp.com>
To: "dennis@kernel.org" <dennis@kernel.org>,
	"tj@kernel.org" <tj@kernel.org>, "cl@linux.com" <cl@linux.com>
Cc: "linux-mm@kvack.org" <linux-mm@kvack.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"van.freenix@gmail.com" <van.freenix@gmail.com>,
	Peng Fan <peng.fan@nxp.com>
Subject: [RFC] percpu: decrease pcpu_nr_slots by 1
Date: Sun, 24 Feb 2019 09:17:08 +0000	[thread overview]
Message-ID: <20190224092838.3417-1-peng.fan@nxp.com> (raw)

Entry pcpu_slot[pcpu_nr_slots - 2] is wasted with current code logic.
pcpu_nr_slots is calculated with `__pcpu_size_to_slot(size) + 2`.
Take pcpu_unit_size as 1024 for example, __pcpu_size_to_slot will
return max(11 - PCPU_SLOT_BASE_SHIFT + 2, 1), it is 8, so the
pcpu_nr_slots will be 10.

The chunk with free_bytes 1024 will be linked into pcpu_slot[9].
However free_bytes in range [512,1024) will be linked into
pcpu_slot[7], because `fls(512) - PCPU_SLOT_BASE_SHIFT + 2` is 7.
So pcpu_slot[8] is has no chance to be used.

According comments of PCPU_SLOT_BASE_SHIFT, 1~31 bytes share the same slot
and PCPU_SLOT_BASE_SHIFT is defined as 5. But actually 1~15 share the
same slot 1 if we not take PCPU_MIN_ALLOC_SIZE into consideration, 16~31
share slot 2. Calculation as below:
highbit = fls(16) -> highbit = 5
max(5 - PCPU_SLOT_BASE_SHIFT + 2, 1) equals 2, not 1.

This patch by decreasing pcpu_nr_slots to avoid waste one slot and
let [PCPU_MIN_ALLOC_SIZE, 31) really share the same slot.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
---

V1:
 Not very sure about whether it is intended to leave the slot there.

 mm/percpu.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/mm/percpu.c b/mm/percpu.c
index 8d9933db6162..12a9ba38f0b5 100644
--- a/mm/percpu.c
+++ b/mm/percpu.c
@@ -219,7 +219,7 @@ static bool pcpu_addr_in_chunk(struct pcpu_chunk *chunk, void *addr)
 static int __pcpu_size_to_slot(int size)
 {
 	int highbit = fls(size);	/* size is in bytes */
-	return max(highbit - PCPU_SLOT_BASE_SHIFT + 2, 1);
+	return max(highbit - PCPU_SLOT_BASE_SHIFT + 1, 1);
 }
 
 static int pcpu_size_to_slot(int size)
@@ -2145,7 +2145,7 @@ int __init pcpu_setup_first_chunk(const struct pcpu_alloc_info *ai,
 	 * Allocate chunk slots.  The additional last slot is for
 	 * empty chunks.
 	 */
-	pcpu_nr_slots = __pcpu_size_to_slot(pcpu_unit_size) + 2;
+	pcpu_nr_slots = __pcpu_size_to_slot(pcpu_unit_size) + 1;
 	pcpu_slot = memblock_alloc(pcpu_nr_slots * sizeof(pcpu_slot[0]),
 				   SMP_CACHE_BYTES);
 	for (i = 0; i < pcpu_nr_slots; i++)
-- 
2.16.4


             reply	other threads:[~2019-02-24  9:17 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-24  9:17 Peng Fan [this message]
2019-02-25 15:23 ` [RFC] percpu: decrease pcpu_nr_slots by 1 dennis
2019-02-26  0:09   ` Peng Fan
2019-02-26 17:32     ` Dennis Zhou
2019-02-27 13:33       ` Peng Fan
2019-02-27 18:19         ` Dennis Zhou

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=20190224092838.3417-1-peng.fan@nxp.com \
    --to=peng.fan@nxp.com \
    --cc=cl@linux.com \
    --cc=dennis@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=tj@kernel.org \
    --cc=van.freenix@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: 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.