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

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.de


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 83a7eefe
Loading
Loading
Loading
Loading
+18 −31
Original line number Diff line number Diff line
@@ -447,43 +447,30 @@ static int bulk_req_safe_read(
	return n;
}

/* Called without dev->lock held, and only in interrupt context. */
static void ubd_handler(void)
static void ubd_end_request(struct io_thread_req *io_req)
{
	int n;
	int count;

	while(1){
		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)) {
	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);
}
	}
}

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;
}