Signed-off-by: Fotis Xenakis <[email protected]>
---
drivers/virtio-fs.cc | 67 ++++++++++++++--------------------
drivers/virtio-fs.hh | 8 +++-
fs/virtiofs/virtiofs_vfsops.cc | 2 +-
3 files changed, 34 insertions(+), 43 deletions(-)
diff --git a/drivers/virtio-fs.cc b/drivers/virtio-fs.cc
index e0e090bc..b1b622e4 100644
--- 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
index 88a16939..c7a71b17 100644
--- 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
index b60a766b..3dc575c4 100644
--- 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;
--
2.27.0
--
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/AM0PR03MB629203A23A47480E05C4479DA6620%40AM0PR03MB6292.eurprd03.prod.outlook.com.