mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 10:31:46 +09:00
ubd: refactor the interrupt handler
[ Upstream commit 5db755fbb1a0de4a4cfd5d5edfaa19853b9c56e6 ] 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: Christoph Hellwig <hch@lst.de> Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com> Acked-By: Anton Ivanov <anton.ivanov@cambridgegreys.com> Link: https://lore.kernel.org/r/20240531074837.1648501-2-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk> Stable-dep-of: 31ade7d4fdcf ("ubd: untagle discard vs write zeroes not support handling") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
3aae731f2e
commit
ca4b92eec0
@@ -456,43 +456,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user