|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT LWIP PATCH v2 3/6] Use vfs functions to allocate/free the resources used for a socket (Part II)
Reviewed-by: Costin Lupu <costin.lupu@xxxxxxxxx>
On 6/29/19 4:54 PM, Mihai Pogonaru wrote:
> 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"));
>
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |