[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Minios-devel] [UNIKRAFT LWIP PATCH v2 3/6] Use vfs functions to allocate/free the resources used for a socket (Part II)



This part changes LWIP so that it uses vfs functions to allocate the
dentry and vnode used for sockets.

Signed-off-by: Mihai Pogonaru <pogonarumihai@xxxxxxxxx>
---
 sockets.c | 118 +++++++++++++++++++++++++++++++++-----------------------------
 1 file changed, 63 insertions(+), 55 deletions(-)

diff --git a/sockets.c b/sockets.c
index 3040099..1a3ddfd 100644
--- a/sockets.c
+++ b/sockets.c
@@ -35,6 +35,7 @@
 
 /* network stub calls */
 #include <sys/time.h>
+#include <vfscore/dentry.h>
 #include <vfscore/file.h>
 #include <vfscore/fs.h>
 #include <vfscore/mount.h>
@@ -49,13 +50,38 @@
 #define SOCK_NET_SET_ERRNO(errcode) \
        (errno = -(errcode))
 
+static int sock_net_close(struct vnode *s_vnode,
+                       struct vfscore_file *vfscore_file);
+static int sock_net_write(struct vnode *s_vnode,
+                       struct uio *buf, int ioflag __unused);
+static int sock_net_read(struct vnode *s_vnode,
+                       struct vfscore_file *vfscore_file __unused,
+                       struct uio *buf, int ioflag __unused);
+
+#define sock_net_inactive  ((vnop_inactive_t) vfscore_vop_nullop)
+
+static struct vnops sock_net_vnops = {
+       .vop_close = sock_net_close,
+       .vop_write = sock_net_write,
+       .vop_read  = sock_net_read,
+       .vop_inactive = sock_net_inactive
+};
+
+#define sock_net_vget  ((vfsop_vget_t) vfscore_vop_nullop)
+
+static struct vfsops sock_net_vfsops = {
+       .vfs_vget = sock_net_vget,
+       .vfs_vnops = &sock_net_vnops
+};
+
+
+static uint64_t s_inode = 0;
 /*
  * Bogus mount point used by all sockets
- *
- * We need this because when deleting a vnode
- * vfs calls vfs_unbusy on its mount point
  */
-static struct mount s_mount;
+static struct mount s_mount = {
+       .m_op = &sock_net_vfsops
+};
 
 struct sock_net_file {
        struct vfscore_file *vfscore_file;
@@ -85,7 +111,7 @@ EXIT:
        return file;
 }
 
-static int sock_fd_alloc(struct vnops *v_op, int sock_fd)
+static int sock_fd_alloc(int sock_fd)
 {
        int ret = 0;
        int vfs_fd;
@@ -118,19 +144,30 @@ static int sock_fd_alloc(struct vnops *v_op, int sock_fd)
                                ("Failed to allocate socket vfs_file: Out of 
memory\n"));
                goto ERR_MALLOC_VFS_FILE;
        }
-       s_dentry = uk_calloc(uk_alloc_get_default(), 1, sizeof(*s_dentry));
-       if (!s_dentry) {
+
+       ret = vfscore_vget(&s_mount, s_inode++, &s_vnode);
+       UK_ASSERT(ret == 0); /* we should not find it in cache */
+
+       if (!s_vnode) {
                ret = -ENOMEM;
                LWIP_DEBUGF(SOCKETS_DEBUG,
-                           ("Failed to allocate socket dentry: Out of 
memory\n"));
-               goto ERR_MALLOC_DENTRY;
+                           ("Failed to allocate socket vnode: Out of 
memory\n"));
+               goto ERR_ALLOC_VNODE;
        }
-       s_vnode = uk_calloc(uk_alloc_get_default(), 1, sizeof(*s_vnode));
-       if (!s_vnode) {
+
+       uk_mutex_unlock(&s_vnode->v_lock);
+
+       /*
+        * it doesn't matter that all the dentries have the
+        * same path since we never lookup for them
+        */
+       s_dentry = dentry_alloc(NULL, s_vnode, "/");
+
+       if (!s_dentry) {
                ret = -ENOMEM;
                LWIP_DEBUGF(SOCKETS_DEBUG,
-                           ("Failed to allocate socket vnode: Out of 
memory\n"));
-               goto ERR_MALLOC_VNODE;
+                           ("Failed to allocate socket dentry: Out of 
memory\n"));
+               goto ERR_ALLOC_DENTRY;
        }
 
        /* Put things together, and fill out necessary fields */
@@ -141,31 +178,8 @@ static int sock_fd_alloc(struct vnops *v_op, int sock_fd)
        vfs_file->f_dentry = s_dentry;
        vfs_file->f_vfs_flags = UK_VFSCORE_NOPOS;
 
-       s_dentry->d_refcnt = 1;
-       s_dentry->d_vnode = s_vnode;
-
-       /*
-        * Provide bogus but valid addresses to allow
-        * vfs to remove nodes from lists
-        */
-       s_dentry->d_link.pprev = &s_dentry->d_link.next;
-       s_dentry->d_names_link.next = &s_dentry->d_names_link;
-       s_dentry->d_names_link.prev = &s_dentry->d_names_link;
-
-       s_vnode->v_op = v_op;
-       uk_mutex_init(&s_vnode->v_lock);
-       s_vnode->v_refcnt = 1;
        s_vnode->v_data = file;
        s_vnode->v_type = VSOCK;
-       s_vnode->v_mount = &s_mount;
-       s_mount.m_count++;
-
-       /*
-        * Provide bogus but valid addresses to allow
-        * vfs to remove nodes from lists
-        */
-       s_vnode->v_link.next = &s_vnode->v_link;
-       s_vnode->v_link.prev = &s_vnode->v_link;
 
        file->vfscore_file = vfs_file;
        file->sock_fd = sock_fd;
@@ -181,14 +195,17 @@ static int sock_fd_alloc(struct vnops *v_op, int sock_fd)
                goto ERR_VFS_INSTALL;
        }
 
+       /* Only the dentry should hold a reference; release ours */
+       vrele(s_vnode);
+
        /* Return file descriptor of our socket */
        return vfs_fd;
 
 ERR_VFS_INSTALL:
-       uk_free(uk_alloc_get_default(), s_vnode);
-ERR_MALLOC_VNODE:
-       uk_free(uk_alloc_get_default(), s_dentry);
-ERR_MALLOC_DENTRY:
+       drele(s_dentry);
+ERR_ALLOC_DENTRY:
+       vrele(s_vnode);
+ERR_ALLOC_VNODE:
        uk_free(uk_alloc_get_default(), vfs_file);
 ERR_MALLOC_VFS_FILE:
        uk_free(uk_alloc_get_default(), file);
@@ -200,7 +217,7 @@ ERR_EXIT:
 }
 
 static int sock_net_close(struct vnode *s_vnode,
-                         struct vfscore_file *vfscore_file)
+                       struct vfscore_file *vfscore_file)
 {
        int ret;
        struct sock_net_file *file = NULL;
@@ -227,7 +244,7 @@ static int sock_net_close(struct vnode *s_vnode,
 }
 
 static int sock_net_write(struct vnode *s_vnode,
-                             struct uio *buf, int ioflag __unused)
+                       struct uio *buf, int ioflag __unused)
 {
        int ret = 0;
        struct sock_net_file *file = NULL;
@@ -247,8 +264,8 @@ static int sock_net_write(struct vnode *s_vnode,
 }
 
 static int sock_net_read(struct vnode *s_vnode,
-                            struct vfscore_file *vfscore_file __unused,
-                            struct uio *buf, int ioflag __unused)
+                       struct vfscore_file *vfscore_file __unused,
+                       struct uio *buf, int ioflag __unused)
 {
        int ret = 0;
        struct sock_net_file *file = NULL;
@@ -267,15 +284,6 @@ static int sock_net_read(struct vnode *s_vnode,
        return 0;
 }
 
-#define sock_net_inactive  ((vnop_inactive_t) vfscore_vop_nullop)
-
-static struct vnops sock_net_fops = {
-       .vop_close = sock_net_close,
-       .vop_write = sock_net_write,
-       .vop_read  = sock_net_read,
-       .vop_inactive = sock_net_inactive
-};
-
 int socket(int domain, int type, int protocol)
 {
        int ret = 0;
@@ -292,7 +300,7 @@ int socket(int domain, int type, int protocol)
        }
 
        /* Allocate the file descriptor */
-       vfs_fd = sock_fd_alloc(&sock_net_fops, sock_fd);
+       vfs_fd = sock_fd_alloc(sock_fd);
        if (vfs_fd < 0) {
                LWIP_DEBUGF(SOCKETS_DEBUG,
                            ("failed to allocate descriptor %d\n",
@@ -339,7 +347,7 @@ int accept(int s, struct sockaddr *addr, socklen_t *addrlen)
        }
 
        /* Allocate the file descriptor for the accepted connection */
-       vfs_fd = sock_fd_alloc(&sock_net_fops, sock_fd);
+       vfs_fd = sock_fd_alloc(sock_fd);
        if (vfs_fd < 0) {
                LWIP_DEBUGF(SOCKETS_DEBUG,
                            ("failed to allocate descriptor for accepted 
connection\n"));
-- 
2.11.0


_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.