Re: [PATCH net-next 09/15] net: bus: Add garbage collector for AF_BUS sockets.
From: Alban Crequy <hidden>
Date: 2012-07-03 12:11:01
Also in:
lkml
Mon, 2 Jul 2012 18:44:23 +0100, Ben Hutchings [off-list ref] wrote :
On Fri, 2012-06-29 at 17:45 +0100, Vincent Sanders wrote:quoted
From: Javier Martinez Canillas <redacted> This patch adds a garbage collector for AF_BUS sockets.[...]quoted
+struct sock *bus_get_socket(struct file *filp) +{ + struct sock *u_sock = NULL; + struct inode *inode = filp->f_path.dentry->d_inode; + + /* + * Socket ? + */ + if (S_ISSOCK(inode->i_mode) && !(filp->f_mode & FMODE_PATH)) { + struct socket *sock = SOCKET_I(inode); + struct sock *s = sock->sk; + + /* + * PF_BUS ? + */ + if (s && sock->ops && sock->ops->family == PF_BUS) + u_sock = s; + } + return u_sock; +}[...] What about references cycles involving both AF_BUS and AF_UNIX sockets? I think you must either specifically prevent passing AF_UNIX sockets through AF_BUS sockets, or make a single garbage collector handle them both.
Indeed. Thanks for the feedback. As far as I know, the current users of fd passing in D-Bus are Bluez and Ofono and they pass AF_BLUETOOTH sockets. There might be others, I am not sure what is in the wild. Passing AF_UNIX sockets in D-Bus would be useful for Telepathy (for Tubes and File Transfer). So I would like to be able to pass AF_UNIX sockets through AF_BUS sockets. I wrote the following small program to test this bug based on the previous code <https://lkml.org/lkml/2010/11/25/8> referred by commit 25888e30: http://people.collabora.com/~alban/d/2012/07/fd-passing/cmsg.c The effect of the bug is to reach the file limit in /proc/sys/fs/file-max and print "VFS: file-max limit 101771 reached" even when the maximum of file descriptors per process ("ulimit -n") is small. I am not sure what is the best way to fix this. The easiest could be to move the garbage collector related fields (recursion_level, gc_candidate, etc.) from struct unix_sock and struct bus_sock to struct sock and make a generic garbage collector for all sockets. Best regards, Alban