Lines Matching refs:fpl
140 static void unix_add_edge(struct scm_fp_list *fpl, struct unix_edge *edge) in unix_add_edge() argument
145 vertex = list_first_entry(&fpl->vertices, typeof(*vertex), entry); in unix_add_edge()
161 static void unix_del_edge(struct scm_fp_list *fpl, struct unix_edge *edge) in unix_del_edge() argument
165 if (!fpl->dead) in unix_del_edge()
173 list_move_tail(&vertex->entry, &fpl->vertices); in unix_del_edge()
177 static void unix_free_vertices(struct scm_fp_list *fpl) in unix_free_vertices() argument
181 list_for_each_entry_safe(vertex, next_vertex, &fpl->vertices, entry) { in unix_free_vertices()
190 void unix_add_edges(struct scm_fp_list *fpl, struct unix_sock *receiver) in unix_add_edges() argument
196 if (!fpl->count_unix) in unix_add_edges()
200 struct unix_sock *inflight = unix_get_socket(fpl->fp[j++]); in unix_add_edges()
206 edge = fpl->edges + i++; in unix_add_edges()
210 unix_add_edge(fpl, edge); in unix_add_edges()
211 } while (i < fpl->count_unix); in unix_add_edges()
213 receiver->scm_stat.nr_unix_fds += fpl->count_unix; in unix_add_edges()
214 WRITE_ONCE(unix_tot_inflight, unix_tot_inflight + fpl->count_unix); in unix_add_edges()
216 WRITE_ONCE(fpl->user->unix_inflight, fpl->user->unix_inflight + fpl->count); in unix_add_edges()
220 fpl->inflight = true; in unix_add_edges()
222 unix_free_vertices(fpl); in unix_add_edges()
225 void unix_del_edges(struct scm_fp_list *fpl) in unix_del_edges() argument
232 if (!fpl->count_unix) in unix_del_edges()
236 struct unix_edge *edge = fpl->edges + i++; in unix_del_edges()
238 unix_del_edge(fpl, edge); in unix_del_edges()
239 } while (i < fpl->count_unix); in unix_del_edges()
241 if (!fpl->dead) { in unix_del_edges()
242 receiver = fpl->edges[0].successor; in unix_del_edges()
243 receiver->scm_stat.nr_unix_fds -= fpl->count_unix; in unix_del_edges()
245 WRITE_ONCE(unix_tot_inflight, unix_tot_inflight - fpl->count_unix); in unix_del_edges()
247 WRITE_ONCE(fpl->user->unix_inflight, fpl->user->unix_inflight - fpl->count); in unix_del_edges()
251 fpl->inflight = false; in unix_del_edges()
270 int unix_prepare_fpl(struct scm_fp_list *fpl) in unix_prepare_fpl() argument
275 if (!fpl->count_unix) in unix_prepare_fpl()
278 for (i = 0; i < fpl->count_unix; i++) { in unix_prepare_fpl()
283 list_add(&vertex->entry, &fpl->vertices); in unix_prepare_fpl()
286 fpl->edges = kvmalloc_array(fpl->count_unix, sizeof(*fpl->edges), in unix_prepare_fpl()
288 if (!fpl->edges) in unix_prepare_fpl()
294 unix_free_vertices(fpl); in unix_prepare_fpl()
298 void unix_destroy_fpl(struct scm_fp_list *fpl) in unix_destroy_fpl() argument
300 if (fpl->inflight) in unix_destroy_fpl()
301 unix_del_edges(fpl); in unix_destroy_fpl()
303 kvfree(fpl->edges); in unix_destroy_fpl()
304 unix_free_vertices(fpl); in unix_destroy_fpl()
592 void wait_for_unix_gc(struct scm_fp_list *fpl) in wait_for_unix_gc() argument
607 if (!fpl || !fpl->count_unix || in wait_for_unix_gc()
608 READ_ONCE(fpl->user->unix_inflight) < UNIX_INFLIGHT_SANE_USER) in wait_for_unix_gc()