1710542dfSBryan Drewery /*- 2710542dfSBryan Drewery * Copyright (C) 2016 Bryan Drewery <bdrewery@FreeBSD.org> 3710542dfSBryan Drewery * All rights reserved. 4710542dfSBryan Drewery * 5710542dfSBryan Drewery * Redistribution and use in source and binary forms, with or without 6710542dfSBryan Drewery * modification, are permitted provided that the following conditions 7710542dfSBryan Drewery * are met: 8710542dfSBryan Drewery * 1. Redistributions of source code must retain the above copyright 9710542dfSBryan Drewery * notice, this list of conditions and the following disclaimer. 10710542dfSBryan Drewery * 2. Redistributions in binary form must reproduce the above copyright 11710542dfSBryan Drewery * notice, this list of conditions and the following disclaimer in the 12710542dfSBryan Drewery * documentation and/or other materials provided with the distribution. 13710542dfSBryan Drewery * 14710542dfSBryan Drewery * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15710542dfSBryan Drewery * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16710542dfSBryan Drewery * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17710542dfSBryan Drewery * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18710542dfSBryan Drewery * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19710542dfSBryan Drewery * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20710542dfSBryan Drewery * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21710542dfSBryan Drewery * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22710542dfSBryan Drewery * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23710542dfSBryan Drewery * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24710542dfSBryan Drewery * SUCH DAMAGE. 25710542dfSBryan Drewery */ 26710542dfSBryan Drewery 27710542dfSBryan Drewery /* 28710542dfSBryan Drewery * Helper for mlock(3) to avoid EAGAIN errors 29710542dfSBryan Drewery */ 30710542dfSBryan Drewery 31710542dfSBryan Drewery #include <sys/cdefs.h> 32710542dfSBryan Drewery __FBSDID("$FreeBSD$"); 33710542dfSBryan Drewery 34710542dfSBryan Drewery #include <sys/types.h> 35710542dfSBryan Drewery #include <sys/sysctl.h> 36710542dfSBryan Drewery 37710542dfSBryan Drewery #include <atf-c.h> 38710542dfSBryan Drewery #include <errno.h> 39710542dfSBryan Drewery #include <limits.h> 40*13876dc9SEnji Cooper #include <stdio.h> 41710542dfSBryan Drewery 42710542dfSBryan Drewery #define VM_MAX_WIRED "vm.max_wired" 43710542dfSBryan Drewery 44710542dfSBryan Drewery static void 45710542dfSBryan Drewery vm_max_wired_sysctl(int *old_value, int *new_value) 46710542dfSBryan Drewery { 47710542dfSBryan Drewery size_t old_len; 48710542dfSBryan Drewery size_t new_len = (new_value == NULL ? 0 : sizeof(int)); 49710542dfSBryan Drewery 50710542dfSBryan Drewery if (old_value == NULL) 51710542dfSBryan Drewery printf("Setting the new value to %d\n", *new_value); 52710542dfSBryan Drewery else { 53710542dfSBryan Drewery ATF_REQUIRE_MSG(sysctlbyname(VM_MAX_WIRED, NULL, &old_len, 54710542dfSBryan Drewery new_value, new_len) == 0, 55710542dfSBryan Drewery "sysctlbyname(%s) failed: %s", VM_MAX_WIRED, strerror(errno)); 56710542dfSBryan Drewery } 57710542dfSBryan Drewery 58710542dfSBryan Drewery ATF_REQUIRE_MSG(sysctlbyname(VM_MAX_WIRED, old_value, &old_len, 59710542dfSBryan Drewery new_value, new_len) == 0, 60710542dfSBryan Drewery "sysctlbyname(%s) failed: %s", VM_MAX_WIRED, strerror(errno)); 61710542dfSBryan Drewery 62710542dfSBryan Drewery if (old_value != NULL) 63710542dfSBryan Drewery printf("Saved the old value (%d)\n", *old_value); 64710542dfSBryan Drewery } 65710542dfSBryan Drewery 66710542dfSBryan Drewery void 67710542dfSBryan Drewery set_vm_max_wired(int new_value) 68710542dfSBryan Drewery { 69710542dfSBryan Drewery FILE *fp; 70710542dfSBryan Drewery int old_value; 71710542dfSBryan Drewery 72710542dfSBryan Drewery fp = fopen(VM_MAX_WIRED, "w"); 73710542dfSBryan Drewery if (fp == NULL) { 74710542dfSBryan Drewery atf_tc_skip("could not open %s for writing: %s", 75710542dfSBryan Drewery VM_MAX_WIRED, strerror(errno)); 76710542dfSBryan Drewery return; 77710542dfSBryan Drewery } 78710542dfSBryan Drewery 79710542dfSBryan Drewery vm_max_wired_sysctl(&old_value, NULL); 80710542dfSBryan Drewery 81710542dfSBryan Drewery ATF_REQUIRE_MSG(fprintf(fp, "%d", old_value) > 0, 82710542dfSBryan Drewery "saving %s failed", VM_MAX_WIRED); 83710542dfSBryan Drewery 84710542dfSBryan Drewery fclose(fp); 85710542dfSBryan Drewery 86710542dfSBryan Drewery vm_max_wired_sysctl(NULL, &new_value); 87710542dfSBryan Drewery } 88710542dfSBryan Drewery 89710542dfSBryan Drewery void 90710542dfSBryan Drewery restore_vm_max_wired(void) 91710542dfSBryan Drewery { 92710542dfSBryan Drewery FILE *fp; 93710542dfSBryan Drewery int saved_max_wired; 94710542dfSBryan Drewery 95710542dfSBryan Drewery fp = fopen(VM_MAX_WIRED, "r"); 96710542dfSBryan Drewery if (fp == NULL) { 97710542dfSBryan Drewery perror("fopen failed\n"); 98710542dfSBryan Drewery return; 99710542dfSBryan Drewery } 100710542dfSBryan Drewery 101710542dfSBryan Drewery if (fscanf(fp, "%d", &saved_max_wired) != 1) { 102710542dfSBryan Drewery perror("fscanf failed\n"); 103710542dfSBryan Drewery fclose(fp); 104710542dfSBryan Drewery return; 105710542dfSBryan Drewery } 106710542dfSBryan Drewery 107710542dfSBryan Drewery fclose(fp); 108710542dfSBryan Drewery printf("old value in %s: %d\n", VM_MAX_WIRED, saved_max_wired); 109710542dfSBryan Drewery 110710542dfSBryan Drewery if (saved_max_wired == 0) /* This will cripple the test host */ 111710542dfSBryan Drewery return; 112710542dfSBryan Drewery 113710542dfSBryan Drewery vm_max_wired_sysctl(NULL, &saved_max_wired); 114710542dfSBryan Drewery } 115