From 39858ff10531c07854c78490bca16bc2936ad846 Mon Sep 17 00:00:00 2001 From: purplerain Date: Tue, 14 Jan 2025 01:44:52 +0000 Subject: [PATCH] sync with OpenBSD -current --- share/man/man5/cargo-module.5 | 12 ++++- sys/kern/kern_sysctl.c | 94 +++++++++++++++++------------------ sys/kern/subr_hibernate.c | 45 ++--------------- sys/kern/uipc_socket.c | 28 +++++------ sys/sys/hibernate.h | 3 +- 5 files changed, 73 insertions(+), 109 deletions(-) diff --git a/share/man/man5/cargo-module.5 b/share/man/man5/cargo-module.5 index 685f639cb..8b3f973dc 100644 --- a/share/man/man5/cargo-module.5 +++ b/share/man/man5/cargo-module.5 @@ -1,4 +1,4 @@ -.\" $OpenBSD: cargo-module.5,v 1.9 2024/01/06 08:03:31 semarie Exp $ +.\" $OpenBSD: cargo-module.5,v 1.10 2025/01/13 18:20:47 kirill Exp $ .\" .\" Copyright (c) 2008 Marc Espie .\" Copyright (c) 2017 Daniel Jakots @@ -25,7 +25,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: January 6 2024 $ +.Dd $Mdocdate: January 13 2025 $ .Dt CARGO-MODULE 5 .Os .Sh NAME @@ -93,6 +93,14 @@ This module defines: Path to cargo manifest. Defaults to .Pa ${WRKSRC}/Cargo.toml . +.It Ev MODCARGO_CARGOLOCK +Path to +.Pa Cargo.lock , +which is used only by the +.Cm modcargo-gen-crates +target. +Defaults to +.Pa ${MODCARGO_CARGOTOML:toml=lock} . .It Ev MODCARGO_CRATES Crates that will be downloaded by the module. .It Ev MODCARGO_CRATES_UPDATE diff --git a/sys/kern/kern_sysctl.c b/sys/kern/kern_sysctl.c index af2a6870a..8fa11854d 100644 --- a/sys/kern/kern_sysctl.c +++ b/sys/kern/kern_sysctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_sysctl.c,v 1.460 2025/01/04 09:26:01 mvs Exp $ */ +/* $OpenBSD: kern_sysctl.c,v 1.461 2025/01/13 18:09:24 mvs Exp $ */ /* $NetBSD: kern_sysctl.c,v 1.17 1996/05/20 17:49:05 mrg Exp $ */ /*- @@ -1672,9 +1672,10 @@ sysctl_file(int *name, u_int namelen, char *where, size_t *sizep, kf = malloc(sizeof(*kf), M_TEMP, M_WAITOK); -#define FILLIT2(fp, fdp, i, vp, pr, so) do { \ +#define FILLIT(fp, fdp, i, vp, pr) do { \ if (buflen >= elem_size && elem_count > 0) { \ - fill_file(kf, fp, fdp, i, vp, pr, p, so, show_pointers);\ + fill_file(kf, fp, fdp, i, vp, pr, p, NULL, \ + show_pointers); \ error = copyout(kf, dp, outsize); \ if (error) \ break; \ @@ -1684,62 +1685,59 @@ sysctl_file(int *name, u_int namelen, char *where, size_t *sizep, } \ needed += elem_size; \ } while (0) -#define FILLIT(fp, fdp, i, vp, pr) \ - FILLIT2(fp, fdp, i, vp, pr, NULL) -#define FILLSO(so) \ - FILLIT2(NULL, NULL, 0, NULL, NULL, so) + +#define FILLINPTABLE(table) \ +do { \ + struct inpcb_iterator iter = { .inp_table = NULL }; \ + struct inpcb *inp = NULL; \ + struct socket *so; \ + \ + mtx_enter(&(table)->inpt_mtx); \ + while ((inp = in_pcb_iterator(table, inp, &iter)) != NULL) { \ + if (buflen >= elem_size && elem_count > 0) { \ + mtx_enter(&inp->inp_sofree_mtx); \ + so = soref(inp->inp_socket); \ + mtx_leave(&inp->inp_sofree_mtx); \ + if (so == NULL) \ + continue; \ + mtx_leave(&(table)->inpt_mtx); \ + solock_shared(so); \ + fill_file(kf, NULL, NULL, 0, NULL, NULL, p, \ + so, show_pointers); \ + sounlock_shared(so); \ + sorele(so); \ + error = copyout(kf, dp, outsize); \ + mtx_enter(&(table)->inpt_mtx); \ + if (error) { \ + in_pcb_iterator_abort((table), inp, \ + &iter); \ + break; \ + } \ + dp += elem_size; \ + buflen -= elem_size; \ + elem_count--; \ + } \ + needed += elem_size; \ + } \ + mtx_leave(&(table)->inpt_mtx); \ +} while (0) switch (op) { case KERN_FILE_BYFILE: /* use the inp-tables to pick up closed connections, too */ if (arg == DTYPE_SOCKET) { - struct inpcb *inp; - - NET_LOCK(); - mtx_enter(&tcbtable.inpt_mtx); - TAILQ_FOREACH(inp, &tcbtable.inpt_queue, inp_queue) - FILLSO(inp->inp_socket); - mtx_leave(&tcbtable.inpt_mtx); + FILLINPTABLE(&tcbtable); #ifdef INET6 - mtx_enter(&tcb6table.inpt_mtx); - TAILQ_FOREACH(inp, &tcb6table.inpt_queue, inp_queue) - FILLSO(inp->inp_socket); - mtx_leave(&tcb6table.inpt_mtx); + FILLINPTABLE(&tcb6table); #endif - mtx_enter(&udbtable.inpt_mtx); - TAILQ_FOREACH(inp, &udbtable.inpt_queue, inp_queue) { - if (in_pcb_is_iterator(inp)) - continue; - FILLSO(inp->inp_socket); - } - mtx_leave(&udbtable.inpt_mtx); + FILLINPTABLE(&udbtable); #ifdef INET6 - mtx_enter(&udb6table.inpt_mtx); - TAILQ_FOREACH(inp, &udb6table.inpt_queue, inp_queue) { - if (in_pcb_is_iterator(inp)) - continue; - FILLSO(inp->inp_socket); - } - mtx_leave(&udb6table.inpt_mtx); + FILLINPTABLE(&udb6table); #endif - mtx_enter(&rawcbtable.inpt_mtx); - TAILQ_FOREACH(inp, &rawcbtable.inpt_queue, inp_queue) { - if (in_pcb_is_iterator(inp)) - continue; - FILLSO(inp->inp_socket); - } - mtx_leave(&rawcbtable.inpt_mtx); + FILLINPTABLE(&rawcbtable); #ifdef INET6 - mtx_enter(&rawin6pcbtable.inpt_mtx); - TAILQ_FOREACH(inp, &rawin6pcbtable.inpt_queue, - inp_queue) { - if (in_pcb_is_iterator(inp)) - continue; - FILLSO(inp->inp_socket); - } - mtx_leave(&rawin6pcbtable.inpt_mtx); + FILLINPTABLE(&rawin6pcbtable); #endif - NET_UNLOCK(); } fp = NULL; while ((fp = fd_iterfile(fp, p)) != NULL) { diff --git a/sys/kern/subr_hibernate.c b/sys/kern/subr_hibernate.c index 1dd446cc1..061964f6b 100644 --- a/sys/kern/subr_hibernate.c +++ b/sys/kern/subr_hibernate.c @@ -1,4 +1,4 @@ -/* $OpenBSD: subr_hibernate.c,v 1.150 2025/01/09 19:22:39 mglocker Exp $ */ +/* $OpenBSD: subr_hibernate.c,v 1.151 2025/01/13 17:50:54 krw Exp $ */ /* * Copyright (c) 2011 Ariane van der Steldt @@ -405,49 +405,11 @@ hiballoc_init(struct hiballoc_arena *arena, void *p_ptr, size_t p_len) return 0; } -/* - * Zero all free memory. - */ -void -uvm_pmr_zero_everything(void) -{ - struct uvm_pmemrange *pmr; - struct vm_page *pg; - int i; - - uvm_lock_fpageq(); - TAILQ_FOREACH(pmr, &uvm.pmr_control.use, pmr_use) { - /* Zero single pages. */ - while ((pg = TAILQ_FIRST(&pmr->single[UVM_PMR_MEMTYPE_DIRTY])) - != NULL) { - uvm_pmr_remove(pmr, pg); - uvm_pagezero(pg); - atomic_setbits_int(&pg->pg_flags, PG_ZERO); - uvmexp.zeropages++; - uvm_pmr_insert(pmr, pg, 0); - } - - /* Zero multi page ranges. */ - while ((pg = RBT_ROOT(uvm_pmr_size, - &pmr->size[UVM_PMR_MEMTYPE_DIRTY])) != NULL) { - pg--; /* Size tree always has second page. */ - uvm_pmr_remove(pmr, pg); - for (i = 0; i < pg->fpgsz; i++) { - uvm_pagezero(&pg[i]); - atomic_setbits_int(&pg[i].pg_flags, PG_ZERO); - uvmexp.zeropages++; - } - uvm_pmr_insert(pmr, pg, 0); - } - } - uvm_unlock_fpageq(); -} - /* * Mark all memory as dirty. * - * Used to inform the system that the clean memory isn't clean for some - * reason, for example because we just came back from hibernate. + * Used to inform the system that there are no pre-zero'd (PG_ZERO) free pages + * when we came back from hibernate. */ void uvm_pmr_dirty_everything(void) @@ -1534,7 +1496,6 @@ hibernate_write_chunks(union hibernate_info *hib) } uvm_pmr_dirty_everything(); - uvm_pmr_zero_everything(); /* Compress and write the chunks in the chunktable */ for (i = 0; i < hib->chunk_ctr; i++) { diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index ad2c34b61..6ece0746a 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uipc_socket.c,v 1.359 2025/01/09 17:43:33 mvs Exp $ */ +/* $OpenBSD: uipc_socket.c,v 1.360 2025/01/13 18:10:20 mvs Exp $ */ /* $NetBSD: uipc_socket.c,v 1.21 1996/02/04 02:17:52 christos Exp $ */ /* @@ -1604,15 +1604,11 @@ somove(struct socket *so, int wait) long space; int error = 0, maxreached = 0, unsplice = 0; unsigned int rcvstate; - int sockdgram = ((so->so_proto->pr_flags & - PR_WANTRCVD) == 0); sbassertlocked(&so->so_rcv); - if (!sockdgram) { + if (so->so_proto->pr_flags & PR_WANTRCVD) sblock(&so->so_snd, SBL_WAIT | SBL_NOINTR); - solock(so); - } mtx_enter(&so->so_rcv.sb_mtx); mtx_enter(&sosp->so_snd.sb_mtx); @@ -1682,7 +1678,9 @@ somove(struct socket *so, int wait) if (so->so_proto->pr_flags & PR_WANTRCVD) { mtx_leave(&sosp->so_snd.sb_mtx); mtx_leave(&so->so_rcv.sb_mtx); + solock_shared(so); pru_rcvd(so); + sounlock_shared(so); mtx_enter(&so->so_rcv.sb_mtx); mtx_enter(&sosp->so_snd.sb_mtx); } @@ -1793,7 +1791,9 @@ somove(struct socket *so, int wait) if (so->so_proto->pr_flags & PR_WANTRCVD) { mtx_leave(&sosp->so_snd.sb_mtx); mtx_leave(&so->so_rcv.sb_mtx); + solock_shared(so); pru_rcvd(so); + sounlock_shared(so); mtx_enter(&so->so_rcv.sb_mtx); mtx_enter(&sosp->so_snd.sb_mtx); } @@ -1826,7 +1826,9 @@ somove(struct socket *so, int wait) if (o) { mtx_leave(&sosp->so_snd.sb_mtx); mtx_leave(&so->so_rcv.sb_mtx); + solock_shared(sosp); error = pru_send(sosp, m, NULL, NULL); + sounlock_shared(sosp); mtx_enter(&so->so_rcv.sb_mtx); mtx_enter(&sosp->so_snd.sb_mtx); @@ -1850,7 +1852,9 @@ somove(struct socket *so, int wait) mtx_leave(&sosp->so_snd.sb_mtx); mtx_leave(&so->so_rcv.sb_mtx); + solock_shared(sosp); error = pru_sendoob(sosp, o, NULL, NULL); + sounlock_shared(sosp); mtx_enter(&so->so_rcv.sb_mtx); mtx_enter(&sosp->so_snd.sb_mtx); @@ -1877,13 +1881,9 @@ somove(struct socket *so, int wait) mtx_leave(&sosp->so_snd.sb_mtx); mtx_leave(&so->so_rcv.sb_mtx); - - if (sockdgram) - solock_shared(sosp); + solock_shared(sosp); error = pru_send(sosp, m, NULL, NULL); - if (sockdgram) - sounlock_shared(sosp); - + sounlock_shared(sosp); mtx_enter(&so->so_rcv.sb_mtx); mtx_enter(&sosp->so_snd.sb_mtx); @@ -1916,10 +1916,8 @@ somove(struct socket *so, int wait) mtx_leave(&sosp->so_snd.sb_mtx); mtx_leave(&so->so_rcv.sb_mtx); - if (!sockdgram) { + if (so->so_proto->pr_flags & PR_WANTRCVD) sbunlock(&so->so_snd); - sounlock(so); - } if (unsplice) { soref(sosp); diff --git a/sys/sys/hibernate.h b/sys/sys/hibernate.h index 06fb8804e..3967e52c5 100644 --- a/sys/sys/hibernate.h +++ b/sys/sys/hibernate.h @@ -1,4 +1,4 @@ -/* $OpenBSD: hibernate.h,v 1.48 2024/12/24 14:24:58 krw Exp $ */ +/* $OpenBSD: hibernate.h,v 1.49 2025/01/13 17:50:54 krw Exp $ */ /* * Copyright (c) 2011 Ariane van der Steldt @@ -115,7 +115,6 @@ union hibernate_info { void *hib_alloc(struct hiballoc_arena*, size_t); void hib_free(struct hiballoc_arena*, void*); int hiballoc_init(struct hiballoc_arena*, void*, size_t len); -void uvm_pmr_zero_everything(void); void uvm_pmr_dirty_everything(void); int uvm_pmr_alloc_pig(paddr_t*, psize_t, paddr_t); int uvm_pmr_alloc_piglet(vaddr_t*, paddr_t*, vsize_t, paddr_t);