On Mon, 16 Jun 2014 21:28:55 +0900 (JST) YASUOKA Masahiko <yasu...@yasuoka.net> wrote: > Followings are our kernel variables' default: > > - sb_max: 256K > - tcbhash_size: 128 > - udbhash_size: 128 > > These variables are sometime too small for busy server or gateway. > > I'd like to modify config(8) to customize these variables without > recompiling the kernel. > > Comment or ok?
Let me update the diff. Previous diff has some typos. Index: usr.sbin/config/cmd.c =================================================================== RCS file: /disk/cvs/openbsd/src/usr.sbin/config/cmd.c,v retrieving revision 1.20 diff -u -p -r1.20 cmd.c --- usr.sbin/config/cmd.c 23 Nov 2013 17:38:15 -0000 1.20 +++ usr.sbin/config/cmd.c 16 Jun 2014 12:25:59 -0000 @@ -24,7 +24,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include <sys/types.h> +#include <sys/param.h> #include <sys/device.h> #include <sys/time.h> @@ -61,6 +61,11 @@ cmd_table_t cmd_table[] = { {"bufcachepercent", Xbufcachepct, "[number]", "Show/change BUFCACHEPERCENT"}, {"nkmempg", Xnkmempg, "[number]", "Show/change NKMEMPAGES"}, + {"sb_max", Xsb_max, "[number]", "Show/change sb_max"}, + {"udbhashsize", Xudbhashsize, "[number]", + "Show/change udbhashsize"}, + {"tcbhashsize", Xtcbhashsize, "[number]", + "Show/change tcbhashsize"}, {NULL, NULL, NULL, NULL} }; @@ -313,5 +318,58 @@ int Xnkmempg(cmd_t *cmd) { int_variable_adjust(cmd, I_NKMEMPG, "nkmempages"); + return (CMD_CONT); +} + +int +Xsb_max(cmd_t *cmd) +{ + int_variable_adjust(cmd, I_SB_MAX, "sb_max"); + return (CMD_CONT); +} + +void +pow2_variable_adjust(const cmd_t *cmd, int idx, const char *name) +{ + int i, *v, num; + + if (nl[idx].n_type != 0) { + ukc_mod_kernel = 1; + + v = (int *)adjust((caddr_t)(nl[idx].n_value)); + + if (strlen(cmd->args) == 0) { + printf("%s = %d\n", name, *v); + } else { + if (number(cmd->args, &num) == 0) { + if (!powerof2(num)) { + for (i = 0; num; num = num >> 1) + i++; + num = 1 << i; + printf("Warning: number must be " + "power of 2. Rounded up to %d\n", + num); + } + *v = num; + printf("%s = %d\n", name, num); + } else + printf("Unknown argument\n"); + } + } else + printf("This kernel does not support modification of %s.\n", + name); +} + +int +Xudbhashsize(cmd_t *cmd) +{ + pow2_variable_adjust(cmd, I_UDBHASHSIZE, "udbhashsize"); + return (CMD_CONT); +} + +int +Xtcbhashsize(cmd_t *cmd) +{ + pow2_variable_adjust(cmd, I_TCBHASHSIZE, "tcbhashsize"); return (CMD_CONT); } Index: usr.sbin/config/cmd.h =================================================================== RCS file: /disk/cvs/openbsd/src/usr.sbin/config/cmd.h,v retrieving revision 1.7 diff -u -p -r1.7 cmd.h --- usr.sbin/config/cmd.h 3 Jun 2003 00:52:35 -0000 1.7 +++ usr.sbin/config/cmd.h 16 Jun 2014 11:58:37 -0000 @@ -72,6 +72,9 @@ int Xbufcachepct(cmd_t *); int Xnkmempg(cmd_t *); int Xshmseg(cmd_t *); int Xshmmaxpgs(cmd_t *); +int Xsb_max(cmd_t *); +int Xudbhashsize(cmd_t *); +int Xtcbhashsize(cmd_t *); #endif /* _CMD_H */ Index: usr.sbin/config/config.8 =================================================================== RCS file: /disk/cvs/openbsd/src/usr.sbin/config/config.8,v retrieving revision 1.60 diff -u -p -r1.60 config.8 --- usr.sbin/config/config.8 20 Jan 2014 01:11:49 -0000 1.60 +++ usr.sbin/config/config.8 16 Jun 2014 12:41:49 -0000 @@ -321,6 +321,21 @@ is the number of minutes west of GMT and .Va dst is non-zero if Daylight Saving Time is in effect. Without arguments, displays its current value. +.It Ic sb_max Op Ar number +Change the sb_max value. +Without arguments, displays its current value. +.It Ic tcbhashsize Op Ar number +Change the tcbhashsize value. +Without arguments, displays its current value. +The +.Ar number +should be power of 2, otherwise it will be rounded up forcibly. +.It Ic udbhashsize Op Ar number +Change the udbhashsize value. +Without arguments, displays its current value. +The +.Ar number +should be power of 2, otherwise it will be rounded up forcibly. .El .Sh EXAMPLES (kernel building) Note: Index: usr.sbin/config/ukc.h =================================================================== RCS file: /disk/cvs/openbsd/src/usr.sbin/config/ukc.h,v retrieving revision 1.12 diff -u -p -r1.12 ukc.h --- usr.sbin/config/ukc.h 10 Dec 2009 22:07:19 -0000 1.12 +++ usr.sbin/config/ukc.h 16 Jun 2014 12:42:37 -0000 @@ -48,7 +48,10 @@ #define I_NMBCLUSTERS 18 #define I_BUFCACHEPCT 19 #define I_NKMEMPG 20 -#define NLENTRIES 21 +#define I_SB_MAX 21 +#define I_UDBHASHSIZE 22 +#define I_TCBHASHSIZE 23 +#define NLENTRIES 24 #ifdef UKC_MAIN struct nlist nl[] = { @@ -73,6 +76,9 @@ struct nlist nl[] = { { "_nmbclust" }, { "_bufcachepercent" }, { "_nkmempages" }, + { "_sb_max" }, + { "_udbhashsize" }, + { "_tcbhashsize" }, { NULL }, }; struct nlist knl[] = { @@ -97,6 +103,9 @@ struct nlist knl[] = { { "_nmbclust" }, { "_bufcachepercent" }, { "_nkmempages" }, + { "_sb_max" }, + { "_udbhashsize" }, + { "_tcbhashsize" }, { NULL }, }; int maxdev = 0;