Module Name: src Committed By: pgoyette Date: Tue Mar 13 09:10:31 UTC 2018
Modified Files: src/sys/compat/common [pgoyette-compat]: Makefile.sysio compat_mod.c files.common src/sys/uvm [pgoyette-compat]: uvm_swap.c uvm_swap.h Added Files: src/sys/compat/common [pgoyette-compat]: uvm_stats_13.c uvm_stats_13.h uvm_stats_50.c uvm_stats_50.h Log Message: Move the swapstats compat code into the compat_netbsd module. Without this, a kernel configured without COMPAT_13 and/or COMPAT_50 could not execute the compat swapstats code, even if the compat_netbsd module had been loaded. To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.7.18.1 src/sys/compat/common/Makefile.sysio cvs rdiff -u -r1.24.14.4 -r1.24.14.5 src/sys/compat/common/compat_mod.c cvs rdiff -u -r1.1.2.6 -r1.1.2.7 src/sys/compat/common/files.common cvs rdiff -u -r0 -r1.1.2.1 src/sys/compat/common/uvm_stats_13.c \ src/sys/compat/common/uvm_stats_13.h src/sys/compat/common/uvm_stats_50.c \ src/sys/compat/common/uvm_stats_50.h cvs rdiff -u -r1.175 -r1.175.2.1 src/sys/uvm/uvm_swap.c cvs rdiff -u -r1.22 -r1.22.16.1 src/sys/uvm/uvm_swap.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/compat/common/Makefile.sysio diff -u src/sys/compat/common/Makefile.sysio:1.7 src/sys/compat/common/Makefile.sysio:1.7.18.1 --- src/sys/compat/common/Makefile.sysio:1.7 Sat Nov 5 23:30:22 2016 +++ src/sys/compat/common/Makefile.sysio Tue Mar 13 09:10:31 2018 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile.sysio,v 1.7 2016/11/05 23:30:22 pgoyette Exp $ +# $NetBSD: Makefile.sysio,v 1.7.18.1 2018/03/13 09:10:31 pgoyette Exp $ # Sources for syscall and ioctl compatibility across the versions. @@ -13,7 +13,7 @@ SRCS+= kern_info_09.c SRCS+= kern_xxx_12.c vfs_syscalls_12.c vm_12.c # Compatibility code for NetBSD 1.3 -SRCS+= kern_sig_13.c +SRCS+= kern_sig_13.c uvm_stats_13.c # Compatibility code for NetBSD 1.6 SRCS+= kern_sig_16.c @@ -31,8 +31,8 @@ SRCS+= kern_time_30.c vfs_syscalls_30.c SRCS+= vfs_syscalls_40.c uipc_syscalls_40.c # Compatibility code for NetBSD 5.0 -SRCS+= kern_50.c kern_time_50.c kern_select_50.c rndpseudo_50.c rtsock_50.c \ - vfs_syscalls_50.c uipc_syscalls_50.c +SRCS+= kern_50.c kern_time_50.c kern_select_50.c rndpseudo_50.c rtsock_50.c +SRCS+= vfs_syscalls_50.c uipc_syscalls_50.c uvm_stats_50.c # Compatibility code for NetBSD 6.0 SRCS+= kern_sa_60.c tty_60.c kern_time_60.c Index: src/sys/compat/common/compat_mod.c diff -u src/sys/compat/common/compat_mod.c:1.24.14.4 src/sys/compat/common/compat_mod.c:1.24.14.5 --- src/sys/compat/common/compat_mod.c:1.24.14.4 Thu Mar 8 01:07:13 2018 +++ src/sys/compat/common/compat_mod.c Tue Mar 13 09:10:31 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: compat_mod.c,v 1.24.14.4 2018/03/08 01:07:13 pgoyette Exp $ */ +/* $NetBSD: compat_mod.c,v 1.24.14.5 2018/03/13 09:10:31 pgoyette Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: compat_mod.c,v 1.24.14.4 2018/03/08 01:07:13 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: compat_mod.c,v 1.24.14.5 2018/03/13 09:10:31 pgoyette Exp $"); #ifdef _KERNEL_OPT #include "opt_compat_netbsd.h" @@ -62,6 +62,8 @@ __KERNEL_RCSID(0, "$NetBSD: compat_mod.c #include <compat/common/compat_util.h> #include <compat/common/compat_mod.h> #include <compat/common/if_43.h> +#include <compat/common/uvm_stats_13.h> +#include <compat/common/uvm_stats_50.h> #include <compat/sys/sockio.h> @@ -251,11 +253,15 @@ compat_modcmd(modcmd_t cmd, void *arg) ttcompatvec = ttcompat; if_43_init(); #endif +#ifdef COMPAT_13 + swapstats_13_init(); +#endif #ifdef COMPAT_40 if_40_init(); #endif #ifdef COMPAT_50 if_50_init(); + swapstats_50_init(); #endif #ifdef COMPAT_16 #if defined(COMPAT_SIGCONTEXT) @@ -326,6 +332,16 @@ compat_modcmd(modcmd_t cmd, void *arg) rw_exit(&exec_lock); #endif #endif /* COMPAT_16 */ +#ifdef COMPAT_13 + swapstats_13_fini(); +#endif +#ifdef COMPAT_40 + if_40_fini(); +#endif +#ifdef COMPAT_50 + if_50_fini(); + swapstats_50_fini(); +#endif compat_sysctl_fini(); return 0; Index: src/sys/compat/common/files.common diff -u src/sys/compat/common/files.common:1.1.2.6 src/sys/compat/common/files.common:1.1.2.7 --- src/sys/compat/common/files.common:1.1.2.6 Mon Mar 12 01:59:31 2018 +++ src/sys/compat/common/files.common Tue Mar 13 09:10:31 2018 @@ -1,4 +1,4 @@ -# $NetBSD: files.common,v 1.1.2.6 2018/03/12 01:59:31 pgoyette Exp $ +# $NetBSD: files.common,v 1.1.2.7 2018/03/13 09:10:31 pgoyette Exp $ # # Generic files, used by all compat options. @@ -32,6 +32,7 @@ file compat/common/vm_12.c compat_netb # Compatibility code for NetBSD 1.3 file compat/common/kern_sig_13.c compat_netbsd +file compat/common/uvm_stats_13.c compat_netbsd # Compatibility code for NetBSD 1.4 file compat/common/rtsock_14.c compat_netbsd @@ -59,6 +60,7 @@ file compat/common/rndpseudo_50.c compa file compat/common/rtsock_50.c compat_netbsd file compat/common/vfs_syscalls_50.c compat_netbsd file compat/common/uipc_syscalls_50.c compat_netbsd +file compat/common/uvm_stats_50.c compat_netbsd # Compatibility code for NetBSD 6.0 file compat/common/kern_sa_60.c compat_netbsd Index: src/sys/uvm/uvm_swap.c diff -u src/sys/uvm/uvm_swap.c:1.175 src/sys/uvm/uvm_swap.c:1.175.2.1 --- src/sys/uvm/uvm_swap.c:1.175 Sat Oct 28 00:37:13 2017 +++ src/sys/uvm/uvm_swap.c Tue Mar 13 09:10:31 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_swap.c,v 1.175 2017/10/28 00:37:13 pgoyette Exp $ */ +/* $NetBSD: uvm_swap.c,v 1.175.2.1 2018/03/13 09:10:31 pgoyette Exp $ */ /* * Copyright (c) 1995, 1996, 1997, 2009 Matthew R. Green @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uvm_swap.c,v 1.175 2017/10/28 00:37:13 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uvm_swap.c,v 1.175.2.1 2018/03/13 09:10:31 pgoyette Exp $"); #include "opt_uvmhist.h" #include "opt_compat_netbsd.h" @@ -116,35 +116,6 @@ __KERNEL_RCSID(0, "$NetBSD: uvm_swap.c,v */ /* - * swapdev: describes a single swap partition/file - * - * note the following should be true: - * swd_inuse <= swd_nblks [number of blocks in use is <= total blocks] - * swd_nblks <= swd_mapsize [because mapsize includes miniroot+disklabel] - */ -struct swapdev { - dev_t swd_dev; /* device id */ - int swd_flags; /* flags:inuse/enable/fake */ - int swd_priority; /* our priority */ - int swd_nblks; /* blocks in this device */ - char *swd_path; /* saved pathname of device */ - int swd_pathlen; /* length of pathname */ - int swd_npages; /* #pages we can use */ - int swd_npginuse; /* #pages in use */ - int swd_npgbad; /* #pages bad */ - int swd_drumoffset; /* page0 offset in drum */ - int swd_drumsize; /* #pages in drum */ - blist_t swd_blist; /* blist for this swapdev */ - struct vnode *swd_vp; /* backing vnode */ - TAILQ_ENTRY(swapdev) swd_next; /* priority tailq */ - - int swd_bsize; /* blocksize (bytes) */ - int swd_maxactive; /* max active i/o reqs */ - struct bufq_state *swd_tab; /* buffer list */ - int swd_active; /* number of active buffers */ -}; - -/* * swap device priority entry; the list is kept sorted on `spi_priority'. */ struct swappri { @@ -245,6 +216,40 @@ static void sw_reg_start(struct swapdev static int uvm_swap_io(struct vm_page **, int, int, int); /* + * vectored routines for COMPAT_13 and COMPAT_50 + */ + +size_t swapstats_len_13 = 0; + +static void stub_swapstats13_copy(int, int, struct swapdev *, + struct swapent13 *); +void (*vec_swapstats_copy_13)(int, int, struct swapdev *, struct swapent13 *) = + stub_swapstats13_copy; + +size_t swapstats_len_50 = 0; + +static void stub_swapstats50_copy(int, int, struct swapdev *, + struct swapent50 *); +void (*vec_swapstats_copy_50)(int, int, struct swapdev *, struct swapent50 *) = + stub_swapstats50_copy; + +static void +stub_swapstats13_copy(int cmd, int inuse, struct swapdev *sdp, + struct swapent13 *sep13) +{ + + /* nothing */ +} + +static void +stub_swapstats50_copy(int cmd, int inuse, struct swapdev *sdp, + struct swapent50 *sep50) +{ + + /* nothing */ +} + +/* * uvm_swap_init: init the swap system data structures and locks * * => called at boot time from init_main.c after the filesystems @@ -494,14 +499,18 @@ sys_swapctl(struct lwp *l, const struct * to grab the uvm_swap_data_lock because we may fault&sleep during * copyout() and we don't want to be holding that lock then! */ - if (SCARG(uap, cmd) == SWAP_STATS -#if defined(COMPAT_50) - || SCARG(uap, cmd) == SWAP_STATS50 -#endif -#if defined(COMPAT_13) - || SCARG(uap, cmd) == SWAP_STATS13 -#endif - ) { + len = 0; + if (SCARG(uap, cmd) == SWAP_STATS) + len = sizeof(struct swapent); + else if (SCARG(uap, cmd) == SWAP_STATS13) + len = swapstats_len_13; + else if (SCARG(uap, cmd) == SWAP_STATS50) + len = swapstats_len_50; + /* + * If the compat_* code isn't loaded, len will still be zero + * and we'll just fall through and return EINVAL + */ + if (len > 0) { if (misc < 0) { error = EINVAL; goto out; @@ -514,17 +523,7 @@ sys_swapctl(struct lwp *l, const struct if ((size_t)misc > (size_t)uvmexp.nswapdev) misc = uvmexp.nswapdev; KASSERT(misc > 0); -#if defined(COMPAT_13) - if (SCARG(uap, cmd) == SWAP_STATS13) - len = sizeof(struct swapent13) * misc; - else -#endif -#if defined(COMPAT_50) - if (SCARG(uap, cmd) == SWAP_STATS50) - len = sizeof(struct swapent50) * misc; - else -#endif - len = sizeof(struct swapent) * misc; + len *= misc; sep = (struct swapent *)kmem_alloc(len, KM_SLEEP); uvm_swap_stats(SCARG(uap, cmd), sep, misc, retval); @@ -769,9 +768,7 @@ uvm_swap_stats(int cmd, struct swapent * inuse = btodb((uint64_t)sdp->swd_npginuse << PAGE_SHIFT); -#if defined(COMPAT_13) || defined(COMPAT_50) if (cmd == SWAP_STATS) { -#endif sep->se_dev = sdp->swd_dev; sep->se_flags = sdp->swd_flags; sep->se_nblks = sdp->swd_nblks; @@ -781,36 +778,21 @@ uvm_swap_stats(int cmd, struct swapent * sizeof(sep->se_path)); strcpy(sep->se_path, sdp->swd_path); sep++; -#if defined(COMPAT_13) } else if (cmd == SWAP_STATS13) { struct swapent13 *sep13 = (struct swapent13 *)sep; - sep13->se13_dev = sdp->swd_dev; - sep13->se13_flags = sdp->swd_flags; - sep13->se13_nblks = sdp->swd_nblks; - sep13->se13_inuse = inuse; - sep13->se13_priority = sdp->swd_priority; + (*vec_swapstats_copy_13)(cmd, inuse, sdp, + sep13); sep = (struct swapent *)(sep13 + 1); -#endif -#if defined(COMPAT_50) } else if (cmd == SWAP_STATS50) { struct swapent50 *sep50 = (struct swapent50 *)sep; - sep50->se50_dev = sdp->swd_dev; - sep50->se50_flags = sdp->swd_flags; - sep50->se50_nblks = sdp->swd_nblks; - sep50->se50_inuse = inuse; - sep50->se50_priority = sdp->swd_priority; - KASSERT(sdp->swd_pathlen < - sizeof(sep50->se50_path)); - strcpy(sep50->se50_path, sdp->swd_path); + (*vec_swapstats_copy_50)(cmd, inuse, sdp, + sep50); sep = (struct swapent *)(sep50 + 1); -#endif -#if defined(COMPAT_13) || defined(COMPAT_50) } -#endif count++; } } Index: src/sys/uvm/uvm_swap.h diff -u src/sys/uvm/uvm_swap.h:1.22 src/sys/uvm/uvm_swap.h:1.22.16.1 --- src/sys/uvm/uvm_swap.h:1.22 Thu Jul 30 10:25:49 2015 +++ src/sys/uvm/uvm_swap.h Tue Mar 13 09:10:31 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_swap.h,v 1.22 2015/07/30 10:25:49 christos Exp $ */ +/* $NetBSD: uvm_swap.h,v 1.22.16.1 2018/03/13 09:10:31 pgoyette Exp $ */ /* * Copyright (c) 1997 Matthew R. Green @@ -38,9 +38,40 @@ #include "opt_vmswap.h" #endif +#include <sys/blist.h> + struct swapent; struct lwp; +/* + * swapdev: describes a single swap partition/file + * + * note the following should be true: + * swd_inuse <= swd_nblks [number of blocks in use is <= total blocks] + * swd_nblks <= swd_mapsize [because mapsize includes miniroot+disklabel] + */ +struct swapdev { + dev_t swd_dev; /* device id */ + int swd_flags; /* flags:inuse/enable/fake */ + int swd_priority; /* our priority */ + int swd_nblks; /* blocks in this device */ + char *swd_path; /* saved pathname of device */ + int swd_pathlen; /* length of pathname */ + int swd_npages; /* #pages we can use */ + int swd_npginuse; /* #pages in use */ + int swd_npgbad; /* #pages bad */ + int swd_drumoffset; /* page0 offset in drum */ + int swd_drumsize; /* #pages in drum */ + blist_t swd_blist; /* blist for this swapdev */ + struct vnode *swd_vp; /* backing vnode */ + TAILQ_ENTRY(swapdev) swd_next; /* priority tailq */ + + int swd_bsize; /* blocksize (bytes) */ + int swd_maxactive; /* max active i/o reqs */ + struct bufq_state *swd_tab; /* buffer list */ + int swd_active; /* number of active buffers */ +}; + #if defined(VMSWAP) int uvm_swap_get(struct vm_page *, int, int); int uvm_swap_put(int, struct vm_page **, int, int); Added files: Index: src/sys/compat/common/uvm_stats_13.c diff -u /dev/null src/sys/compat/common/uvm_stats_13.c:1.1.2.1 --- /dev/null Tue Mar 13 09:10:31 2018 +++ src/sys/compat/common/uvm_stats_13.c Tue Mar 13 09:10:31 2018 @@ -0,0 +1,80 @@ +/* $NetBSD: uvm_stats_13.c,v 1.1.2.1 2018/03/13 09:10:31 pgoyette Exp $ */ + +/* + * Copyright (c) 1995, 1996, 1997, 2009 Matthew R. Green + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: NetBSD: uvm_swap.c,v 1.175 2017/10/28 00:37:13 pgoyette Exp + * from: NetBSD: vm_swap.c,v 1.52 1997/12/02 13:47:37 pk Exp + * from: Id: uvm_swap.c,v 1.1.2.42 1998/02/02 20:38:06 chuck Exp + */ + +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: uvm_stats_13.c,v 1.1.2.1 2018/03/13 09:10:31 pgoyette Exp $"); + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/errno.h> +#include <sys/swap.h> + +#include <uvm/uvm.h> + +#include <compat/common/uvm_stats_13.h> + +static void (*orig_swapstats_copy_13)(int, int, struct swapdev *, + struct swapent13 *); + +static void swapstats_copy_13(int, int, struct swapdev *, struct swapent13 *); + +void +swapstats_13_init(void) +{ + + swapstats_len_13 = sizeof(struct swapent13); + + orig_swapstats_copy_13 = vec_swapstats_copy_13; + vec_swapstats_copy_13 = swapstats_copy_13; +} + +void +swapstats_13_fini(void) +{ + + swapstats_len_13 = 0; + vec_swapstats_copy_13 = orig_swapstats_copy_13; +} + +static void +swapstats_copy_13(int cmd, int inuse, struct swapdev *sdp, + struct swapent13 *sep13) +{ + + if (cmd == SWAP_STATS13) { + sep13->se13_dev = sdp->swd_dev; + sep13->se13_flags = sdp->swd_flags; + sep13->se13_nblks = sdp->swd_nblks; + sep13->se13_inuse = inuse; + sep13->se13_priority = sdp->swd_priority; + } +} Index: src/sys/compat/common/uvm_stats_13.h diff -u /dev/null src/sys/compat/common/uvm_stats_13.h:1.1.2.1 --- /dev/null Tue Mar 13 09:10:31 2018 +++ src/sys/compat/common/uvm_stats_13.h Tue Mar 13 09:10:31 2018 @@ -0,0 +1,51 @@ +/* $NetBSD: uvm_stats_13.h,v 1.1.2.1 2018/03/13 09:10:31 pgoyette Exp $ */ + +/* + * Copyright (c) 1997 Matthew R. Green + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: Id: uvm_swap.h,v 1.1.2.6 1997/12/15 05:39:31 mrg Exp + */ + +#ifndef _COMPAT_COMMON_UVM_STATS_13_H +#define _COMPAT_COMMON_UVM_STATS_13_H + +struct swapent13 { + int32_t se13_dev; /* device id */ + int se13_flags; /* flags */ + int se13_nblks; /* total blocks */ + int se13_inuse; /* blocks in use */ + int se13_priority; /* priority of this device */ +}; + +struct swapdev; + +void swapstats_13_init(void); +void swapstats_13_fini(void); + +extern size_t swapstats_len_13; +extern void (*vec_swapstats_copy_13)(int, int, struct swapdev *, + struct swapent13 *); + +#endif /* _COMPAT_COMMON_UVM_STATS_13_H */ Index: src/sys/compat/common/uvm_stats_50.c diff -u /dev/null src/sys/compat/common/uvm_stats_50.c:1.1.2.1 --- /dev/null Tue Mar 13 09:10:31 2018 +++ src/sys/compat/common/uvm_stats_50.c Tue Mar 13 09:10:31 2018 @@ -0,0 +1,83 @@ +/* $NetBSD: uvm_stats_50.c,v 1.1.2.1 2018/03/13 09:10:31 pgoyette Exp $ */ + +/* + * Copyright (c) 1995, 1996, 1997, 2009 Matthew R. Green + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: NetBSD: uvm_swap.c,v 1.175 2017/10/28 00:37:13 pgoyette Exp + * from: NetBSD: vm_swap.c,v 1.52 1997/12/02 13:47:37 pk Exp + * from: Id: uvm_swap.c,v 1.1.2.42 1998/02/02 20:38:06 chuck Exp + */ + +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: uvm_stats_50.c,v 1.1.2.1 2018/03/13 09:10:31 pgoyette Exp $"); + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/errno.h> +#include <sys/kernel.h> +#include <sys/swap.h> + +#include <uvm/uvm.h> + +#include <compat/common/uvm_stats_50.h> + +static void (*orig_swapstats_copy_50)(int, int, struct swapdev *, + struct swapent50 *); + +static void swapstats_copy_50(int, int, struct swapdev *, struct swapent50 *); + +void +swapstats_50_init(void) +{ + + swapstats_len_50 = sizeof(struct swapent50); + + orig_swapstats_copy_50 = vec_swapstats_copy_50; + vec_swapstats_copy_50 = swapstats_copy_50; +} + +void +swapstats_50_fini(void) +{ + + swapstats_len_50 = 0; + vec_swapstats_copy_50 = orig_swapstats_copy_50; +} + +static void +swapstats_copy_50(int cmd, int inuse, struct swapdev *sdp, + struct swapent50 *sep50) +{ + + if (cmd == SWAP_STATS50) { + sep50->se50_dev = sdp->swd_dev; + sep50->se50_flags = sdp->swd_flags; + sep50->se50_nblks = sdp->swd_nblks; + sep50->se50_inuse = inuse; + sep50->se50_priority = sdp->swd_priority; + KASSERT(sdp->swd_pathlen < sizeof(sep50->se50_path)); + strcpy(sep50->se50_path, sdp->swd_path); + } +} Index: src/sys/compat/common/uvm_stats_50.h diff -u /dev/null src/sys/compat/common/uvm_stats_50.h:1.1.2.1 --- /dev/null Tue Mar 13 09:10:31 2018 +++ src/sys/compat/common/uvm_stats_50.h Tue Mar 13 09:10:31 2018 @@ -0,0 +1,52 @@ +/* $NetBSD: uvm_stats_50.h,v 1.1.2.1 2018/03/13 09:10:31 pgoyette Exp $ */ + +/* + * Copyright (c) 1997 Matthew R. Green + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: Id: uvm_swap.h,v 1.1.2.6 1997/12/15 05:39:31 mrg Exp + */ + +#ifndef _COMPAT_COMMON_UVM_STATS_50_H +#define _COMPAT_COMMON_UVM_STATS_50_H + +struct swapent50 { + int32_t se50_dev; /* device id */ + int se50_flags; /* flags */ + int se50_nblks; /* total blocks */ + int se50_inuse; /* blocks in use */ + int se50_priority; /* priority of this device */ + char se50_path[PATH_MAX+1]; /* path name */ +}; + +struct swapdev; + +void swapstats_50_init(void); +void swapstats_50_fini(void); + +extern size_t swapstats_len_50; +extern void (*vec_swapstats_copy_50)(int, int, struct swapdev *, + struct swapent50 *); + +#endif /* _COMPAT_COMMON_UVM_STATS_50_H */