[PATCH v1 net-next 01/16] af_unix: Add struct unix_vertex in struct unix_sock.
From: Kuniyuki Iwashima <hidden>
Date: 2024-02-03 03:01:44
Subsystem:
networking [general], networking [unix sockets], the rest · Maintainers:
"David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Kuniyuki Iwashima, Linus Torvalds
We will replace the garbage collection algorithm for AF_UNIX, where we will consider each inflight file descriptor of AF_UNIX sockets as an edge in a directed graph. Here, we introduce a new struct unix_vertex representing a vertex in the graph and add it to struct unix_sock. In the following patch, we will allocate another struct per edge, which we finally link to the inflight socket's unix_vertex.edges when sendmsg() succeeds. The first time an AF_UNIX socket is passed successfully, we will link its unix_vertex.entry to a global list. Also, we will count the number of edges as unix_vertex.out_degree. Signed-off-by: Kuniyuki Iwashima <redacted> --- include/net/af_unix.h | 8 ++++++++ net/unix/af_unix.c | 1 + net/unix/garbage.c | 9 +++++++++ 3 files changed, 18 insertions(+)
diff --git a/include/net/af_unix.h b/include/net/af_unix.h
index 627ea8e2d915..664f6bff60ab 100644
--- a/include/net/af_unix.h
+++ b/include/net/af_unix.h@@ -22,9 +22,16 @@ extern unsigned int unix_tot_inflight; void unix_inflight(struct user_struct *user, struct file *fp); void unix_notinflight(struct user_struct *user, struct file *fp); +void unix_init_vertex(struct unix_sock *u); void unix_gc(void); void wait_for_unix_gc(struct scm_fp_list *fpl); +struct unix_vertex { + struct list_head edges; + struct list_head entry; + unsigned long out_degree; +}; + struct sock *unix_peer_get(struct sock *sk); #define UNIX_HASH_MOD (256 - 1)
@@ -62,6 +69,7 @@ struct unix_sock { struct path path; struct mutex iolock, bindlock; struct sock *peer; + struct unix_vertex vertex; struct list_head link; unsigned long inflight; spinlock_t lock;
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
index 4892e9428c9f..ae145b6f77d8 100644
--- a/net/unix/af_unix.c
+++ b/net/unix/af_unix.c@@ -996,6 +996,7 @@ static struct sock *unix_create1(struct net *net, struct socket *sock, int kern, u->path.dentry = NULL; u->path.mnt = NULL; spin_lock_init(&u->lock); + unix_init_vertex(u); INIT_LIST_HEAD(&u->link); mutex_init(&u->iolock); /* single task reading lock */ mutex_init(&u->bindlock); /* single task binding lock */
diff --git a/net/unix/garbage.c b/net/unix/garbage.c
index 9b8473dd79a4..db9ac289ce08 100644
--- a/net/unix/garbage.c
+++ b/net/unix/garbage.c@@ -101,6 +101,15 @@ struct unix_sock *unix_get_socket(struct file *filp) return NULL; } +void unix_init_vertex(struct unix_sock *u) +{ + struct unix_vertex *vertex = &u->vertex; + + vertex->out_degree = 0; + INIT_LIST_HEAD(&vertex->edges); + INIT_LIST_HEAD(&vertex->entry); +} + DEFINE_SPINLOCK(unix_gc_lock); unsigned int unix_tot_inflight; static LIST_HEAD(gc_candidates);
--
2.30.2