From 4a7f4f289c1a8239b2d8a2bc99ca68644a74130e Mon Sep 17 00:00:00 2001 From: Gleb Smirnoff Date: Mon, 10 Feb 2025 11:30:45 -0800 Subject: [PATCH] sockets: make pr_aio_queue the default method Call it directly instead of each time calling pr_aio_queue_notsupp() and then doing the actual job. The only user of non default method was cxgbe(4). It calls now into the default method in case of own method failure. This preserves existing behavior. Reviewed by: markj, jhb Differential Revision: https://reviews.freebsd.org/D48863 --- sys/dev/cxgbe/tom/t4_tom.c | 11 ++++++++--- sys/kern/sys_socket.c | 15 ++++++++------- sys/kern/uipc_domain.c | 8 +------- sys/sys/socketvar.h | 1 + 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/sys/dev/cxgbe/tom/t4_tom.c b/sys/dev/cxgbe/tom/t4_tom.c index 97cb380d0e7..9b09facd05a 100644 --- a/sys/dev/cxgbe/tom/t4_tom.c +++ b/sys/dev/cxgbe/tom/t4_tom.c @@ -2219,11 +2219,16 @@ t4_aio_queue_tom(struct socket *so, struct kaiocb *job) if (ulp_mode(toep) == ULP_MODE_TCPDDP || ulp_mode(toep) == ULP_MODE_NONE) { error = t4_aio_queue_ddp(so, job); - if (error != EOPNOTSUPP) - return (error); + if (error == 0) + return (0); + else if (error != EOPNOTSUPP) + return (soaio_queue_generic(so, job)); } - return (t4_aio_queue_aiotx(so, job)); + if (t4_aio_queue_aiotx(so, job) != 0) + return (soaio_queue_generic(so, job)); + else + return (0); } static int diff --git a/sys/kern/sys_socket.c b/sys/kern/sys_socket.c index 33cfd1637b7..456d93ff0d6 100644 --- a/sys/kern/sys_socket.c +++ b/sys/kern/sys_socket.c @@ -802,15 +802,16 @@ soo_aio_cancel(struct kaiocb *job) static int soo_aio_queue(struct file *fp, struct kaiocb *job) { - struct socket *so; + struct socket *so = fp->f_data; + + return (so->so_proto->pr_aio_queue(so, job)); +} + +int +soaio_queue_generic(struct socket *so, struct kaiocb *job) +{ struct sockbuf *sb; sb_which which; - int error; - - so = fp->f_data; - error = so->so_proto->pr_aio_queue(so, job); - if (error == 0) - return (0); /* Lock through the socket, since this may be a listening socket. */ switch (job->uaiocb.aio_lio_opcode & (LIO_WRITE | LIO_READ)) { diff --git a/sys/kern/uipc_domain.c b/sys/kern/uipc_domain.c index 734d9ee9134..51e0f8cc772 100644 --- a/sys/kern/uipc_domain.c +++ b/sys/kern/uipc_domain.c @@ -58,12 +58,6 @@ pr_accept_notsupp(struct socket *so, struct sockaddr *sa) return (EOPNOTSUPP); } -static int -pr_aio_queue_notsupp(struct socket *so, struct kaiocb *job) -{ - return (EOPNOTSUPP); -} - static int pr_bind_notsupp(struct socket *so, struct sockaddr *nam, struct thread *td) { @@ -190,10 +184,10 @@ pr_init(struct domain *dom, struct protosw *pr) DEFAULT(pr_soreceive, soreceive_generic); DEFAULT(pr_sopoll, sopoll_generic); DEFAULT(pr_setsbopt, sbsetopt); + DEFAULT(pr_aio_queue, soaio_queue_generic); #define NOTSUPP(foo) if (pr->foo == NULL) pr->foo = foo ## _notsupp NOTSUPP(pr_accept); - NOTSUPP(pr_aio_queue); NOTSUPP(pr_bind); NOTSUPP(pr_bindat); NOTSUPP(pr_connect); diff --git a/sys/sys/socketvar.h b/sys/sys/socketvar.h index bfbb5cbd37f..735ff49062d 100644 --- a/sys/sys/socketvar.h +++ b/sys/sys/socketvar.h @@ -526,6 +526,7 @@ struct socket * struct socket * sopeeloff(struct socket *); int sopoll_generic(struct socket *so, int events, struct thread *td); +int soaio_queue_generic(struct socket *so, struct kaiocb *job); int soreceive(struct socket *so, struct sockaddr **paddr, struct uio *uio, struct mbuf **mp0, struct mbuf **controlp, int *flagsp); int soreceive_stream(struct socket *so, struct sockaddr **paddr,