All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Petr Mládek" <pmladek@suse.cz>
To: "Luis R. Rodriguez" <mcgrof@do-not-panic.com>
Cc: hpa@linux.intel.com, akpm@linux-foundation.org,
	linux-kernel@vger.kernel.org,
	"Luis R. Rodriguez" <mcgrof@suse.com>,
	Andrew Lunn <andrew@lunn.ch>,
	Stephen Warren <swarren@wwwdotorg.org>,
	Michal Hocko <mhocko@suse.cz>, Joe Perches <joe@perches.com>,
	Arun KS <arunks.linux@gmail.com>,
	Kees Cook <keescook@chromium.org>,
	Davidlohr Bueso <davidlohr@hp.com>,
	Chris Metcalf <cmetcalf@tilera.com>
Subject: Re: [RFT 1/2] printk: make dynamic kernel ring buffer alignemnt explicit
Date: Wed, 18 Jun 2014 17:40:23 +0200	[thread overview]
Message-ID: <20140618154022.GI634@pathway.suse.cz> (raw)
In-Reply-To: <1403090065-13879-1-git-send-email-mcgrof@do-not-panic.com>

On Wed 2014-06-18 04:14:24, Luis R. Rodriguez wrote:
> From: "Luis R. Rodriguez" <mcgrof@suse.com>
> 
> We have to consider alignment for the ring buffer both for the
> default static size, and then also for when an dynamic allocation
> is made when the log_buf_len=n kernel parameter is passed to set
> the size specifically to a size larger than the default size set
> by the architecture through CONFIG_LOG_BUF_SHIFT.
> 
> The default static kernel ring buffer can be aligned properly if
> architectures set CONFIG_LOG_BUF_SHIFT properly, we provide ranges
> for the size though so even if CONFIG_LOG_BUF_SHIFT has a sensible
> aligned value it can be reduced to a non aligned value. Commit
> 6ebb017de9 by Andrew ensures the static buffer is always aligned
> and the decision of alignment is done by the compiler by using
> __alignof__(struct log) (curious what value caused the crash?).
> 
> When log_buf_len=n is used we allocate the ring buffer dynamically.
> Dynamic allocation varies, for the early allocation called
> before setup_arch() memblock_virt_alloc() requests a page aligment
> and for the default kernel allocation memblock_virt_alloc_nopanic()
> requests no special alignment, which in turn ends up aligning the
> allocation to SMP_CACHE_BYTES, which is L1 cache aligned.
> 
> Since we already have the required alignment for the kernel ring
> buffer though we can do better and request explicit alignment for
> LOG_ALIGN. Do that and also put the power of 2 practice of
> the ring buffer size into a helper which we'll use later.
> 
> Cc: Andrew Lunn <andrew@lunn.ch>
> Cc: Stephen Warren <swarren@wwwdotorg.org>
> Cc: Michal Hocko <mhocko@suse.cz>
> Cc: Petr Mladek <pmladek@suse.cz>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: Joe Perches <joe@perches.com>
> Cc: Arun KS <arunks.linux@gmail.com>
> Cc: Kees Cook <keescook@chromium.org>
> Cc: Davidlohr Bueso <davidlohr@hp.com>
> Cc: Chris Metcalf <cmetcalf@tilera.com>
> Cc: linux-kernel@vger.kernel.org
> Signed-off-by: Luis R. Rodriguez <mcgrof@suse.com>

The change makes sense to me.

Acked-by: Petr Mladek <pmladek@suse.cz>
Tested-by: Petr Mladek <pmladek@suse.cz>

> This is perhaps not required given that we stick to powers of 2
> and the min LOG_BUF_SHIFT is 12, if the min LOG_BUF_SHIFT is
> aligned then I think any passed log_buf_len=n would be aligned
> as well as we don't make log_buf_len=n take effect unless
> its > than the default size, and we round to the produced size
> to the next power of 2. If the min length produced by
> LOG_BUF_SHIFT is aligned, multiples of 2 of this should be as
> well I think.
> 
> This might be perhaps safest thing to do though given we'll
> add other alloc entries next.
> 
>  kernel/printk/printk.c | 19 +++++++++++++------
>  1 file changed, 13 insertions(+), 6 deletions(-)
> 
> diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
> index ea2d5f6..af164a7 100644
> --- a/kernel/printk/printk.c
> +++ b/kernel/printk/printk.c
> @@ -828,15 +828,21 @@ void log_buf_kexec_setup(void)
>  /* requested log_buf_len from kernel cmdline */
>  static unsigned long __initdata new_log_buf_len;
>  
> -/* save requested log_buf_len since it's too early to process it */
> -static int __init log_buf_len_setup(char *str)
> +/* we practice scaling the ring buffer by powers of 2 */
> +static void __init log_buf_len_update(unsigned size)
>  {
> -	unsigned size = memparse(str, &str);
> -
>  	if (size)
>  		size = roundup_pow_of_two(size);
>  	if (size > log_buf_len)
>  		new_log_buf_len = size;
> +}
> +
> +/* save requested log_buf_len since it's too early to process it */
> +static int __init log_buf_len_setup(char *str)
> +{
> +	unsigned size = memparse(str, &str);
> +
> +	log_buf_len_update(size);
>  
>  	return 0;
>  }
> @@ -853,9 +859,10 @@ void __init setup_log_buf(int early)
>  
>  	if (early) {
>  		new_log_buf =
> -			memblock_virt_alloc(new_log_buf_len, PAGE_SIZE);
> +			memblock_virt_alloc(new_log_buf_len, LOG_ALIGN);
>  	} else {
> -		new_log_buf = memblock_virt_alloc_nopanic(new_log_buf_len, 0);
> +		new_log_buf = memblock_virt_alloc_nopanic(new_log_buf_len,
> +							  LOG_ALIGN);
>  	}
>  
>  	if (unlikely(!new_log_buf)) {
> -- 
> 1.9.3
> 

  parent reply	other threads:[~2014-06-18 15:40 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-06-18 11:14 [RFT 1/2] printk: make dynamic kernel ring buffer alignemnt explicit Luis R. Rodriguez
2014-06-18 11:14 ` [RFT 2/2] printk: allow increasing the ring buffer depending on the number of CPUs Luis R. Rodriguez
2014-06-18 15:42   ` Petr Mládek
2014-06-18 20:43     ` Luis R. Rodriguez
2014-06-18 18:11   ` Davidlohr Bueso
2014-06-18 18:14     ` Davidlohr Bueso
2014-06-18 19:21     ` Luis R. Rodriguez
2014-06-18 15:40 ` Petr Mládek [this message]
2014-06-18 15:56 ` [RFT 1/2] printk: make dynamic kernel ring buffer alignemnt explicit Stephen Warren
2014-06-18 19:33   ` Luis R. Rodriguez
2014-06-18 19:46     ` Stephen Warren
2014-06-18 20:03       ` Luis R. Rodriguez

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=20140618154022.GI634@pathway.suse.cz \
    --to=pmladek@suse.cz \
    --cc=akpm@linux-foundation.org \
    --cc=andrew@lunn.ch \
    --cc=arunks.linux@gmail.com \
    --cc=cmetcalf@tilera.com \
    --cc=davidlohr@hp.com \
    --cc=hpa@linux.intel.com \
    --cc=joe@perches.com \
    --cc=keescook@chromium.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mcgrof@do-not-panic.com \
    --cc=mcgrof@suse.com \
    --cc=mhocko@suse.cz \
    --cc=swarren@wwwdotorg.org \
    /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.