From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christoph Hellwig Subject: [RFC] reduce BKL contention in block device ->open/->release Date: Tue, 4 Feb 2003 19:54:05 -0500 Sender: linux-fsdevel-owner@vger.kernel.org Message-ID: <20030204195405.B17131@sgi.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Received: from ledzep.americas.sgi.com (ledzep.americas.sgi.com [192.48.203.134]) by tolkor.sgi.com (8.12.2/8.12.2/linux-outbound_gateway-1.2) with ESMTP id h14Hn3kq032385 for ; Tue, 4 Feb 2003 11:49:04 -0600 Received: from daisy-e236.americas.sgi.com (daisy-e236.americas.sgi.com [128.162.236.214]) by ledzep.americas.sgi.com (SGI-8.9.3/americas-smart-nospam1.1) with ESMTP id LAA49982 for ; Tue, 4 Feb 2003 11:40:17 -0600 (CST) Received: from taclab54.munich.sgi.com (taclab54.munich.sgi.com [144.253.195.54]) by daisy-e236.americas.sgi.com (SGI-8.9.3/SGI-server-1.8) with ESMTP id LAA20509 for ; Tue, 4 Feb 2003 11:40:16 -0600 (CST) Received: (from hch@localhost) by taclab54.munich.sgi.com (8.11.6/8.11.6) id h150s6L17140 for linux-fsdevel@vger.kernel.org; Tue, 4 Feb 2003 19:54:06 -0500 To: linux-fsdevel@vger.kernel.org Content-Disposition: inline List-Id: linux-fsdevel.vger.kernel.org I looked through the callchain carefully, but it can't find anything that needs BKL protection but the actual LLDD methods. =========================================================================== Index: linux/fs/block_dev.c =========================================================================== --- /usr/tmp/TmpDir.1943-0/linux/fs/block_dev.c_1.35 Mon Feb 3 18:36:20 2003 +++ linux/fs/block_dev.c Mon Feb 3 18:31:49 2003 @@ -560,15 +560,17 @@ kdev_t dev = to_kdev_t(bdev->bd_dev); down(&bdev->bd_sem); - lock_kernel(); if (!bdev->bd_op) bdev->bd_op = get_blkfops(MAJOR(dev)); if (bdev->bd_op) { ret = 0; if (bdev->bd_op->owner) __MOD_INC_USE_COUNT(bdev->bd_op->owner); - if (bdev->bd_op->open) + if (bdev->bd_op->open) { + lock_kernel(); ret = bdev->bd_op->open(inode, file); + unlock_kernel(); + } if (!ret) { bdev->bd_openers++; bdev->bd_inode->i_size = blkdev_size(dev); @@ -580,7 +582,6 @@ bdev->bd_op = NULL; } } - unlock_kernel(); up(&bdev->bd_sem); if (ret) bdput(bdev); @@ -630,20 +631,21 @@ struct inode *bd_inode = bdev->bd_inode; down(&bdev->bd_sem); - lock_kernel(); if (kind == BDEV_FILE && bdev->bd_openers == 1) __block_fsync(bd_inode); else if (kind == BDEV_FS) fsync_no_super(rdev); if (!--bdev->bd_openers) kill_bdev(bdev); - if (bdev->bd_op->release) + if (bdev->bd_op->release) { + lock_kernel(); ret = bdev->bd_op->release(bd_inode, NULL); + unlock_kernel(); + } if (bdev->bd_op->owner) __MOD_DEC_USE_COUNT(bdev->bd_op->owner); if (!bdev->bd_openers) bdev->bd_op = NULL; - unlock_kernel(); up(&bdev->bd_sem); bdput(bdev); return ret;