lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20061017132519.GE7854@kernel.dk>
Date:	Tue, 17 Oct 2006 15:25:19 +0200
From:	Jens Axboe <jens.axboe@...cle.com>
To:	Ronen Shitrit <rshitrit@...vell.com>
Cc:	linux-kernel@...r.kernel.org
Subject: Re: DIrectIO using kernel buffers

On Mon, Oct 16 2006, Ronen Shitrit wrote:
> Hi
> 
> I'm using kernel 2.6.12.
> I'm trying to improve the usb gadget file storage implementation by
> making it accessing the file storage with O_DIRECT,
> In general what I'm trying to do is use DirectIO with buffer which was
> allocated by kmalloc.
> 
> When trying to do so I get kernel panic, after some debug, I found that
> I can't call get_user_pages on pages allocated by the kernel (kmalloc),
> Is it correct??
> Any way, I implemented some basic function get_kernel_pages to fill the
> page array with the pages pointer of the kernel buffer,
> Then I got lots of errors on illegal buffer freeing, I did some more
> debug and I found that the direct-io is using the get_page and put_page
> in order to increment the counter of the page and to make sure no one
> will release them while the direct-io is using them, after the direct-io
> is doing put_page it check if the page_count is 0, if so it release it
> (see page_cache_release in direct-io.c), by doing this the direct-io is
> trying to release the pages which I allocated by kmalloc and I get
> errors.
> So what I get is that the direct-io increments the count and then
> decrements it and the count get to zero,
> So I checked the count of the pages which I got from kmalloc and I found
> that only the first page count is 0 (i.e. one process is using it) and
> the rest were initialized by -1 (i.e. no process is using this buffer),
> Is this a bug??
> Any suggestion on how to use DirectIO with kernel buffers??

get_user_pages(), as the name infers, deals with user memory not memory
allocated with kmalloc(). Rewrite your code to generate the page vec
manually allocating individual pages at the time, it's silly to allocate
contigious memory and then split that up afterwards.

-- 
Jens Axboe

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ