Skip to content

Commit 0585b75

Browse files
committed
sx8: convert to blk-mq
Convert from the old request_fn style driver to blk-mq. Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent 8535fd6 commit 0585b75

File tree

1 file changed

+68
-45
lines changed

1 file changed

+68
-45
lines changed

drivers/block/sx8.c

Lines changed: 68 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
#include <linux/pci.h>
1717
#include <linux/slab.h>
1818
#include <linux/spinlock.h>
19-
#include <linux/blkdev.h>
19+
#include <linux/blk-mq.h>
2020
#include <linux/sched.h>
2121
#include <linux/interrupt.h>
2222
#include <linux/compiler.h>
@@ -244,6 +244,7 @@ struct carm_port {
244244
unsigned int port_no;
245245
struct gendisk *disk;
246246
struct carm_host *host;
247+
struct blk_mq_tag_set tag_set;
247248

248249
/* attached device characteristics */
249250
u64 capacity;
@@ -279,6 +280,7 @@ struct carm_host {
279280
unsigned int state;
280281
u32 fw_ver;
281282

283+
struct blk_mq_tag_set tag_set;
282284
struct request_queue *oob_q;
283285
unsigned int n_oob;
284286

@@ -750,7 +752,7 @@ static inline void carm_end_request_queued(struct carm_host *host,
750752
struct request *req = crq->rq;
751753
int rc;
752754

753-
__blk_end_request_all(req, error);
755+
blk_mq_end_request(req, error);
754756

755757
rc = carm_put_request(host, crq);
756758
assert(rc == 0);
@@ -760,7 +762,7 @@ static inline void carm_push_q (struct carm_host *host, struct request_queue *q)
760762
{
761763
unsigned int idx = host->wait_q_prod % CARM_MAX_WAIT_Q;
762764

763-
blk_stop_queue(q);
765+
blk_mq_stop_hw_queues(q);
764766
VPRINTK("STOPPED QUEUE %p\n", q);
765767

766768
host->wait_q[idx] = q;
@@ -785,7 +787,7 @@ static inline void carm_round_robin(struct carm_host *host)
785787
{
786788
struct request_queue *q = carm_pop_q(host);
787789
if (q) {
788-
blk_start_queue(q);
790+
blk_mq_start_hw_queues(q);
789791
VPRINTK("STARTED QUEUE %p\n", q);
790792
}
791793
}
@@ -802,62 +804,62 @@ static inline void carm_end_rq(struct carm_host *host, struct carm_request *crq,
802804
}
803805
}
804806

805-
static void carm_oob_rq_fn(struct request_queue *q)
807+
static blk_status_t carm_oob_queue_rq(struct blk_mq_hw_ctx *hctx,
808+
const struct blk_mq_queue_data *bd)
806809
{
810+
struct request_queue *q = hctx->queue;
807811
struct carm_host *host = q->queuedata;
808812
struct carm_request *crq;
809-
struct request *rq;
810813
int rc;
811814

812-
while (1) {
813-
DPRINTK("get req\n");
814-
rq = blk_fetch_request(q);
815-
if (!rq)
816-
break;
815+
blk_mq_start_request(bd->rq);
817816

818-
crq = rq->special;
819-
assert(crq != NULL);
820-
assert(crq->rq == rq);
817+
spin_lock_irq(&host->lock);
821818

822-
crq->n_elem = 0;
819+
crq = bd->rq->special;
820+
assert(crq != NULL);
821+
assert(crq->rq == bd->rq);
823822

824-
DPRINTK("send req\n");
825-
rc = carm_send_msg(host, crq);
826-
if (rc) {
827-
blk_requeue_request(q, rq);
828-
carm_push_q(host, q);
829-
return; /* call us again later, eventually */
830-
}
823+
crq->n_elem = 0;
824+
825+
DPRINTK("send req\n");
826+
rc = carm_send_msg(host, crq);
827+
if (rc) {
828+
carm_push_q(host, q);
829+
spin_unlock_irq(&host->lock);
830+
return BLK_STS_DEV_RESOURCE;
831831
}
832+
833+
spin_unlock_irq(&host->lock);
834+
return BLK_STS_OK;
832835
}
833836

834-
static void carm_rq_fn(struct request_queue *q)
837+
static blk_status_t carm_queue_rq(struct blk_mq_hw_ctx *hctx,
838+
const struct blk_mq_queue_data *bd)
835839
{
840+
struct request_queue *q = hctx->queue;
836841
struct carm_port *port = q->queuedata;
837842
struct carm_host *host = port->host;
838843
struct carm_msg_rw *msg;
839844
struct carm_request *crq;
840-
struct request *rq;
845+
struct request *rq = bd->rq;
841846
struct scatterlist *sg;
842847
int writing = 0, pci_dir, i, n_elem, rc;
843848
u32 tmp;
844849
unsigned int msg_size;
845850

846-
queue_one_request:
847-
VPRINTK("get req\n");
848-
rq = blk_peek_request(q);
849-
if (!rq)
850-
return;
851+
blk_mq_start_request(rq);
852+
853+
spin_lock_irq(&host->lock);
851854

852855
crq = carm_get_request(host);
853856
if (!crq) {
854857
carm_push_q(host, q);
855-
return; /* call us again later, eventually */
858+
spin_unlock_irq(&host->lock);
859+
return BLK_STS_DEV_RESOURCE;
856860
}
857861
crq->rq = rq;
858862

859-
blk_start_request(rq);
860-
861863
if (rq_data_dir(rq) == WRITE) {
862864
writing = 1;
863865
pci_dir = PCI_DMA_TODEVICE;
@@ -869,15 +871,19 @@ static void carm_rq_fn(struct request_queue *q)
869871
sg = &crq->sg[0];
870872
n_elem = blk_rq_map_sg(q, rq, sg);
871873
if (n_elem <= 0) {
874+
/* request with no s/g entries? */
872875
carm_end_rq(host, crq, BLK_STS_IOERR);
873-
return; /* request with no s/g entries? */
876+
spin_unlock_irq(&host->lock);
877+
return BLK_STS_IOERR;
874878
}
875879

876880
/* map scatterlist to PCI bus addresses */
877881
n_elem = pci_map_sg(host->pdev, sg, n_elem, pci_dir);
878882
if (n_elem <= 0) {
883+
/* request with no s/g entries? */
879884
carm_end_rq(host, crq, BLK_STS_IOERR);
880-
return; /* request with no s/g entries? */
885+
spin_unlock_irq(&host->lock);
886+
return BLK_STS_IOERR;
881887
}
882888
crq->n_elem = n_elem;
883889
crq->port = port;
@@ -927,12 +933,13 @@ static void carm_rq_fn(struct request_queue *q)
927933
rc = carm_send_msg(host, crq);
928934
if (rc) {
929935
carm_put_request(host, crq);
930-
blk_requeue_request(q, rq);
931936
carm_push_q(host, q);
932-
return; /* call us again later, eventually */
937+
spin_unlock_irq(&host->lock);
938+
return BLK_STS_DEV_RESOURCE;
933939
}
934940

935-
goto queue_one_request;
941+
spin_unlock_irq(&host->lock);
942+
return BLK_STS_OK;
936943
}
937944

938945
static void carm_handle_array_info(struct carm_host *host,
@@ -1485,6 +1492,14 @@ static int carm_init_host(struct carm_host *host)
14851492
return 0;
14861493
}
14871494

1495+
static const struct blk_mq_ops carm_oob_mq_ops = {
1496+
.queue_rq = carm_oob_queue_rq,
1497+
};
1498+
1499+
static const struct blk_mq_ops carm_mq_ops = {
1500+
.queue_rq = carm_queue_rq,
1501+
};
1502+
14881503
static int carm_init_disks(struct carm_host *host)
14891504
{
14901505
unsigned int i;
@@ -1513,9 +1528,10 @@ static int carm_init_disks(struct carm_host *host)
15131528
disk->fops = &carm_bd_ops;
15141529
disk->private_data = port;
15151530

1516-
q = blk_init_queue(carm_rq_fn, &host->lock);
1517-
if (!q) {
1518-
rc = -ENOMEM;
1531+
q = blk_mq_init_sq_queue(&port->tag_set, &carm_mq_ops,
1532+
max_queue, BLK_MQ_F_SHOULD_MERGE);
1533+
if (IS_ERR(q)) {
1534+
rc = PTR_ERR(q);
15191535
break;
15201536
}
15211537
disk->queue = q;
@@ -1533,14 +1549,18 @@ static void carm_free_disks(struct carm_host *host)
15331549
unsigned int i;
15341550

15351551
for (i = 0; i < CARM_MAX_PORTS; i++) {
1536-
struct gendisk *disk = host->port[i].disk;
1552+
struct carm_port *port = &host->port[i];
1553+
struct gendisk *disk = port->disk;
1554+
15371555
if (disk) {
15381556
struct request_queue *q = disk->queue;
15391557

15401558
if (disk->flags & GENHD_FL_UP)
15411559
del_gendisk(disk);
1542-
if (q)
1560+
if (q) {
1561+
blk_mq_free_tag_set(&port->tag_set);
15431562
blk_cleanup_queue(q);
1563+
}
15441564
put_disk(disk);
15451565
}
15461566
}
@@ -1636,11 +1656,12 @@ static int carm_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
16361656
goto err_out_iounmap;
16371657
}
16381658

1639-
q = blk_init_queue(carm_oob_rq_fn, &host->lock);
1640-
if (!q) {
1659+
q = blk_mq_init_sq_queue(&host->tag_set, &carm_oob_mq_ops, 1,
1660+
BLK_MQ_F_NO_SCHED);
1661+
if (IS_ERR(q)) {
16411662
printk(KERN_ERR DRV_NAME "(%s): OOB queue alloc failure\n",
16421663
pci_name(pdev));
1643-
rc = -ENOMEM;
1664+
rc = PTR_ERR(q);
16441665
goto err_out_pci_free;
16451666
}
16461667
host->oob_q = q;
@@ -1705,6 +1726,7 @@ static int carm_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
17051726
else if (host->major == 161)
17061727
clear_bit(1, &carm_major_alloc);
17071728
blk_cleanup_queue(host->oob_q);
1729+
blk_mq_free_tag_set(&host->tag_set);
17081730
err_out_pci_free:
17091731
pci_free_consistent(pdev, CARM_SHM_SIZE, host->shm, host->shm_dma);
17101732
err_out_iounmap:
@@ -1736,6 +1758,7 @@ static void carm_remove_one (struct pci_dev *pdev)
17361758
else if (host->major == 161)
17371759
clear_bit(1, &carm_major_alloc);
17381760
blk_cleanup_queue(host->oob_q);
1761+
blk_mq_free_tag_set(&host->tag_set);
17391762
pci_free_consistent(pdev, CARM_SHM_SIZE, host->shm, host->shm_dma);
17401763
iounmap(host->mmio);
17411764
kfree(host);

0 commit comments

Comments
 (0)