git: a8e286bb5d07 - main - sockets: use socket buffer mutexes in struct socket directly
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 03 Jun 2022 19:56:30 UTC
The branch main has been updated by glebius:
URL: https://cgit.FreeBSD.org/src/commit/?id=a8e286bb5d076686c85f10b73ec33acc133ec1ab
commit a8e286bb5d076686c85f10b73ec33acc133ec1ab
Author: Gleb Smirnoff <glebius@FreeBSD.org>
AuthorDate: 2022-06-03 19:55:44 +0000
Commit: Gleb Smirnoff <glebius@FreeBSD.org>
CommitDate: 2022-06-03 19:55:44 +0000
sockets: use socket buffer mutexes in struct socket directly
Convert more generic socket code to not use sockbuf compat pointer.
Continuation of 4328318445a.
---
sys/kern/sys_socket.c | 38 ++++++++++++++++++++------------------
sys/kern/uipc_socket.c | 38 ++++++++++++++++++++------------------
2 files changed, 40 insertions(+), 36 deletions(-)
diff --git a/sys/kern/sys_socket.c b/sys/kern/sys_socket.c
index 3480af70832a..859c6d593da0 100644
--- a/sys/kern/sys_socket.c
+++ b/sys/kern/sys_socket.c
@@ -322,17 +322,17 @@ soo_stat(struct file *fp, struct stat *ub, struct ucred *active_cred)
* in the receive buffer, the socket is still readable.
*/
sb = &so->so_rcv;
- SOCKBUF_LOCK(sb);
+ SOCK_RECVBUF_LOCK(so);
if ((sb->sb_state & SBS_CANTRCVMORE) == 0 || sbavail(sb))
ub->st_mode |= S_IRUSR | S_IRGRP | S_IROTH;
ub->st_size = sbavail(sb) - sb->sb_ctl;
- SOCKBUF_UNLOCK(sb);
+ SOCK_RECVBUF_UNLOCK(so);
sb = &so->so_snd;
- SOCKBUF_LOCK(sb);
+ SOCK_SENDBUF_LOCK(so);
if ((sb->sb_state & SBS_CANTSENDMORE) == 0)
ub->st_mode |= S_IWUSR | S_IWGRP | S_IWOTH;
- SOCKBUF_UNLOCK(sb);
+ SOCK_SENDBUF_UNLOCK(so);
}
ub->st_uid = so->so_cred->cr_uid;
ub->st_gid = so->so_cred->cr_gid;
@@ -593,10 +593,11 @@ soaio_ready(struct socket *so, struct sockbuf *sb)
}
static void
-soaio_process_job(struct socket *so, struct sockbuf *sb, struct kaiocb *job)
+soaio_process_job(struct socket *so, sb_which which, struct kaiocb *job)
{
struct ucred *td_savedcred;
struct thread *td;
+ struct sockbuf *sb = sobuf(so, which);
#ifdef MAC
struct file *fp = job->fd_file;
#endif
@@ -604,7 +605,7 @@ soaio_process_job(struct socket *so, struct sockbuf *sb, struct kaiocb *job)
long ru_before;
int error, flags;
- SOCKBUF_UNLOCK(sb);
+ SOCK_BUF_UNLOCK(so, which);
aio_switch_vmspace(job);
td = curthread;
retry:
@@ -669,28 +670,28 @@ retry:
* queue to try again when the socket is ready.
*/
MPASS(done != job_total_nbytes);
- SOCKBUF_LOCK(sb);
+ SOCK_BUF_LOCK(so, which);
if (done == 0 || !(so->so_state & SS_NBIO)) {
empty_results++;
if (soaio_ready(so, sb)) {
empty_retries++;
- SOCKBUF_UNLOCK(sb);
+ SOCK_BUF_UNLOCK(so, which);
goto retry;
}
if (!aio_set_cancel_function(job, soo_aio_cancel)) {
- SOCKBUF_UNLOCK(sb);
+ SOCK_BUF_UNLOCK(so, which);
if (done != 0)
aio_complete(job, done, 0);
else
aio_cancel(job);
- SOCKBUF_LOCK(sb);
+ SOCK_BUF_LOCK(so, which);
} else {
TAILQ_INSERT_HEAD(&sb->sb_aiojobq, job, list);
}
return;
}
- SOCKBUF_UNLOCK(sb);
+ SOCK_BUF_UNLOCK(so, which);
}
if (done != 0 && (error == ERESTART || error == EINTR ||
error == EWOULDBLOCK))
@@ -699,23 +700,24 @@ retry:
aio_complete(job, -1, error);
else
aio_complete(job, done, 0);
- SOCKBUF_LOCK(sb);
+ SOCK_BUF_LOCK(so, which);
}
static void
-soaio_process_sb(struct socket *so, struct sockbuf *sb)
+soaio_process_sb(struct socket *so, sb_which which)
{
struct kaiocb *job;
+ struct sockbuf *sb = sobuf(so, which);
CURVNET_SET(so->so_vnet);
- SOCKBUF_LOCK(sb);
+ SOCK_BUF_LOCK(so, which);
while (!TAILQ_EMPTY(&sb->sb_aiojobq) && soaio_ready(so, sb)) {
job = TAILQ_FIRST(&sb->sb_aiojobq);
TAILQ_REMOVE(&sb->sb_aiojobq, job, list);
if (!aio_clear_cancel_function(job))
continue;
- soaio_process_job(so, sb, job);
+ soaio_process_job(so, which, job);
}
/*
@@ -726,7 +728,7 @@ soaio_process_sb(struct socket *so, struct sockbuf *sb)
if (!TAILQ_EMPTY(&sb->sb_aiojobq))
sb->sb_flags |= SB_AIO;
sb->sb_flags &= ~SB_AIO_RUNNING;
- SOCKBUF_UNLOCK(sb);
+ SOCK_BUF_UNLOCK(so, which);
sorele(so);
CURVNET_RESTORE();
@@ -738,7 +740,7 @@ soaio_rcv(void *context, int pending)
struct socket *so;
so = context;
- soaio_process_sb(so, &so->so_rcv);
+ soaio_process_sb(so, SO_RCV);
}
void
@@ -747,7 +749,7 @@ soaio_snd(void *context, int pending)
struct socket *so;
so = context;
- soaio_process_sb(so, &so->so_snd);
+ soaio_process_sb(so, SO_SND);
}
void
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
index 7351238343b3..2a01f656d258 100644
--- a/sys/kern/uipc_socket.c
+++ b/sys/kern/uipc_socket.c
@@ -3654,6 +3654,7 @@ soo_kqfilter(struct file *fp, struct knote *kn)
{
struct socket *so = kn->kn_fp->f_data;
struct sockbuf *sb;
+ sb_which which;
struct knlist *knl;
switch (kn->kn_filter) {
@@ -3661,16 +3662,19 @@ soo_kqfilter(struct file *fp, struct knote *kn)
kn->kn_fop = &soread_filtops;
knl = &so->so_rdsel.si_note;
sb = &so->so_rcv;
+ which = SO_RCV;
break;
case EVFILT_WRITE:
kn->kn_fop = &sowrite_filtops;
knl = &so->so_wrsel.si_note;
sb = &so->so_snd;
+ which = SO_SND;
break;
case EVFILT_EMPTY:
kn->kn_fop = &soempty_filtops;
knl = &so->so_wrsel.si_note;
sb = &so->so_snd;
+ which = SO_SND;
break;
default:
return (EINVAL);
@@ -3680,10 +3684,10 @@ soo_kqfilter(struct file *fp, struct knote *kn)
if (SOLISTENING(so)) {
knlist_add(knl, kn, 1);
} else {
- SOCKBUF_LOCK(sb);
+ SOCK_BUF_LOCK(so, which);
knlist_add(knl, kn, 1);
sb->sb_flags |= SB_KNOTE;
- SOCKBUF_UNLOCK(sb);
+ SOCK_BUF_UNLOCK(so, which);
}
SOCK_UNLOCK(so);
return (0);
@@ -3894,7 +3898,7 @@ filt_soread(struct knote *kn, long hint)
return (!TAILQ_EMPTY(&so->sol_comp));
}
- SOCKBUF_LOCK_ASSERT(&so->so_rcv);
+ SOCK_RECVBUF_LOCK_ASSERT(so);
kn->kn_data = sbavail(&so->so_rcv) - so->so_rcv.sb_ctl;
if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
@@ -3937,7 +3941,7 @@ filt_sowrite(struct knote *kn, long hint)
if (SOLISTENING(so))
return (0);
- SOCKBUF_LOCK_ASSERT(&so->so_snd);
+ SOCK_SENDBUF_LOCK_ASSERT(so);
kn->kn_data = sbspace(&so->so_snd);
hhook_run_socket(so, kn, HHOOK_FILT_SOWRITE);
@@ -3967,7 +3971,7 @@ filt_soempty(struct knote *kn, long hint)
if (SOLISTENING(so))
return (1);
- SOCKBUF_LOCK_ASSERT(&so->so_snd);
+ SOCK_SENDBUF_LOCK_ASSERT(so);
kn->kn_data = sbused(&so->so_snd);
if (kn->kn_data == 0)
@@ -4079,7 +4083,7 @@ again:
SOCK_UNLOCK(so);
solisten_wakeup(head); /* unlocks */
} else {
- SOCKBUF_LOCK(&so->so_rcv);
+ SOCK_RECVBUF_LOCK(so);
soupcall_set(so, SO_RCV,
head->sol_accept_filter->accf_callback,
head->sol_accept_filter_arg);
@@ -4088,10 +4092,10 @@ again:
head->sol_accept_filter_arg, M_NOWAIT);
if (ret == SU_ISCONNECTED) {
soupcall_clear(so, SO_RCV);
- SOCKBUF_UNLOCK(&so->so_rcv);
+ SOCK_RECVBUF_UNLOCK(so);
goto again;
}
- SOCKBUF_UNLOCK(&so->so_rcv);
+ SOCK_RECVBUF_UNLOCK(so);
SOCK_UNLOCK(so);
SOLISTEN_UNLOCK(head);
}
@@ -4112,9 +4116,9 @@ soisdisconnecting(struct socket *so)
so->so_state |= SS_ISDISCONNECTING;
if (!SOLISTENING(so)) {
- SOCKBUF_LOCK(&so->so_rcv);
+ SOCK_RECVBUF_LOCK(so);
socantrcvmore_locked(so);
- SOCKBUF_LOCK(&so->so_snd);
+ SOCK_SENDBUF_LOCK(so);
socantsendmore_locked(so);
}
SOCK_UNLOCK(so);
@@ -4140,9 +4144,9 @@ soisdisconnected(struct socket *so)
if (!SOLISTENING(so)) {
SOCK_UNLOCK(so);
- SOCKBUF_LOCK(&so->so_rcv);
+ SOCK_RECVBUF_LOCK(so);
socantrcvmore_locked(so);
- SOCKBUF_LOCK(&so->so_snd);
+ SOCK_SENDBUF_LOCK(so);
sbdrop_locked(&so->so_snd, sbused(&so->so_snd));
socantsendmore_locked(so);
} else
@@ -4225,10 +4229,8 @@ soupcall_set(struct socket *so, sb_which which, so_upcall_t func, void *arg)
case SO_SND:
sb = &so->so_snd;
break;
- default:
- panic("soupcall_set: bad which");
}
- SOCKBUF_LOCK_ASSERT(sb);
+ SOCK_BUF_LOCK_ASSERT(so, which);
sb->sb_upcall = func;
sb->sb_upcallarg = arg;
sb->sb_flags |= SB_UPCALL;
@@ -4249,7 +4251,7 @@ soupcall_clear(struct socket *so, sb_which which)
sb = &so->so_snd;
break;
}
- SOCKBUF_LOCK_ASSERT(sb);
+ SOCK_BUF_LOCK_ASSERT(so, which);
KASSERT(sb->sb_upcall != NULL,
("%s: so %p no upcall to clear", __func__, so));
sb->sb_upcall = NULL;
@@ -4274,7 +4276,7 @@ so_rdknl_lock(void *arg)
if (SOLISTENING(so))
SOCK_LOCK(so);
else
- SOCKBUF_LOCK(&so->so_rcv);
+ SOCK_RECVBUF_LOCK(so);
}
static void
@@ -4285,7 +4287,7 @@ so_rdknl_unlock(void *arg)
if (SOLISTENING(so))
SOCK_UNLOCK(so);
else
- SOCKBUF_UNLOCK(&so->so_rcv);
+ SOCK_RECVBUF_UNLOCK(so);
}
static void