All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stefani Seibold <stefani@seibold.net>
To: "Ira W. Snyder" <iws@ovro.caltech.edu>
Cc: linux-kernel <linux-kernel@vger.kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Andi Kleen <andi@firstfloor.org>,
	Greg Kroah-Hartman <gregkh@suse.de>,
	Alan Cox <alan@lxorguk.ukuu.org.uk>, Theodore Tso <tytso@mit.edu>,
	Jens Axboe <jens.axboe@oracle.com>
Subject: Re: [PATCH] enhanced reimplemented of the kfifo API
Date: Sat, 16 Jan 2010 08:25:50 +0100	[thread overview]
Message-ID: <1263626750.13343.6.camel@wall-e> (raw)
In-Reply-To: <20100115233820.GF10591@ovro.caltech.edu>

Am Freitag, den 15.01.2010, 15:38 -0800 schrieb Ira W. Snyder:
> On Fri, Jan 15, 2010 at 11:05:07PM +0100, Stefani Seibold wrote:
> > Am Freitag, den 15.01.2010, 14:01 -0800 schrieb Ira W. Snyder:
> > > On Fri, Jan 15, 2010 at 10:30:01PM +0100, Stefani Seibold wrote:
> > > > 
> > > > > I'm glad to see this example, it really illustrates how to use the new
> > > > > DMA functionality of the kfifo API.
> > > > > 
> > > > > Is there any reason why a very large scatterlist could not be used? I
> > > > > have a driver that uses a large scatterlist (~4000 entries, allocated as
> > > > > a struct sg_table). I implemented my own copy_from_user() functionality
> > > > > into this scatterlist, but I'd love to use the kfifo DMA API instead.
> > > > > After filling the scatterlist, I use the usual DMA API's to transfer it
> > > > > to my device.
> > > > > 
> > > > 
> > > > No, but the API will only return max. two entries.
> > > > 
> > > 
> > > Ah, I see. __kfifo_alloc() uses kmalloc() internally. The kfifo API will
> > > not work for my purposes then, since I want to allocate a 16MB chunk of
> > > memory, and I'm very uncomfortable doing that with kmalloc(). I'll stick
> > > with my custom scatterlist code, which uses alloc_page() to fill in the
> > > scatterlist with order-0 allocations.
> > > 
> > 
> > I think you can use vmalloc() instead and assign this buffer with
> > kfifo_init().
> > 
> 
> Yes, that might be an option. I presume I could still use dma_map_sg()
> on the resulting scatterlist.
> 
> > > Another nitpick in the code: I've noticed that you use sgl++ in the
> > > setup_sgl() function. That should become "sgl = sg_next(sgl);" so that
> > > this code can work with an struct sg_table as well.
> > 
> > No, its by definition an array. You cannot pass as struct sg_table to
> > the kfifo_dma_* functions.
> > 
> 
> A struct sg_table is a container for an underlying chain of struct
> scatterlists, allowing for easier allocation. See the definition of
> struct sg_table and the sgl member (include/linux/scatterlist.h line
> 11).
> On Fri, Jan 15, 2010 at 11:05:07PM +0100, Stefani Seibold wrote:
> > > Am Freitag, den 15.01.2010, 14:01 -0800 schrieb Ira W. Snyder:
> > > 
> > > > Ah, I see. __kfifo_alloc() uses kmalloc() internally. The kfifo API will
> > > > not work for my purposes then, since I want to allocate a 16MB chunk of
> > > > memory, and I'm very uncomfortable doing that with kmalloc(). I'll stick
> > > > with my custom scatterlist code, which uses alloc_page() to fill in the
> > > > scatterlist with order-0 allocations.
> > > > 
> > > 
> > > I think you can use vmalloc() instead and assign this buffer with
> > > kfifo_init().
> > > 
> > 
> > Yes, that might be an option. I presume I could still use dma_map_sg()
> > 
> IIRC, struct sg_table allocates arrays of struct scatterlist in
> PAGE_SIZE chunks, and chains them together.
> 
> If you change from "sg++" to "sg_next()", you should be able to work
> with chained scatterlists. You can only have a single struct page * in
> one struct scatterlist. This would mean that if I tried to use
> kfifo_dma_out_prepare() to give me 16MB worth of data, I would need 4096
> seperate struct scatterlist entries. One for each struct page * in that
> 16MB chunk.
> 

No, this would require an initialized scatterlist array and the
kfifo_dma_* function does not expect this. And i am not sure why you
need 4096 seperate struct scatterlist entries for a continues memory, i
need only one. The scatterlist structure contains the page, the offset
and the length. The length can be more the a page size.

Stefani


  reply	other threads:[~2010-01-16  7:26 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-01-15  9:06 [PATCH] enhanced reimplemented of the kfifo API Stefani Seibold
2010-01-15 19:20 ` Ira W. Snyder
2010-01-15 21:30   ` Stefani Seibold
2010-01-15 22:01     ` Ira W. Snyder
2010-01-15 22:05       ` Stefani Seibold
2010-01-15 23:38         ` Ira W. Snyder
2010-01-16  7:25           ` Stefani Seibold [this message]
  -- strict thread matches above, loose matches on Subject: below --
2010-01-14 16:39 Stefani Seibold
2010-01-06 11:12 Stefani Seibold
2010-01-06 17:03 ` tytso
2010-01-06 17:32   ` Stefani Seibold

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=1263626750.13343.6.camel@wall-e \
    --to=stefani@seibold.net \
    --cc=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=andi@firstfloor.org \
    --cc=gregkh@suse.de \
    --cc=iws@ovro.caltech.edu \
    --cc=jens.axboe@oracle.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tytso@mit.edu \
    /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.