All of lore.kernel.org
 help / color / mirror / Atom feed
From: Su Yue <l@damenly.su>
To: Ming Lei <ming.lei@redhat.com>
Cc: Jens Axboe <axboe@kernel.dk>,
	linux-block@vger.kernel.org, Christoph Hellwig <hch@lst.de>,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/2] blktrace: limit allowed total trace buffer size
Date: Tue, 30 Mar 2021 10:57:04 +0800	[thread overview]
Message-ID: <mtul73da.fsf@damenly.su> (raw)
In-Reply-To: <20210323081440.81343-3-ming.lei@redhat.com>


On Tue 23 Mar 2021 at 16:14, Ming Lei <ming.lei@redhat.com> wrote:

> On some ARCHs, such as aarch64, page size may be 64K, meantime 
> there may
> be lots of CPU cores. relay_open() needs to allocate pages on 
> each CPU
> blktrace, so easily too many pages are taken by blktrace. For 
> example,
> on one ARM64 server: 224 CPU cores, 16G RAM, blktrace finally 
> got
> allocated 7GB in case of 'blktrace -b 8192' which is used by 
> device-mapper
> test suite[1]. This way could cause OOM easily.
>
> Fix the issue by limiting max allowed pages to be 1/8 of 
> totalram_pages().
>
> [1] https://github.com/jthornber/device-mapper-test-suite.git
>
> Signed-off-by: Ming Lei <ming.lei@redhat.com>
> ---
>  kernel/trace/blktrace.c | 32 ++++++++++++++++++++++++++++++++
>  1 file changed, 32 insertions(+)
>
> diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c
> index c221e4c3f625..8403ff19d533 100644
> --- a/kernel/trace/blktrace.c
> +++ b/kernel/trace/blktrace.c
> @@ -466,6 +466,35 @@ static void blk_trace_setup_lba(struct 
> blk_trace *bt,
>  	}
>  }
>
> +/* limit total allocated buffer size is <= 1/8 of total pages 
> */
> +static void validate_and_adjust_buf(struct blk_user_trace_setup 
> *buts)
> +{
> +	unsigned buf_size = buts->buf_size;
> +	unsigned buf_nr = buts->buf_nr;
> +	unsigned long max_allowed_pages = totalram_pages() >> 3;
> +	unsigned long req_pages = PAGE_ALIGN(buf_size * buf_nr) >> 
> PAGE_SHIFT;
> +
> +	if (req_pages * num_online_cpus() <= max_allowed_pages)
> +		return;
> +
> +	req_pages = DIV_ROUND_UP(max_allowed_pages, 
> num_online_cpus());
> +
> +	if (req_pages == 0) {
> +		buf_size = PAGE_SIZE;
> +		buf_nr = 1;
> +	} else {
> +		buf_size = req_pages << PAGE_SHIFT / buf_nr;
>
Should it be:
buf_size = (req_pages << PAGE_SHIFT) / buf_nr;
?
The priority of '<<' is lower than '/', right? :)

--
Su
> +		if (buf_size < PAGE_SIZE)
> +			buf_size = PAGE_SIZE;
> +		buf_nr = req_pages << PAGE_SHIFT / buf_size;
> +		if (buf_nr == 0)
> +			buf_nr = 1;
> +	}
> +
> +	buts->buf_size = min_t(unsigned, buf_size, buts->buf_size);
> +	buts->buf_nr = min_t(unsigned, buf_nr, buts->buf_nr);
> +}
> +
>  /*
>   * Setup everything required to start tracing
>   */
> @@ -482,6 +511,9 @@ static int do_blk_trace_setup(struct 
> request_queue *q, char *name, dev_t dev,
>  	if (!buts->buf_size || !buts->buf_nr)
>  		return -EINVAL;
>
> +	/* make sure not allocate too much for userspace */
> +	validate_and_adjust_buf(buts);
> +
>  	strncpy(buts->name, name, BLKTRACE_BDEV_SIZE);
>  	buts->name[BLKTRACE_BDEV_SIZE - 1] = '\0';


  reply	other threads:[~2021-03-30  3:01 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-23  8:14 [PATCH 0/2] blktrace: fix trace buffer leak and limit trace buffer size Ming Lei
2021-03-23  8:14 ` [PATCH 1/2] block: shutdown blktrace in case of fatal signal pending Ming Lei
2021-03-30 16:53   ` Christoph Hellwig
2021-03-31  0:16     ` Ming Lei
2021-04-02 17:27       ` Christoph Hellwig
2021-04-03  8:10         ` Ming Lei
2021-04-03  9:04           ` Ming Lei
2021-04-06  6:30           ` Christoph Hellwig
2021-03-23  8:14 ` [PATCH 2/2] blktrace: limit allowed total trace buffer size Ming Lei
2021-03-30  2:57   ` Su Yue [this message]
2021-03-30  3:55     ` Ming Lei
2021-03-30 16:57   ` Christoph Hellwig
2021-03-30  2:04 ` [PATCH 0/2] blktrace: fix trace buffer leak and limit " Ming Lei

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=mtul73da.fsf@damenly.su \
    --to=l@damenly.su \
    --cc=axboe@kernel.dk \
    --cc=hch@lst.de \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=ming.lei@redhat.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.