aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/xen-blkfront.c
diff options
context:
space:
mode:
authorSteven Noonan <snoonan@amazon.com>2012-02-17 15:04:44 -0500
committerJens Axboe <axboe@kernel.dk>2012-03-20 07:52:41 -0400
commit3467811e26660eb46bc655234573d22d6876d5f9 (patch)
treeb57b2cdc3d373af79062bc26cd71500773c64fb5 /drivers/block/xen-blkfront.c
parentdad5cf659b202b5070c8616b5c515f6ca4db0c42 (diff)
xen-blkfront: make blkif_io_lock spinlock per-device
This patch moves the global blkif_io_lock to the per-device structure. The spinlock seems to exists for two reasons: to disable IRQs when in the interrupt handlers for blkfront, and to protect the blkfront VBDs when a detachment is requested. Having a global blkif_io_lock doesn't make sense given the use case, and it drastically hinders performance due to contention. All VBDs with pending IOs have to take the lock in order to get work done, which serializes everything pretty badly. Signed-off-by: Steven Noonan <snoonan@amazon.com> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Diffstat (limited to 'drivers/block/xen-blkfront.c')
-rw-r--r--drivers/block/xen-blkfront.c32
1 files changed, 16 insertions, 16 deletions
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
index 537cb722a21..5d9c559f187 100644
--- a/drivers/block/xen-blkfront.c
+++ b/drivers/block/xen-blkfront.c
@@ -82,6 +82,7 @@ static const struct block_device_operations xlvbd_block_fops;
82 */ 82 */
83struct blkfront_info 83struct blkfront_info
84{ 84{
85 spinlock_t io_lock;
85 struct mutex mutex; 86 struct mutex mutex;
86 struct xenbus_device *xbdev; 87 struct xenbus_device *xbdev;
87 struct gendisk *gd; 88 struct gendisk *gd;
@@ -106,8 +107,6 @@ struct blkfront_info
106 int is_ready; 107 int is_ready;
107}; 108};
108 109
109static DEFINE_SPINLOCK(blkif_io_lock);
110
111static unsigned int nr_minors; 110static unsigned int nr_minors;
112static unsigned long *minors; 111static unsigned long *minors;
113static DEFINE_SPINLOCK(minor_lock); 112static DEFINE_SPINLOCK(minor_lock);
@@ -418,7 +417,7 @@ static int xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size)
418 struct request_queue *rq; 417 struct request_queue *rq;
419 struct blkfront_info *info = gd->private_data; 418 struct blkfront_info *info = gd->private_data;
420 419
421 rq = blk_init_queue(do_blkif_request, &blkif_io_lock); 420 rq = blk_init_queue(do_blkif_request, &info->io_lock);
422 if (rq == NULL) 421 if (rq == NULL)
423 return -1; 422 return -1;
424 423
@@ -635,14 +634,14 @@ static void xlvbd_release_gendisk(struct blkfront_info *info)
635 if (info->rq == NULL) 634 if (info->rq == NULL)
636 return; 635 return;
637 636
638 spin_lock_irqsave(&blkif_io_lock, flags); 637 spin_lock_irqsave(&info->io_lock, flags);
639 638
640 /* No more blkif_request(). */ 639 /* No more blkif_request(). */
641 blk_stop_queue(info->rq); 640 blk_stop_queue(info->rq);
642 641
643 /* No more gnttab callback work. */ 642 /* No more gnttab callback work. */
644 gnttab_cancel_free_callback(&info->callback); 643 gnttab_cancel_free_callback(&info->callback);
645 spin_unlock_irqrestore(&blkif_io_lock, flags); 644 spin_unlock_irqrestore(&info->io_lock, flags);
646 645
647 /* Flush gnttab callback work. Must be done with no locks held. */ 646 /* Flush gnttab callback work. Must be done with no locks held. */
648 flush_work_sync(&info->work); 647 flush_work_sync(&info->work);
@@ -674,16 +673,16 @@ static void blkif_restart_queue(struct work_struct *work)
674{ 673{
675 struct blkfront_info *info = container_of(work, struct blkfront_info, work); 674 struct blkfront_info *info = container_of(work, struct blkfront_info, work);
676 675
677 spin_lock_irq(&blkif_io_lock); 676 spin_lock_irq(&info->io_lock);
678 if (info->connected == BLKIF_STATE_CONNECTED) 677 if (info->connected == BLKIF_STATE_CONNECTED)
679 kick_pending_request_queues(info); 678 kick_pending_request_queues(info);
680 spin_unlock_irq(&blkif_io_lock); 679 spin_unlock_irq(&info->io_lock);
681} 680}
682 681
683static void blkif_free(struct blkfront_info *info, int suspend) 682static void blkif_free(struct blkfront_info *info, int suspend)
684{ 683{
685 /* Prevent new requests being issued until we fix things up. */ 684 /* Prevent new requests being issued until we fix things up. */
686 spin_lock_irq(&blkif_io_lock); 685 spin_lock_irq(&info->io_lock);
687 info->connected = suspend ? 686 info->connected = suspend ?
688 BLKIF_STATE_SUSPENDED : BLKIF_STATE_DISCONNECTED; 687 BLKIF_STATE_SUSPENDED : BLKIF_STATE_DISCONNECTED;
689 /* No more blkif_request(). */ 688 /* No more blkif_request(). */
@@ -691,7 +690,7 @@ static void blkif_free(struct blkfront_info *info, int suspend)
691 blk_stop_queue(info->rq); 690 blk_stop_queue(info->rq);
692 /* No more gnttab callback work. */ 691 /* No more gnttab callback work. */
693 gnttab_cancel_free_callback(&info->callback); 692 gnttab_cancel_free_callback(&info->callback);
694 spin_unlock_irq(&blkif_io_lock); 693 spin_unlock_irq(&info->io_lock);
695 694
696 /* Flush gnttab callback work. Must be done with no locks held. */ 695 /* Flush gnttab callback work. Must be done with no locks held. */
697 flush_work_sync(&info->work); 696 flush_work_sync(&info->work);
@@ -727,10 +726,10 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
727 struct blkfront_info *info = (struct blkfront_info *)dev_id; 726 struct blkfront_info *info = (struct blkfront_info *)dev_id;
728 int error; 727 int error;
729 728
730 spin_lock_irqsave(&blkif_io_lock, flags); 729 spin_lock_irqsave(&info->io_lock, flags);
731 730
732 if (unlikely(info->connected != BLKIF_STATE_CONNECTED)) { 731 if (unlikely(info->connected != BLKIF_STATE_CONNECTED)) {
733 spin_unlock_irqrestore(&blkif_io_lock, flags); 732 spin_unlock_irqrestore(&info->io_lock, flags);
734 return IRQ_HANDLED; 733 return IRQ_HANDLED;
735 } 734 }
736 735
@@ -815,7 +814,7 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
815 814
816 kick_pending_request_queues(info); 815 kick_pending_request_queues(info);
817 816
818 spin_unlock_irqrestore(&blkif_io_lock, flags); 817 spin_unlock_irqrestore(&info->io_lock, flags);
819 818
820 return IRQ_HANDLED; 819 return IRQ_HANDLED;
821} 820}
@@ -990,6 +989,7 @@ static int blkfront_probe(struct xenbus_device *dev,
990 } 989 }
991 990
992 mutex_init(&info->mutex); 991 mutex_init(&info->mutex);
992 spin_lock_init(&info->io_lock);
993 info->xbdev = dev; 993 info->xbdev = dev;
994 info->vdevice = vdevice; 994 info->vdevice = vdevice;
995 info->connected = BLKIF_STATE_DISCONNECTED; 995 info->connected = BLKIF_STATE_DISCONNECTED;
@@ -1067,7 +1067,7 @@ static int blkif_recover(struct blkfront_info *info)
1067 1067
1068 xenbus_switch_state(info->xbdev, XenbusStateConnected); 1068 xenbus_switch_state(info->xbdev, XenbusStateConnected);
1069 1069
1070 spin_lock_irq(&blkif_io_lock); 1070 spin_lock_irq(&info->io_lock);
1071 1071
1072 /* Now safe for us to use the shared ring */ 1072 /* Now safe for us to use the shared ring */
1073 info->connected = BLKIF_STATE_CONNECTED; 1073 info->connected = BLKIF_STATE_CONNECTED;
@@ -1078,7 +1078,7 @@ static int blkif_recover(struct blkfront_info *info)
1078 /* Kick any other new requests queued since we resumed */ 1078 /* Kick any other new requests queued since we resumed */
1079 kick_pending_request_queues(info); 1079 kick_pending_request_queues(info);
1080 1080
1081 spin_unlock_irq(&blkif_io_lock); 1081 spin_unlock_irq(&info->io_lock);
1082 1082
1083 return 0; 1083 return 0;
1084} 1084}
@@ -1276,10 +1276,10 @@ static void blkfront_connect(struct blkfront_info *info)
1276 xenbus_switch_state(info->xbdev, XenbusStateConnected); 1276 xenbus_switch_state(info->xbdev, XenbusStateConnected);
1277 1277
1278 /* Kick pending requests. */ 1278 /* Kick pending requests. */
1279 spin_lock_irq(&blkif_io_lock); 1279 spin_lock_irq(&info->io_lock);
1280 info->connected = BLKIF_STATE_CONNECTED; 1280 info->connected = BLKIF_STATE_CONNECTED;
1281 kick_pending_request_queues(info); 1281 kick_pending_request_queues(info);
1282 spin_unlock_irq(&blkif_io_lock); 1282 spin_unlock_irq(&info->io_lock);
1283 1283
1284 add_disk(info->gd); 1284 add_disk(info->gd);
1285 1285