Set request size in NBD

Vitaliy Filippov 2020-09-26 00:01:23 +03:00
parent e65a28e27e
commit 7619a789c0
1 changed files with 20 additions and 4 deletions

View File

@ -75,7 +75,7 @@ public:
} }
fcntl(sockfd[0], F_SETFL, fcntl(sockfd[0], F_GETFL, 0) | O_NONBLOCK); fcntl(sockfd[0], F_SETFL, fcntl(sockfd[0], F_GETFL, 0) | O_NONBLOCK);
nbd_fd = sockfd[0]; nbd_fd = sockfd[0];
if (run_nbd(sockfd, cfg["nbd_device"].string_value().c_str(), cfg["size"].uint64_value(), NBD_FLAG_SEND_FLUSH, 30) < 0) if (run_nbd(sockfd, cfg["dev_num"].int64_value(), cfg["size"].uint64_value(), NBD_FLAG_SEND_FLUSH, 30) < 0)
{ {
perror("run_nbd"); perror("run_nbd");
exit(1); exit(1);
@ -110,15 +110,22 @@ public:
} }
protected: protected:
int run_nbd(int sockfd[2], const char *dev, uint64_t size, uint64_t flags, unsigned timeout) int run_nbd(int sockfd[2], int dev_num, uint64_t size, uint64_t flags, unsigned timeout)
{ {
// Check handle size // Check handle size
assert(sizeof(cur_req.handle) == 8); assert(sizeof(cur_req.handle) == 8);
int r, nbd = open(dev, O_RDWR); char path[64] = { 0 };
sprintf(path, "/dev/nbd%d", dev_num);
int r, nbd = open(path, O_RDWR), qd_fd;
if (nbd < 0) if (nbd < 0)
{ {
return -1; return -1;
} }
r = ioctl(nbd, NBD_CLEAR_SOCK);
if (r < 0)
{
goto end_close;
}
r = ioctl(nbd, NBD_SET_SOCK, sockfd[1]); r = ioctl(nbd, NBD_SET_SOCK, sockfd[1]);
if (r < 0) if (r < 0)
{ {
@ -143,6 +150,15 @@ protected:
goto end_close; goto end_close;
} }
} }
// Configure request size
sprintf(path, "/sys/block/nbd%d/queue/max_sectors_kb", dev_num);
qd_fd = open(path, O_WRONLY);
if (qd_fd < 0)
{
goto end_close;
}
write(qd_fd, "32768", 5);
close(qd_fd);
if (!fork()) if (!fork())
{ {
// Run in child // Run in child
@ -184,7 +200,7 @@ protected:
data->callback = [this](ring_data_t *data) { handle_send(data->res); }; data->callback = [this](ring_data_t *data) { handle_send(data->res); };
send_msg.msg_iov = send_list.data(); send_msg.msg_iov = send_list.data();
send_msg.msg_iovlen = send_list.size(); send_msg.msg_iovlen = send_list.size();
my_uring_prep_sendmsg(sqe, nbd_fd, &send_msg, 0); my_uring_prep_sendmsg(sqe, nbd_fd, &send_msg, MSG_ZEROCOPY);
} }
void handle_send(int result) void handle_send(int result)