On 10/17/24 4:36 AM, Ming Lei wrote:
+static blk_status_t nbd_send_pending_cmd(struct nbd_device *nbd, + struct nbd_cmd *cmd) +{ + struct request *req = blk_mq_rq_from_pdu(cmd); + unsigned long deadline = READ_ONCE(req->deadline); + unsigned int wait_ms = 2; + blk_status_t res; + + WARN_ON_ONCE(test_bit(NBD_CMD_REQUEUED, &cmd->flags)); + + while (true) { + res = nbd_send_cmd(nbd, cmd, cmd->index); + if (res != BLK_STS_RESOURCE) + return res; + if (READ_ONCE(jiffies) + msecs_to_jiffies(wait_ms) >= deadline) + break; + msleep(wait_ms); + wait_ms *= 2; + }
I think that there are better solutions to wait until more data can be sent, e.g. by using the kernel equivalent of the C library function select(). Thanks, Bart.