mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
block: make queue flags non-atomic
We can save some atomic ops in the IO path, if we clearly define the rules of how to modify the queue flags. Signed-off-by: Jens Axboe <[email protected]>
This commit is contained in:
parent
68154e90c9
commit
75ad23bc0f
13 changed files with 102 additions and 49 deletions
|
|
@ -1773,7 +1773,7 @@ static int scsi_debug_slave_alloc(struct scsi_device *sdp)
|
|||
if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
|
||||
printk(KERN_INFO "scsi_debug: slave_alloc <%u %u %u %u>\n",
|
||||
sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
|
||||
set_bit(QUEUE_FLAG_BIDI, &sdp->request_queue->queue_flags);
|
||||
queue_flag_set_unlocked(QUEUE_FLAG_BIDI, sdp->request_queue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -536,6 +536,9 @@ static void scsi_run_queue(struct request_queue *q)
|
|||
!shost->host_blocked && !shost->host_self_blocked &&
|
||||
!((shost->can_queue > 0) &&
|
||||
(shost->host_busy >= shost->can_queue))) {
|
||||
|
||||
int flagset;
|
||||
|
||||
/*
|
||||
* As long as shost is accepting commands and we have
|
||||
* starved queues, call blk_run_queue. scsi_request_fn
|
||||
|
|
@ -549,19 +552,20 @@ static void scsi_run_queue(struct request_queue *q)
|
|||
sdev = list_entry(shost->starved_list.next,
|
||||
struct scsi_device, starved_entry);
|
||||
list_del_init(&sdev->starved_entry);
|
||||
spin_unlock_irqrestore(shost->host_lock, flags);
|
||||
spin_unlock(shost->host_lock);
|
||||
|
||||
spin_lock(sdev->request_queue->queue_lock);
|
||||
flagset = test_bit(QUEUE_FLAG_REENTER, &q->queue_flags) &&
|
||||
!test_bit(QUEUE_FLAG_REENTER,
|
||||
&sdev->request_queue->queue_flags);
|
||||
if (flagset)
|
||||
queue_flag_set(QUEUE_FLAG_REENTER, sdev->request_queue);
|
||||
__blk_run_queue(sdev->request_queue);
|
||||
if (flagset)
|
||||
queue_flag_clear(QUEUE_FLAG_REENTER, sdev->request_queue);
|
||||
spin_unlock(sdev->request_queue->queue_lock);
|
||||
|
||||
if (test_bit(QUEUE_FLAG_REENTER, &q->queue_flags) &&
|
||||
!test_and_set_bit(QUEUE_FLAG_REENTER,
|
||||
&sdev->request_queue->queue_flags)) {
|
||||
blk_run_queue(sdev->request_queue);
|
||||
clear_bit(QUEUE_FLAG_REENTER,
|
||||
&sdev->request_queue->queue_flags);
|
||||
} else
|
||||
blk_run_queue(sdev->request_queue);
|
||||
|
||||
spin_lock_irqsave(shost->host_lock, flags);
|
||||
spin_lock(shost->host_lock);
|
||||
if (unlikely(!list_empty(&sdev->starved_entry)))
|
||||
/*
|
||||
* sdev lost a race, and was put back on the
|
||||
|
|
@ -1585,8 +1589,9 @@ struct request_queue *__scsi_alloc_queue(struct Scsi_Host *shost,
|
|||
|
||||
blk_queue_max_segment_size(q, dma_get_max_seg_size(dev));
|
||||
|
||||
/* New queue, no concurrency on queue_flags */
|
||||
if (!shost->use_clustering)
|
||||
clear_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags);
|
||||
queue_flag_clear_unlocked(QUEUE_FLAG_CLUSTER, q);
|
||||
|
||||
/*
|
||||
* set a reasonable default alignment on word boundaries: the
|
||||
|
|
|
|||
|
|
@ -248,8 +248,7 @@ static int sas_bsg_initialize(struct Scsi_Host *shost, struct sas_rphy *rphy)
|
|||
else
|
||||
q->queuedata = shost;
|
||||
|
||||
set_bit(QUEUE_FLAG_BIDI, &q->queue_flags);
|
||||
|
||||
queue_flag_set_unlocked(QUEUE_FLAG_BIDI, q);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue