From: Fotis Xenakis <[email protected]> Committer: Waldemar Kozaczuk <[email protected]> Branch: master
virtio-fs: minor driver code improvements Signed-off-by: Fotis Xenakis <[email protected]> Message-Id: <am0pr03mb629203a23a47480e05c4479da6...@am0pr03mb6292.eurprd03.prod.outlook.com> --- diff --git a/drivers/virtio-fs.cc b/drivers/virtio-fs.cc --- a/drivers/virtio-fs.cc +++ b/drivers/virtio-fs.cc @@ -5,28 +5,20 @@ * BSD license as described in the LICENSE file in the top-level directory. */ -#include <sys/cdefs.h> - -#include "drivers/virtio.hh" -#include "drivers/virtio-fs.hh" -#include <osv/interrupt.hh> - -#include <osv/mempool.hh> -#include <osv/mmu.hh> - #include <string> -#include <string.h> -#include <map> -#include <errno.h> -#include <osv/debug.h> - -#include <osv/sched.hh> -#include "osv/trace.hh" -#include "osv/aligned_new.hh" +#include <osv/debug.h> #include <osv/device.h> +#include <osv/interrupt.hh> +#include <osv/mmio.hh> +#include <osv/msi.hh> +#include <osv/sched.hh> -using namespace memory; +#include "drivers/pci-device.hh" +#include "drivers/virtio.hh" +#include "drivers/virtio-fs.hh" +#include "drivers/virtio-vring.hh" +#include "fs/virtiofs/fuse_kernel.h" using fuse_request = virtio::fs::fuse_request; @@ -48,25 +40,25 @@ void fs::fuse_request::done() } } -static void fuse_req_enqueue_input(vring* queue, fuse_request* req) +static void fuse_req_enqueue_input(vring& queue, fuse_request& req) { // Header goes first - queue->add_out_sg(&req->in_header, sizeof(struct fuse_in_header)); + queue.add_out_sg(&req.in_header, sizeof(struct fuse_in_header)); // Add fuse in arguments as out sg - if (req->input_args_size > 0) { - queue->add_out_sg(req->input_args_data, req->input_args_size); + if (req.input_args_size > 0) { + queue.add_out_sg(req.input_args_data, req.input_args_size); } } -static void fuse_req_enqueue_output(vring* queue, fuse_request* req) +static void fuse_req_enqueue_output(vring& queue, fuse_request& req) { // Header goes first - queue->add_in_sg(&req->out_header, sizeof(struct fuse_out_header)); + queue.add_in_sg(&req.out_header, sizeof(struct fuse_out_header)); // Add fuse out arguments as in sg - if (req->output_args_size > 0) { - queue->add_in_sg(req->output_args_data, req->output_args_size); + if (req.output_args_size > 0) { + queue.add_in_sg(req.output_args_data, req.output_args_size); } } @@ -194,7 +186,7 @@ void fs::req_done() auto* queue = get_virt_queue(VQ_REQUEST); while (true) { - virtio_driver::wait_for_queue(queue, &vring::used_ring_not_empty); + wait_for_queue(queue, &vring::used_ring_not_empty); fuse_request* req; u32 len; @@ -210,26 +202,21 @@ void fs::req_done() } } -int fs::make_request(fuse_request* req) +int fs::make_request(fuse_request& req) { - // The lock is here for parallel requests protection - WITH_LOCK(_lock) { - if (!req) { - return EIO; - } - - auto* queue = get_virt_queue(VQ_REQUEST); + auto* queue = get_virt_queue(VQ_REQUEST); + WITH_LOCK(_lock) { queue->init_sg(); - fuse_req_enqueue_input(queue, req); - fuse_req_enqueue_output(queue, req); + fuse_req_enqueue_input(*queue, req); + fuse_req_enqueue_output(*queue, req); - queue->add_buf_wait(req); + queue->add_buf_wait(&req); queue->kick(); - - return 0; } + + return 0; } hw_driver* fs::probe(hw_device* dev) diff --git a/drivers/virtio-fs.hh b/drivers/virtio-fs.hh --- a/drivers/virtio-fs.hh +++ b/drivers/virtio-fs.hh @@ -10,9 +10,12 @@ #include <functional> +#include <osv/mmio.hh> #include <osv/mutex.h> #include <osv/waitqueue.hh> +#include "drivers/device.hh" +#include "drivers/driver.hh" #include "drivers/virtio.hh" #include "drivers/virtio-device.hh" #include "fs/virtiofs/fuse_kernel.h" @@ -67,7 +70,7 @@ public: virtual std::string get_name() const { return _driver_name; } void read_config(); - int make_request(fuse_request*); + int make_request(fuse_request&); dax_window* get_dax() { return (_dax.addr != mmio_nullptr) ? &_dax : nullptr; } @@ -94,8 +97,9 @@ private: // maintains the virtio instance number for multiple drives static int _instance; int _id; + // This mutex protects parallel make_request invocations - mutex _lock; + mutex _lock; // TODO: Maintain one mutex per virtqueue }; } diff --git a/fs/virtiofs/virtiofs_vfsops.cc b/fs/virtiofs/virtiofs_vfsops.cc --- a/fs/virtiofs/virtiofs_vfsops.cc +++ b/fs/virtiofs/virtiofs_vfsops.cc @@ -52,7 +52,7 @@ int fuse_req_send_and_receive_reply(virtio::fs* drv, uint32_t opcode, req->output_args_size = output_args_size; assert(drv); - drv->make_request(req.get()); + drv->make_request(*req); req->wait(); int error = -req->out_header.error; -- You received this message because you are subscribed to the Google Groups "OSv Development" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/osv-dev/0000000000006887fb05aa5a0c1d%40google.com.
