From: Pete Popov <ppopov@embeddedalley.com>
To: Christian Gan <christian.gan@librestream.com>
Cc: linux-mips@linux-mips.org
Subject: Re: vmalloc memory corruption
Date: Thu, 06 Jan 2005 12:11:33 -0800 [thread overview]
Message-ID: <41DD9B75.7060904@embeddedalley.com> (raw)
In-Reply-To: <8230E1CC35AF9F43839F3049E930169A0D8A63@yang.LibreStream.local>
Christian Gan wrote:
> Just a little update on this:
>
> I turned off 36 bit address support for the MIPS32
> (CONFIG_64BIT_PHYS_ADDR) and found that my tests for vmalloc work.
>
> Can anyone who knows better point me in a direction of where I should
> start?
Hmmm. I'll take a look at this.
Pete
>
> Thanks!
>
> Christian
>
> -----Original Message-----
> From: linux-mips-bounce@linux-mips.org
> [mailto:linux-mips-bounce@linux-mips.org] On Behalf Of Christian Gan
> Sent: Tuesday, January 04, 2005 3:25 PM
> To: linux-mips@linux-mips.org
> Subject: vmalloc memory corruption
>
> Hey all,
>
> I'm running into a strange memory corruption problem while trying to get
> a driver to load firmware using hotplug support on a DBAU1550 eval
> board. This board has a single AU1550 MIPS32 processor. I'm running
> kernel version 2.6.10-rc3.
>
> I've attached a code snippet below that I'd like somebody to try to
> verify for me so I can determine whether or not it is a problem with my
> kernel/hardware.
>
> The test code is a simplified version of the interaction between the
> driver and the firmware/hotplug support of the kernel. The firmware
> hotplug support (linux/drivers/base/firmware_class.c) if fed data from a
> file and places it into a buffer, this buffer gets reallocated when
> required and grows as more data is read in. Old data is memcopied into
> the new reallocated buffer and newly read data is appended to the end.
> What I'm finding is that eventually this data is corrupted.
>
> Compile the test snippet below as a module and insmod it. If things are
> successful you should see results like this:
>
> # insmod vmalloctest.ko
> Using vmalloctest.ko
> testing vmalloc
> 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09
> 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09
> 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09
> ...
> 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09
>
> But if data changes at any time, you've got problems like me. When I
> run this on my platform eventually the data becomes all 0x00.
>
> Notice that if you use kmalloc instead of vmalloc (define USE_KMALLOC),
> everything works.
>
> Thanks!
>
> Christian Gan
>
> // Start vmalloctest.c
>
> #ifndef __KERNEL__
> #define __KERNEL__
> #endif
>
> #include <linux/config.h>
> #include <linux/version.h>
> #include <linux/module.h>
> #include <linux/kernel.h>
> #include <linux/errno.h>
> #include <linux/string.h>
> #include <linux/mm.h>
> #include <linux/delay.h>
> #include <linux/init.h>
> #include <linux/vmalloc.h>
>
> #include <asm/io.h>
>
> //#define USE_KMALLOC
>
> void fillbuf(char * buf, unsigned long len)
> {
> int i = 0;
> for (i = 0; i < len; i++)
> {
> buf[i] = 0xFF & i;
> }
> }
>
> int __init vmalloctest_init(void)
> {
> char * buf = NULL;
> int i = 0;
>
> printk("testing vmalloc\n");
>
> for (i = 0; i < 50; i++)
> {
> int j = 0;
> #ifndef USE_KMALLOC
> char * newbuf = vmalloc( (i+1)*PAGE_SIZE );
> // allocate a new buffer that grows in size
> #else
> char * newbuf = kmalloc( (i+1)*PAGE_SIZE, GFP_KERNEL );
> // allocate a new buffer that grows in size
> #endif
> if (!newbuf)
> {
> printk("Could not allocate memory: %ld bytes\n",
> (i+1)*PAGE_SIZE);
> break;
> }
>
> if (i==0)
> {
> fillbuf(newbuf, PAGE_SIZE ); // fill
> the original buffer with some data... any will suffice
> }
> else
> {
> memcpy(newbuf, buf, i*PAGE_SIZE); // copy
> the contents of the old buffer to the new
> }
>
> #ifndef USE_KMALLOC
> vfree(buf); // free the old buffer
> #else
> kfree(buf); // free the old buffer
> #endif
>
> buf = newbuf;
>
> // print out the first few bytes
> for (j=0; j < 10; j++)
> {
> printk("0x%02X ", 0xff & buf[j]);
> }
> printk("\n");
> }
>
> #ifndef USE_KMALLOC
> vfree(buf);
> #else
> kfree(buf);
> #endif
>
> return 0;
> }
> module_init(vmalloctest_init);
>
> MODULE_LICENSE("GPL");
>
>
>
>
>
>
next prev parent reply other threads:[~2005-01-06 20:11 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-01-06 20:08 vmalloc memory corruption Christian Gan
2005-01-06 20:08 ` Christian Gan
2005-01-06 20:11 ` Pete Popov [this message]
-- strict thread matches above, loose matches on Subject: below --
2005-01-04 21:24 Christian Gan
2005-01-04 21:24 ` Christian Gan
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=41DD9B75.7060904@embeddedalley.com \
--to=ppopov@embeddedalley.com \
--cc=christian.gan@librestream.com \
--cc=linux-mips@linux-mips.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