Lines Matching refs:fpl

149 static void unix_add_edge(struct scm_fp_list *fpl, struct unix_edge *edge)  in unix_add_edge()  argument
154 vertex = list_first_entry(&fpl->vertices, typeof(*vertex), entry); in unix_add_edge()
170 static void unix_del_edge(struct scm_fp_list *fpl, struct unix_edge *edge) in unix_del_edge() argument
174 if (!fpl->dead) in unix_del_edge()
182 list_move_tail(&vertex->entry, &fpl->vertices); in unix_del_edge()
186 static void unix_free_vertices(struct scm_fp_list *fpl) in unix_free_vertices() argument
190 list_for_each_entry_safe(vertex, next_vertex, &fpl->vertices, entry) { in unix_free_vertices()
199 void unix_add_edges(struct scm_fp_list *fpl, struct unix_sock *receiver) in unix_add_edges() argument
205 if (!fpl->count_unix) in unix_add_edges()
209 struct unix_sock *inflight = unix_get_socket(fpl->fp[j++]); in unix_add_edges()
215 edge = fpl->edges + i++; in unix_add_edges()
219 unix_add_edge(fpl, edge); in unix_add_edges()
220 } while (i < fpl->count_unix); in unix_add_edges()
222 receiver->scm_stat.nr_unix_fds += fpl->count_unix; in unix_add_edges()
223 WRITE_ONCE(unix_tot_inflight, unix_tot_inflight + fpl->count_unix); in unix_add_edges()
225 WRITE_ONCE(fpl->user->unix_inflight, fpl->user->unix_inflight + fpl->count); in unix_add_edges()
229 fpl->inflight = true; in unix_add_edges()
231 unix_free_vertices(fpl); in unix_add_edges()
234 void unix_del_edges(struct scm_fp_list *fpl) in unix_del_edges() argument
241 if (!fpl->count_unix) in unix_del_edges()
245 struct unix_edge *edge = fpl->edges + i++; in unix_del_edges()
247 unix_del_edge(fpl, edge); in unix_del_edges()
248 } while (i < fpl->count_unix); in unix_del_edges()
250 if (!fpl->dead) { in unix_del_edges()
251 receiver = fpl->edges[0].successor; in unix_del_edges()
252 receiver->scm_stat.nr_unix_fds -= fpl->count_unix; in unix_del_edges()
254 WRITE_ONCE(unix_tot_inflight, unix_tot_inflight - fpl->count_unix); in unix_del_edges()
256 WRITE_ONCE(fpl->user->unix_inflight, fpl->user->unix_inflight - fpl->count); in unix_del_edges()
260 fpl->inflight = false; in unix_del_edges()
279 int unix_prepare_fpl(struct scm_fp_list *fpl) in unix_prepare_fpl() argument
284 if (!fpl->count_unix) in unix_prepare_fpl()
287 for (i = 0; i < fpl->count_unix; i++) { in unix_prepare_fpl()
292 list_add(&vertex->entry, &fpl->vertices); in unix_prepare_fpl()
295 fpl->edges = kvmalloc_array(fpl->count_unix, sizeof(*fpl->edges), in unix_prepare_fpl()
297 if (!fpl->edges) in unix_prepare_fpl()
303 unix_free_vertices(fpl); in unix_prepare_fpl()
307 void unix_destroy_fpl(struct scm_fp_list *fpl) in unix_destroy_fpl() argument
309 if (fpl->inflight) in unix_destroy_fpl()
310 unix_del_edges(fpl); in unix_destroy_fpl()
312 kvfree(fpl->edges); in unix_destroy_fpl()
313 unix_free_vertices(fpl); in unix_destroy_fpl()
601 void wait_for_unix_gc(struct scm_fp_list *fpl) in wait_for_unix_gc() argument
616 if (!fpl || !fpl->count_unix || in wait_for_unix_gc()
617 READ_ONCE(fpl->user->unix_inflight) < UNIX_INFLIGHT_SANE_USER) in wait_for_unix_gc()