Thread (50 messages) 50 messages, 17 authors, 2012-07-09

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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help