From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13683 invoked by alias); 9 Mar 2010 03:16:12 -0000 Received: (qmail 13669 invoked by uid 9447); 9 Mar 2010 03:16:12 -0000 Date: Tue, 09 Mar 2010 03:16:00 -0000 Message-ID: <20100309031612.13667.qmail@sourceware.org> From: agk@sourceware.org To: lvm-devel@redhat.com, lvm2-cvs@sourceware.org Subject: LVM2/lib commands/toolcontext.c mm/memlock.c Mailing-List: contact lvm2-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: lvm2-cvs-owner@sourceware.org X-SW-Source: 2010-03/txt/msg00022.txt.bz2 CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: agk@sourceware.org 2010-03-09 03:16:11 Modified files: lib/commands : toolcontext.c lib/mm : memlock.c Log message: Misc cleanups in the new mlock code, incl. improving some variable names & messages; using more statics (for now) to avoid redundant recalculation; validating config file just once on loading; keeping maps file open. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/commands/toolcontext.c.diff?cvsroot=lvm2&r1=1.91&r2=1.92 http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/mm/memlock.c.diff?cvsroot=lvm2&r1=1.19&r2=1.20 --- LVM2/lib/commands/toolcontext.c 2010/01/19 13:25:00 1.91 +++ LVM2/lib/commands/toolcontext.c 2010/03/09 03:16:11 1.92 @@ -201,6 +201,8 @@ mode_t old_umask; const char *read_ahead; struct stat st; + const struct config_node *cn; + struct config_value *cv; /* umask */ cmd->default_settings.umask = find_config_tree_int(cmd, @@ -303,6 +305,11 @@ "global/si_unit_consistency", DEFAULT_SI_UNIT_CONSISTENCY); + if ((cn = find_config_tree_node(cmd, "activation/mlock_filter"))) + for (cv = cn->v; cv; cv = cv->next) + if ((cv->type != CFG_STRING) || !cv->v.str[0]) + log_error("Ignoring invalid activation/mlock_filter entry in config file"); + return 1; } --- LVM2/lib/mm/memlock.c 2010/03/08 17:14:21 1.19 +++ LVM2/lib/mm/memlock.c 2010/03/09 03:16:11 1.20 @@ -75,12 +75,17 @@ typedef enum { LVM_MLOCK, LVM_MUNLOCK } lvmlock_t; +static unsigned _use_mlockall; +static FILE *_mapsh; +static char _procselfmaps[PATH_MAX] = ""; +static const char _selfmaps[] = "/self/maps"; + struct maps_stats { size_t r_size; size_t w_size; size_t x_size; }; -static struct maps_stats _ms; /* statistic for maps locking */ +static struct maps_stats _mstats; /* statistic for maps locking */ static void _touch_memory(void *mem, size_t size) { @@ -120,7 +125,7 @@ * format described in kernel/Documentation/filesystem/proc.txt */ static int _maps_line(struct cmd_context *cmd, lvmlock_t lock, - const char* line, struct maps_stats* ms) + const char* line, struct maps_stats* mstats) { const struct config_node *cn; struct config_value *cv; @@ -145,27 +150,20 @@ return 1; sz = to - from; - log_debug("%s %10ldKiB %12lx - %12lx %c%c%c%c %s", - (lock == LVM_MLOCK) ? "Mlock" : "Munlock", - ((long)sz + 1023) / 1024, from, to, fr, fw, fx, fp, line + pos); - if (!(cn = find_config_tree_node(cmd, "activation/mlock_filter"))) { /* If no blacklist configured, use an internal set */ for (i = 0; i < sizeof(_blacklist_maps) / sizeof(_blacklist_maps[0]); ++i) if (strstr(line + pos, _blacklist_maps[i])) { - log_debug("Filtered by string '%s' (%s)", + log_debug("mlock default filter '%s' matches '%s': Skipping.", _blacklist_maps[i], line); return 1; } } else { for (cv = cn->v; cv; cv = cv->next) { - if ((cv->type != CFG_STRING) || !cv->v.str[0]) { - log_error("Ignoring invalid string in config file " - "activation/mlock_filter"); + if ((cv->type != CFG_STRING) || !cv->v.str[0]) continue; - } if (strstr(line + pos, cv->v.str)) { - log_debug("Filtered by string '%s' (%s)", + log_debug("mlock_filter '%s' matches '%s': Skipping.", cv->v.str, line); return 1; } @@ -173,11 +171,15 @@ } if (fr == 'r') - ms->r_size += sz; + mstats->r_size += sz; if (fw == 'w') - ms->w_size += sz; + mstats->w_size += sz; if (fx == 'x') - ms->x_size += sz; + mstats->x_size += sz; + + log_debug("%s %10ldKiB %12lx - %12lx %c%c%c%c %s", + (lock == LVM_MLOCK) ? "mlock" : "munlock", + ((long)sz + 1023) / 1024, from, to, fr, fw, fx, fp, line + pos); if (lock == LVM_MLOCK) { if (mlock((const void*)from, sz) < 0) { @@ -194,18 +196,14 @@ return 1; } -static int _memlock_maps(struct cmd_context *cmd, lvmlock_t lock, struct maps_stats* ms) +static int _memlock_maps(struct cmd_context *cmd, lvmlock_t lock, struct maps_stats *mstats) { - static const char selfmaps[] = "/self/maps"; - char *procselfmaps = alloca(strlen(cmd->proc_dir) + sizeof(selfmaps)); - FILE *fh; char *line = NULL; size_t len; - ssize_t r; + ssize_t n; int ret = 0; - if (find_config_tree_bool(cmd, "activation/use_mlockall", - DEFAULT_USE_MLOCKALL)) { + if (_use_mlockall) { #ifdef MCL_CURRENT if (lock == LVM_MLOCK) { if (mlockall(MCL_CURRENT | MCL_FUTURE)) { @@ -224,25 +222,16 @@ #endif } - strcpy(procselfmaps, cmd->proc_dir); - strcat(procselfmaps, selfmaps); - - if ((fh = fopen(procselfmaps, "r")) == NULL) { - log_sys_error("fopen", procselfmaps); - return 0; - } - - while ((r = getline(&line, &len, fh)) != -1) { - line[r > 0 ? r - 1 : 0] = '\0'; /* remove \n */ - if (!(ret = _maps_line(cmd, lock, line, ms))) + while ((n = getline(&line, &len, _mapsh)) != -1) { + line[n > 0 ? n - 1 : 0] = '\0'; /* remove \n */ + if (!(ret = _maps_line(cmd, lock, line, mstats))) break; } free(line); - fclose(fh); - log_debug("Mapped sizes: r=%ld, w=%ld, x=%ld", - (long)ms->r_size, (long)ms->w_size, (long)ms->x_size); + log_debug("Mapped sizes: r=%ld, w=%ld, x=%ld", + (long)mstats->r_size, (long)mstats->w_size, (long)mstats->x_size); return ret; } @@ -252,9 +241,27 @@ { _allocate_memory(); - memset(&_ms, 0, sizeof(_ms)); - if (_memlock_maps(cmd, LVM_MLOCK, &_ms)) - log_very_verbose("Locking memory"); + _use_mlockall = find_config_tree_bool(cmd, "activation/use_mlockall", DEFAULT_USE_MLOCKALL); + + if (!_use_mlockall) { + /* Initialise static variables first time */ + memset(&_mstats, 0, sizeof(_mstats)); + + if (!*_procselfmaps) { + _procselfmaps[PATH_MAX - 1] = '\0'; + strncpy(_procselfmaps, cmd->proc_dir, PATH_MAX - 1); + strncat(_procselfmaps, _selfmaps, PATH_MAX - 1); + } + + if (!(_mapsh = fopen(_procselfmaps, "r"))) { + log_sys_error("fopen", _procselfmaps); + return; + } + } + + log_very_verbose("Locking memory"); + if (!_memlock_maps(cmd, LVM_MLOCK, &_mstats)) + stack; errno = 0; if (((_priority = getpriority(PRIO_PROCESS, 0)) == -1) && errno) @@ -267,15 +274,25 @@ static void _unlock_mem(struct cmd_context *cmd) { - struct maps_stats ums = { 0 }; + struct maps_stats unlock_mstats = { 0 }; + + log_very_verbose("Unlocking memory"); + + if (!_use_mlockall) + rewind(_mapsh); - if (_memlock_maps(cmd, LVM_MUNLOCK, &ums)) - log_very_verbose("Unlocking memory"); + if (!_memlock_maps(cmd, LVM_MUNLOCK, &unlock_mstats)) + stack; - if (memcmp(&_ms, &ums, sizeof(ums))) - log_error(INTERNAL_ERROR "Maps size mismatch (%ld,%ld,%ld) != (%ld,%ld,%ld)", - (long)_ms.r_size, (long)_ms.w_size, (long)_ms.x_size, - (long)ums.r_size, (long)ums.w_size, (long)ums.x_size); + if (!_use_mlockall) { + if (fclose(_mapsh)) + log_sys_error("fclose", _procselfmaps); + + if (memcmp(&_mstats, &unlock_mstats, sizeof(unlock_mstats))) + log_error(INTERNAL_ERROR "Maps size mismatch (%ld,%ld,%ld) != (%ld,%ld,%ld)", + (long)_mstats.r_size, (long)_mstats.w_size, (long)_mstats.x_size, + (long)unlock_mstats.r_size, (long)unlock_mstats.w_size, (long)unlock_mstats.x_size); + } _release_memory(); if (setpriority(PRIO_PROCESS, 0, _priority))