Re: [PATCH 04/11] xfs: cleanup _xfs_buf_get_pages
From: Dave Chinner <david@fromorbit.com>
Date: 2021-05-19 22:40:31
On Wed, May 19, 2021 at 09:08:53PM +0200, Christoph Hellwig wrote:
quoted hunk ↗ jump to hunk
Remove the check for an existing b_pages array as this function is always called right after allocating a buffer, so this can't happen. Also use kmem_zalloc to allocate the page array instead of doing a manual memset gіven that the inline array is already pre-zeroed as part of the freshly allocated buffer anyway. Signed-off-by: Christoph Hellwig <hch@lst.de> --- fs/xfs/xfs_buf.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-)diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 392b85d059bff5..9c64c374411081 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c@@ -281,19 +281,18 @@ _xfs_buf_get_pages( struct xfs_buf *bp, int page_count) { - /* Make sure that we have a page list */ - if (bp->b_pages == NULL) { - bp->b_page_count = page_count; - if (page_count <= XB_PAGES) { - bp->b_pages = bp->b_page_array; - } else { - bp->b_pages = kmem_alloc(sizeof(struct page *) * - page_count, KM_NOFS); - if (bp->b_pages == NULL) - return -ENOMEM; - } - memset(bp->b_pages, 0, sizeof(struct page *) * page_count); + ASSERT(bp->b_pages == NULL); + + bp->b_page_count = page_count; + if (page_count > XB_PAGES) { + bp->b_pages = kmem_zalloc(sizeof(struct page *) * page_count, + KM_NOFS); + if (!bp->b_pages) + return -ENOMEM; + } else { + bp->b_pages = bp->b_page_array; } + return 0; }
This will not apply (and break) the bulk alloc patch I sent out - we
have to ensure that the b_pages array is always zeroed before we
call the bulk alloc function, hence I moved the memset() in this
function to be unconditional. I almost cleaned up this function in
that patchset....
Just doing this:
bp->b_page_count = page_count;
if (page_count > XB_PAGES) {
bp->b_pages = kmem_alloc(sizeof(struct page *) * page_count,
KM_NOFS);
if (!bp->b_pages)
return -ENOMEM;
} else {
bp->b_pages = bp->b_page_array;
}
memset(bp->b_pages, 0, sizeof(struct page *) * page_count);
return 0;
will make it work fine with bulk alloc.
Cheers,
Dave.
--
Dave Chinner
david@fromorbit.com