From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jeff Moyer Subject: Re: [PATCH 10/11] VFS: Cache request_queue in struct block_device Date: Mon, 08 Aug 2011 14:22:56 -0400 Message-ID: References: <1312259893-4548-1-git-send-email-andi@firstfloor.org> <1312259893-4548-11-git-send-email-andi@firstfloor.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, hch@infradead.org, Andi Kleen , jaxboe@fusionio.com To: Andi Kleen Return-path: In-Reply-To: <1312259893-4548-11-git-send-email-andi@firstfloor.org> (Andi Kleen's message of "Mon, 1 Aug 2011 21:38:12 -0700") Sender: linux-kernel-owner@vger.kernel.org List-Id: linux-fsdevel.vger.kernel.org CC'd Jens. Andi Kleen writes: > From: Andi Kleen > > This makes it possible to get from the inode to the request_queue > with one less cache miss. Used in followon optimization. > > The livetime of the pointer is the same as the gendisk. > > This assumes that the queue will always stay the same in the > gendisk while it's visible to block_devices. I think that's safe correct? > > Signed-off-by: Andi Kleen > --- > fs/block_dev.c | 3 +++ > include/linux/fs.h | 2 ++ > 2 files changed, 5 insertions(+), 0 deletions(-) > > diff --git a/fs/block_dev.c b/fs/block_dev.c > index f55aad4..5e07536 100644 > --- a/fs/block_dev.c > +++ b/fs/block_dev.c > @@ -1110,6 +1110,7 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) > mutex_lock_nested(&bdev->bd_mutex, for_part); > if (!bdev->bd_openers) { > bdev->bd_disk = disk; > + bdev->bd_queue = disk->queue; > bdev->bd_contains = bdev; > if (!partno) { > struct backing_dev_info *bdi; > @@ -1130,6 +1131,7 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) > disk_put_part(bdev->bd_part); > bdev->bd_part = NULL; > bdev->bd_disk = NULL; > + bdev->bd_queue = NULL; > mutex_unlock(&bdev->bd_mutex); > disk_unblock_events(disk); > module_put(disk->fops->owner); > @@ -1203,6 +1205,7 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) > disk_put_part(bdev->bd_part); > bdev->bd_disk = NULL; > bdev->bd_part = NULL; > + bdev->bd_queue = NULL; > bdev_inode_switch_bdi(bdev->bd_inode, &default_backing_dev_info); > if (bdev != bdev->bd_contains) > __blkdev_put(bdev->bd_contains, mode, 1); > diff --git a/include/linux/fs.h b/include/linux/fs.h > index f23bcb7..ea5cb4d 100644 > --- a/include/linux/fs.h > +++ b/include/linux/fs.h > @@ -657,6 +657,7 @@ struct address_space { > * must be enforced here for CRIS, to let the least significant bit > * of struct page's "mapping" pointer be used for PAGE_MAPPING_ANON. > */ > +struct request_queue; > > struct block_device { > dev_t bd_dev; /* not a kdev_t - it's a search key */ > @@ -679,6 +680,7 @@ struct block_device { > unsigned bd_part_count; > int bd_invalidated; > struct gendisk * bd_disk; > + struct request_queue * bd_queue; > struct list_head bd_list; > /* > * Private data. You must have bd_claim'ed the block_device