Commit 5db755fb authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe

ubd: refactor the interrupt handler

Instead of a separate handler function that leaves no work in the
interrupt hanler itself, split out a per-request end I/O helper and
clean up the coding style and variable naming while we're at it.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Acked-By: default avatarAnton Ivanov <anton.ivanov@cambridgegreys.com>
Link: https://lore.kernel.org/r/20240531074837.1648501-2-hch@lst.deSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 83a7eefe
...@@ -447,43 +447,30 @@ static int bulk_req_safe_read( ...@@ -447,43 +447,30 @@ static int bulk_req_safe_read(
return n; return n;
} }
/* Called without dev->lock held, and only in interrupt context. */ static void ubd_end_request(struct io_thread_req *io_req)
static void ubd_handler(void)
{ {
int n; if (io_req->error == BLK_STS_NOTSUPP &&
int count; req_op(io_req->req) == REQ_OP_DISCARD) {
blk_queue_max_discard_sectors(io_req->req->q, 0);
while(1){ blk_queue_max_write_zeroes_sectors(io_req->req->q, 0);
n = bulk_req_safe_read(
thread_fd,
irq_req_buffer,
&irq_remainder,
&irq_remainder_size,
UBD_REQ_BUFFER_SIZE
);
if (n < 0) {
if(n == -EAGAIN)
break;
printk(KERN_ERR "spurious interrupt in ubd_handler, "
"err = %d\n", -n);
return;
}
for (count = 0; count < n/sizeof(struct io_thread_req *); count++) {
struct io_thread_req *io_req = (*irq_req_buffer)[count];
if ((io_req->error == BLK_STS_NOTSUPP) && (req_op(io_req->req) == REQ_OP_DISCARD)) {
blk_queue_max_discard_sectors(io_req->req->q, 0);
blk_queue_max_write_zeroes_sectors(io_req->req->q, 0);
}
blk_mq_end_request(io_req->req, io_req->error);
kfree(io_req);
}
} }
blk_mq_end_request(io_req->req, io_req->error);
kfree(io_req);
} }
static irqreturn_t ubd_intr(int irq, void *dev) static irqreturn_t ubd_intr(int irq, void *dev)
{ {
ubd_handler(); int len, i;
while ((len = bulk_req_safe_read(thread_fd, irq_req_buffer,
&irq_remainder, &irq_remainder_size,
UBD_REQ_BUFFER_SIZE)) >= 0) {
for (i = 0; i < len / sizeof(struct io_thread_req *); i++)
ubd_end_request((*irq_req_buffer)[i]);
}
if (len < 0 && len != -EAGAIN)
pr_err("spurious interrupt in %s, err = %d\n", __func__, len);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment