From: Artem Bityutskiy <dedekind1@gmail.com>
To: Jarkko Lavinen <jarkko.lavinen@nokia.com>
Cc: linux-mtd@lists.infradead.org
Subject: Re: [PATCH] mtd: Use fallback in memory allocation for mtd_{read,write}
Date: Thu, 24 Mar 2011 15:58:57 +0200 [thread overview]
Message-ID: <1300975137.2735.93.camel@localhost> (raw)
In-Reply-To: <1300796009-15019-1-git-send-email-jarkko.lavinen@nokia.com>
On Tue, 2011-03-22 at 14:13 +0200, Jarkko Lavinen wrote:
> Kmalloc used in mtd_read() and mtd_write() can fail if the request
> size is large and memory is fragmented. Use fall-back mechanism which
> will quietly retry the allocation by halving the allocation size in each
> retry.
>
> Signed-off-by: Jarkko Lavinen <jarkko.lavinen@nokia.com>
> ---
> drivers/mtd/mtdchar.c | 44 ++++++++++++++++++++++++++++++--------------
> 1 files changed, 30 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/mtd/mtdchar.c b/drivers/mtd/mtdchar.c
> index 145b3d0d..18263d8 100644
> --- a/drivers/mtd/mtdchar.c
> +++ b/drivers/mtd/mtdchar.c
> @@ -171,12 +171,33 @@ static int mtd_close(struct inode *inode, struct file *file)
> */
> #define MAX_KMALLOC_SIZE 0x20000
>
> +static void *mtd_buf_alloc(size_t *size)
> +{
> + void *kbuf;
> + size_t next;
> +
> + if (*size > MAX_KMALLOC_SIZE)
> + *size = MAX_KMALLOC_SIZE;
> +
> + kbuf = kmalloc(*size, GFP_KERNEL | __GFP_NOWARN);
> + next = 1 << (fls(*size - 1) - 1);
> +
> + while (!kbuf && next >= PAGE_SIZE) {
> + *size = next;
> + next /= 2;
> + kbuf = kmalloc(*size, GFP_KERNEL | __GFP_NOWARN);
> + }
> +
> + return kbuf;
> +}
Instead of improving bad code we need re-work it and allocate multiple
small buffers and use vector-based read/write functions.
Indeed, kmalloc()'ing large buffers is a horrible things to do for
performance because it causes a lot of activities, write-back, kills
caches, etc. This patch tries to kmalloc a lot, then less, even less,
etc, until it succeeds. And the first kmalloc will put the device on the
knees.
So we should not even try to kmalloc that much. And also, we should use
GFP_NOIO flag when kmalloc-ing a lot, I think.
--
Best Regards,
Artem Bityutskiy (Артём Битюцкий)
prev parent reply other threads:[~2011-03-24 14:00 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-22 12:13 [PATCH] mtd: Use fallback in memory allocation for mtd_{read,write} Jarkko Lavinen
2011-03-24 13:58 ` Artem Bityutskiy [this message]
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=1300975137.2735.93.camel@localhost \
--to=dedekind1@gmail.com \
--cc=jarkko.lavinen@nokia.com \
--cc=linux-mtd@lists.infradead.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox