From 7619a789c02237b1638cd9b0abb5c7bf433f072e Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Sat, 26 Sep 2020 00:01:23 +0300 Subject: [PATCH] Set request size in NBD --- nbd_proxy.cpp | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/nbd_proxy.cpp b/nbd_proxy.cpp index 6c5955cd..7c8af328 100644 --- a/nbd_proxy.cpp +++ b/nbd_proxy.cpp @@ -75,7 +75,7 @@ public: } fcntl(sockfd[0], F_SETFL, fcntl(sockfd[0], F_GETFL, 0) | O_NONBLOCK); 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"); exit(1); @@ -110,15 +110,22 @@ public: } 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 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) { return -1; } + r = ioctl(nbd, NBD_CLEAR_SOCK); + if (r < 0) + { + goto end_close; + } r = ioctl(nbd, NBD_SET_SOCK, sockfd[1]); if (r < 0) { @@ -143,6 +150,15 @@ protected: 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()) { // Run in child @@ -184,7 +200,7 @@ protected: data->callback = [this](ring_data_t *data) { handle_send(data->res); }; send_msg.msg_iov = send_list.data(); 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)