1 /* 2 * Copyright (c) 2013 The DragonFly Project. All rights reserved. 3 * 4 * This code is derived from software contributed to The DragonFly Project 5 * by Matthew Dillon <dillon@backplane.com> 6 * by Antonio Huete Jimenez <tuxillo@quantumachine.net> 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in 16 * the documentation and/or other materials provided with the 17 * distribution. 18 * 3. Neither the name of The DragonFly Project nor the names of its 19 * contributors may be used to endorse or promote products derived 20 * from this software without specific, prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 23 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 25 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 26 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 27 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, 28 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 29 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 30 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 31 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 32 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 */ 35 36 #include <stdio.h> 37 #include <sys/sysctl.h> 38 39 #include "libhammer.h" 40 41 static 42 int 43 dosysctl(const char *sname, int64_t *value) 44 { 45 size_t len; 46 int error; 47 48 len = sizeof(*value); 49 error = sysctlbyname(sname, value, &len, NULL, 0); 50 51 return error; 52 } 53 54 int 55 libhammer_stats_redo(int64_t *value) 56 { 57 return (dosysctl("vfs.hammer.stats_redo", value)); 58 } 59 60 int 61 libhammer_stats_undo(int64_t *value) 62 { 63 return (dosysctl("vfs.hammer.stats_undo", value)); 64 } 65 66 int 67 libhammer_stats_commits(int64_t *value) 68 { 69 return (dosysctl("vfs.hammer.stats_commits", value)); 70 } 71 72 int 73 libhammer_stats_inode_flushes(int64_t *value) 74 { 75 return (dosysctl("vfs.hammer.stats_inode_flushes", value)); 76 } 77 78 int 79 libhammer_stats_disk_write(int64_t *value) 80 { 81 return (dosysctl("vfs.hammer.stats_disk_write", value)); 82 } 83 84 int 85 libhammer_stats_disk_read(int64_t *value) 86 { 87 return (dosysctl("vfs.hammer.stats_disk_read", value)); 88 } 89 90 int 91 libhammer_stats_file_iopsw(int64_t *value) 92 { 93 return (dosysctl("vfs.hammer.stats_file_iopsw", value)); 94 } 95 96 int 97 libhammer_stats_file_iopsr(int64_t *value) 98 { 99 return (dosysctl("vfs.hammer.stats_file_iopsr", value)); 100 } 101 102 int 103 libhammer_stats_file_write(int64_t *value) 104 { 105 return (dosysctl("vfs.hammer.stats_file_write", value)); 106 } 107 108 int 109 libhammer_stats_file_read(int64_t *value) 110 { 111 return (dosysctl("vfs.hammer.stats_file_read", value)); 112 } 113 114 int 115 libhammer_stats_record_iterations(int64_t *value) 116 { 117 return (dosysctl("vfs.hammer.stats_record_iterations", value)); 118 } 119 120 int 121 libhammer_stats_root_iterations(int64_t *value) 122 { 123 return (dosysctl("vfs.hammer.stats_btree_root_iterations", value)); 124 } 125 126 int 127 libhammer_stats_btree_iterations(int64_t *value) 128 { 129 return (dosysctl("vfs.hammer.stats_btree_iterations", value)); 130 } 131 132 int 133 libhammer_stats_btree_splits(int64_t *value) 134 { 135 return (dosysctl("vfs.hammer.stats_btree_splits", value)); 136 } 137 138 int 139 libhammer_stats_btree_elements(int64_t *value) 140 { 141 return (dosysctl("vfs.hammer.stats_btree_elements", value)); 142 } 143 144 int 145 libhammer_stats_btree_deletes(int64_t *value) 146 { 147 return (dosysctl("vfs.hammer.stats_btree_deletes", value)); 148 } 149 150 int 151 libhammer_stats_btree_inserts(int64_t *value) 152 { 153 return (dosysctl("vfs.hammer.stats_btree_inserts", value)); 154 } 155 156 int 157 libhammer_stats_btree_lookups(int64_t *value) 158 { 159 return (dosysctl("vfs.hammer.stats_btree_lookups", value)); 160 } 161 162 int 163 libhammer_stats_btree_searches(int64_t *value) 164 { 165 return (dosysctl("vfs.hammer.stats_btree_searches", value)); 166 } 167 168 int 169 libhammer_btree_stats(struct libhammer_btree_stats *bstats) 170 { 171 if (libhammer_stats_btree_elements(&bstats->elements) < 0) 172 return -1; 173 if (libhammer_stats_btree_iterations(&bstats->iterations) < 0) 174 return -1; 175 if (libhammer_stats_btree_splits(&bstats->splits) < 0) 176 return -1; 177 if (libhammer_stats_btree_inserts(&bstats->inserts) < 0) 178 return -1; 179 if (libhammer_stats_btree_deletes(&bstats->deletes) < 0) 180 return -1; 181 if (libhammer_stats_btree_lookups(&bstats->lookups) < 0) 182 return -1; 183 if (libhammer_stats_btree_searches(&bstats->searches) < 0) 184 return -1; 185 return 0; 186 } 187 188 int 189 libhammer_io_stats(struct libhammer_io_stats *iostats) 190 { 191 if (libhammer_stats_undo(&iostats->undo) < 0) 192 return -1; 193 if (libhammer_stats_commits(&iostats->commits) < 0) 194 return -1; 195 if (libhammer_stats_inode_flushes(&iostats->inode_flushes) < 0) 196 return -1; 197 if (libhammer_stats_disk_write(&iostats->dev_writes) < 0) 198 return -1; 199 if (libhammer_stats_disk_read(&iostats->dev_reads) < 0) 200 return -1; 201 if (libhammer_stats_file_iopsw(&iostats->file_iop_writes) < 0) 202 return -1; 203 if (libhammer_stats_file_iopsr(&iostats->file_iop_reads) < 0) 204 return -1; 205 if (libhammer_stats_file_write(&iostats->file_writes) < 0) 206 return -1; 207 if (libhammer_stats_file_read(&iostats->file_reads) < 0) 208 return -1; 209 return 0; 210 } 211