1*710542dfSBryan Drewery /*- 2*710542dfSBryan Drewery * Copyright (C) 2016 Bryan Drewery <bdrewery@FreeBSD.org> 3*710542dfSBryan Drewery * All rights reserved. 4*710542dfSBryan Drewery * 5*710542dfSBryan Drewery * Redistribution and use in source and binary forms, with or without 6*710542dfSBryan Drewery * modification, are permitted provided that the following conditions 7*710542dfSBryan Drewery * are met: 8*710542dfSBryan Drewery * 1. Redistributions of source code must retain the above copyright 9*710542dfSBryan Drewery * notice, this list of conditions and the following disclaimer. 10*710542dfSBryan Drewery * 2. Redistributions in binary form must reproduce the above copyright 11*710542dfSBryan Drewery * notice, this list of conditions and the following disclaimer in the 12*710542dfSBryan Drewery * documentation and/or other materials provided with the distribution. 13*710542dfSBryan Drewery * 14*710542dfSBryan Drewery * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15*710542dfSBryan Drewery * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16*710542dfSBryan Drewery * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17*710542dfSBryan Drewery * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18*710542dfSBryan Drewery * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19*710542dfSBryan Drewery * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20*710542dfSBryan Drewery * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21*710542dfSBryan Drewery * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22*710542dfSBryan Drewery * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23*710542dfSBryan Drewery * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24*710542dfSBryan Drewery * SUCH DAMAGE. 25*710542dfSBryan Drewery */ 26*710542dfSBryan Drewery 27*710542dfSBryan Drewery /* 28*710542dfSBryan Drewery * Helper for mlock(3) to avoid EAGAIN errors 29*710542dfSBryan Drewery */ 30*710542dfSBryan Drewery 31*710542dfSBryan Drewery #include <sys/cdefs.h> 32*710542dfSBryan Drewery __FBSDID("$FreeBSD$"); 33*710542dfSBryan Drewery 34*710542dfSBryan Drewery #include <sys/types.h> 35*710542dfSBryan Drewery #include <sys/sysctl.h> 36*710542dfSBryan Drewery 37*710542dfSBryan Drewery #include <atf-c.h> 38*710542dfSBryan Drewery #include <errno.h> 39*710542dfSBryan Drewery #include <stdio.h> 40*710542dfSBryan Drewery #include <limits.h> 41*710542dfSBryan Drewery 42*710542dfSBryan Drewery #define VM_MAX_WIRED "vm.max_wired" 43*710542dfSBryan Drewery 44*710542dfSBryan Drewery static void 45*710542dfSBryan Drewery vm_max_wired_sysctl(int *old_value, int *new_value) 46*710542dfSBryan Drewery { 47*710542dfSBryan Drewery size_t old_len; 48*710542dfSBryan Drewery size_t new_len = (new_value == NULL ? 0 : sizeof(int)); 49*710542dfSBryan Drewery 50*710542dfSBryan Drewery if (old_value == NULL) 51*710542dfSBryan Drewery printf("Setting the new value to %d\n", *new_value); 52*710542dfSBryan Drewery else { 53*710542dfSBryan Drewery ATF_REQUIRE_MSG(sysctlbyname(VM_MAX_WIRED, NULL, &old_len, 54*710542dfSBryan Drewery new_value, new_len) == 0, 55*710542dfSBryan Drewery "sysctlbyname(%s) failed: %s", VM_MAX_WIRED, strerror(errno)); 56*710542dfSBryan Drewery } 57*710542dfSBryan Drewery 58*710542dfSBryan Drewery ATF_REQUIRE_MSG(sysctlbyname(VM_MAX_WIRED, old_value, &old_len, 59*710542dfSBryan Drewery new_value, new_len) == 0, 60*710542dfSBryan Drewery "sysctlbyname(%s) failed: %s", VM_MAX_WIRED, strerror(errno)); 61*710542dfSBryan Drewery 62*710542dfSBryan Drewery if (old_value != NULL) 63*710542dfSBryan Drewery printf("Saved the old value (%d)\n", *old_value); 64*710542dfSBryan Drewery } 65*710542dfSBryan Drewery 66*710542dfSBryan Drewery void 67*710542dfSBryan Drewery set_vm_max_wired(int new_value) 68*710542dfSBryan Drewery { 69*710542dfSBryan Drewery FILE *fp; 70*710542dfSBryan Drewery int old_value; 71*710542dfSBryan Drewery 72*710542dfSBryan Drewery fp = fopen(VM_MAX_WIRED, "w"); 73*710542dfSBryan Drewery if (fp == NULL) { 74*710542dfSBryan Drewery atf_tc_skip("could not open %s for writing: %s", 75*710542dfSBryan Drewery VM_MAX_WIRED, strerror(errno)); 76*710542dfSBryan Drewery return; 77*710542dfSBryan Drewery } 78*710542dfSBryan Drewery 79*710542dfSBryan Drewery vm_max_wired_sysctl(&old_value, NULL); 80*710542dfSBryan Drewery 81*710542dfSBryan Drewery ATF_REQUIRE_MSG(fprintf(fp, "%d", old_value) > 0, 82*710542dfSBryan Drewery "saving %s failed", VM_MAX_WIRED); 83*710542dfSBryan Drewery 84*710542dfSBryan Drewery fclose(fp); 85*710542dfSBryan Drewery 86*710542dfSBryan Drewery vm_max_wired_sysctl(NULL, &new_value); 87*710542dfSBryan Drewery } 88*710542dfSBryan Drewery 89*710542dfSBryan Drewery void 90*710542dfSBryan Drewery restore_vm_max_wired(void) 91*710542dfSBryan Drewery { 92*710542dfSBryan Drewery FILE *fp; 93*710542dfSBryan Drewery int saved_max_wired; 94*710542dfSBryan Drewery 95*710542dfSBryan Drewery fp = fopen(VM_MAX_WIRED, "r"); 96*710542dfSBryan Drewery if (fp == NULL) { 97*710542dfSBryan Drewery perror("fopen failed\n"); 98*710542dfSBryan Drewery return; 99*710542dfSBryan Drewery } 100*710542dfSBryan Drewery 101*710542dfSBryan Drewery if (fscanf(fp, "%d", &saved_max_wired) != 1) { 102*710542dfSBryan Drewery perror("fscanf failed\n"); 103*710542dfSBryan Drewery fclose(fp); 104*710542dfSBryan Drewery return; 105*710542dfSBryan Drewery } 106*710542dfSBryan Drewery 107*710542dfSBryan Drewery fclose(fp); 108*710542dfSBryan Drewery printf("old value in %s: %d\n", VM_MAX_WIRED, saved_max_wired); 109*710542dfSBryan Drewery 110*710542dfSBryan Drewery if (saved_max_wired == 0) /* This will cripple the test host */ 111*710542dfSBryan Drewery return; 112*710542dfSBryan Drewery 113*710542dfSBryan Drewery vm_max_wired_sysctl(NULL, &saved_max_wired); 114*710542dfSBryan Drewery } 115