* Re: [PATCH 4/5] block: introduce helpers for allocating IO buffers from slab
[not found] ` <20181018152219.GB28300@lst.de>
@ 2018-10-19 2:53 ` Ming Lei
2018-10-19 4:06 ` Jens Axboe
2018-10-19 5:43 ` Dave Chinner
0 siblings, 2 replies; 3+ messages in thread
From: Ming Lei @ 2018-10-19 2:53 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Matthew Wilcox, Jens Axboe, linux-block, Vitaly Kuznetsov,
Dave Chinner, Linux FS Devel, Darrick J . Wong, linux-xfs,
Bart Van Assche
On Thu, Oct 18, 2018 at 05:22:19PM +0200, Christoph Hellwig wrote:
> On Thu, Oct 18, 2018 at 08:11:23AM -0700, Matthew Wilcox wrote:
> > On Thu, Oct 18, 2018 at 04:42:07PM +0200, Christoph Hellwig wrote:
> > > This all seems quite complicated.
> > >
> > > I think the interface we'd want is more one that has a little
> > > cache of a single page in the queue, and a little bitmap which
> > > sub-page size blocks of it are used.
> > >
> > > Something like (pseudo code minus locking):
> > >
> > > void *blk_alloc_sector_buffer(struct block_device *bdev, gfp_t gfp)
> > > {
> > > unsigned block_size = block_size(bdev);
> > >
> > > if (blocksize >= PAGE_SIZE)
> > > return (void *)__get_free_pages(gfp, get_order(blocksize));
> > >
> > > if (bdev->fragment_cache_page) {
> > > [ <find fragment in bdev->fragment_cache_page using
> > > e.g. bitmap and return if found]
> > > }
> > >
> > > bdev->fragment_cache_page = (void *)__get_free_page(gfp);
> > > goto find_again;
> > > }
> >
> > This looks a lot like page_frag_alloc() except I think page_frag_alloc()
> > may be more efficient.
>
> Oh, nice. Sounds like XFS should just use page_frag_alloc. I'll give
> it a spin.
XFS or other fs can use page_frag_alloc() directly, seems not necessary to
introduce this change in block layer any more given 512-aligned buffer
should be fine everywhere.
The only benefit to make it as block helper is that the offset or size
can be checked with q->dma_alignment.
Dave/Jens, do you think which way is better? Put allocation as block
helper or fs uses page_frag_alloc() directly for allocating 512*N-byte
buffer(total size is less than PAGE_SIZE)?
Thanks,
Ming
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH 4/5] block: introduce helpers for allocating IO buffers from slab
2018-10-19 2:53 ` [PATCH 4/5] block: introduce helpers for allocating IO buffers from slab Ming Lei
@ 2018-10-19 4:06 ` Jens Axboe
2018-10-19 5:43 ` Dave Chinner
1 sibling, 0 replies; 3+ messages in thread
From: Jens Axboe @ 2018-10-19 4:06 UTC (permalink / raw)
To: Ming Lei, Christoph Hellwig
Cc: Matthew Wilcox, linux-block, Vitaly Kuznetsov, Dave Chinner,
Linux FS Devel, Darrick J . Wong, linux-xfs, Bart Van Assche
On 10/18/18 8:53 PM, Ming Lei wrote:
> On Thu, Oct 18, 2018 at 05:22:19PM +0200, Christoph Hellwig wrote:
>> On Thu, Oct 18, 2018 at 08:11:23AM -0700, Matthew Wilcox wrote:
>>> On Thu, Oct 18, 2018 at 04:42:07PM +0200, Christoph Hellwig wrote:
>>>> This all seems quite complicated.
>>>>
>>>> I think the interface we'd want is more one that has a little
>>>> cache of a single page in the queue, and a little bitmap which
>>>> sub-page size blocks of it are used.
>>>>
>>>> Something like (pseudo code minus locking):
>>>>
>>>> void *blk_alloc_sector_buffer(struct block_device *bdev, gfp_t gfp)
>>>> {
>>>> unsigned block_size = block_size(bdev);
>>>>
>>>> if (blocksize >= PAGE_SIZE)
>>>> return (void *)__get_free_pages(gfp, get_order(blocksize));
>>>>
>>>> if (bdev->fragment_cache_page) {
>>>> [ <find fragment in bdev->fragment_cache_page using
>>>> e.g. bitmap and return if found]
>>>> }
>>>>
>>>> bdev->fragment_cache_page = (void *)__get_free_page(gfp);
>>>> goto find_again;
>>>> }
>>>
>>> This looks a lot like page_frag_alloc() except I think page_frag_alloc()
>>> may be more efficient.
>>
>> Oh, nice. Sounds like XFS should just use page_frag_alloc. I'll give
>> it a spin.
>
> XFS or other fs can use page_frag_alloc() directly, seems not necessary to
> introduce this change in block layer any more given 512-aligned buffer
> should be fine everywhere.
>
> The only benefit to make it as block helper is that the offset or size
> can be checked with q->dma_alignment.
>
> Dave/Jens, do you think which way is better? Put allocation as block
> helper or fs uses page_frag_alloc() directly for allocating 512*N-byte
> buffer(total size is less than PAGE_SIZE)?
I'd greatly prefer having the FS use that directly, seems kind of
pointless to provide an abstraction for that at that point.
--
Jens Axboe
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH 4/5] block: introduce helpers for allocating IO buffers from slab
2018-10-19 2:53 ` [PATCH 4/5] block: introduce helpers for allocating IO buffers from slab Ming Lei
2018-10-19 4:06 ` Jens Axboe
@ 2018-10-19 5:43 ` Dave Chinner
1 sibling, 0 replies; 3+ messages in thread
From: Dave Chinner @ 2018-10-19 5:43 UTC (permalink / raw)
To: Ming Lei
Cc: Christoph Hellwig, Matthew Wilcox, Jens Axboe, linux-block,
Vitaly Kuznetsov, Dave Chinner, Linux FS Devel, Darrick J . Wong,
linux-xfs, Bart Van Assche
On Fri, Oct 19, 2018 at 10:53:49AM +0800, Ming Lei wrote:
> On Thu, Oct 18, 2018 at 05:22:19PM +0200, Christoph Hellwig wrote:
> > On Thu, Oct 18, 2018 at 08:11:23AM -0700, Matthew Wilcox wrote:
> > > On Thu, Oct 18, 2018 at 04:42:07PM +0200, Christoph Hellwig wrote:
> > > > This all seems quite complicated.
> > > >
> > > > I think the interface we'd want is more one that has a little
> > > > cache of a single page in the queue, and a little bitmap which
> > > > sub-page size blocks of it are used.
> > > >
> > > > Something like (pseudo code minus locking):
> > > >
> > > > void *blk_alloc_sector_buffer(struct block_device *bdev, gfp_t gfp)
> > > > {
> > > > unsigned block_size = block_size(bdev);
> > > >
> > > > if (blocksize >= PAGE_SIZE)
> > > > return (void *)__get_free_pages(gfp, get_order(blocksize));
> > > >
> > > > if (bdev->fragment_cache_page) {
> > > > [ <find fragment in bdev->fragment_cache_page using
> > > > e.g. bitmap and return if found]
> > > > }
> > > >
> > > > bdev->fragment_cache_page = (void *)__get_free_page(gfp);
> > > > goto find_again;
> > > > }
> > >
> > > This looks a lot like page_frag_alloc() except I think page_frag_alloc()
> > > may be more efficient.
> >
> > Oh, nice. Sounds like XFS should just use page_frag_alloc. I'll give
> > it a spin.
>
> XFS or other fs can use page_frag_alloc() directly, seems not necessary to
> introduce this change in block layer any more given 512-aligned buffer
> should be fine everywhere.
>
> The only benefit to make it as block helper is that the offset or size
> can be checked with q->dma_alignment.
>
> Dave/Jens, do you think which way is better? Put allocation as block
> helper or fs uses page_frag_alloc() directly for allocating 512*N-byte
> buffer(total size is less than PAGE_SIZE)?
Cristoph has already said he's looking at using page_frag_alloc()
directly in XFS....
Cheers,
Dave.
--
Dave Chinner
david@fromorbit.com
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2018-10-19 13:47 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20181018131817.11813-1-ming.lei@redhat.com>
[not found] ` <20181018131817.11813-5-ming.lei@redhat.com>
[not found] ` <20181018144207.GD26828@lst.de>
[not found] ` <20181018151123.GD32429@bombadil.infradead.org>
[not found] ` <20181018152219.GB28300@lst.de>
2018-10-19 2:53 ` [PATCH 4/5] block: introduce helpers for allocating IO buffers from slab Ming Lei
2018-10-19 4:06 ` Jens Axboe
2018-10-19 5:43 ` Dave Chinner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).