From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31488 invoked by alias); 19 Nov 2009 01:11:58 -0000 Received: (qmail 31474 invoked by uid 9699); 19 Nov 2009 01:11:58 -0000 Date: Thu, 19 Nov 2009 01:11:00 -0000 Message-ID: <20091119011158.31472.qmail@sourceware.org> From: mornfall@sourceware.org To: lvm-devel@redhat.com, lvm2-cvs@sourceware.org Subject: LVM2 tools/lvmcmdlib.c lib/mm/memlock.h lib/mm ... 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: 2009-11/txt/msg00024.txt.bz2 CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: mornfall@sourceware.org 2009-11-19 01:11:57 Modified files: tools : lvmcmdlib.c lib/mm : memlock.h memlock.c Log message: Fix another bug in memlock handling, this time the "global" dmeventd memlock was preventing device scans in lvconvert --repair running from inside dmeventd. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/lvmcmdlib.c.diff?cvsroot=lvm2&r1=1.9&r2=1.10 http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/mm/memlock.h.diff?cvsroot=lvm2&r1=1.4&r2=1.5 http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/mm/memlock.c.diff?cvsroot=lvm2&r1=1.13&r2=1.14 --- LVM2/tools/lvmcmdlib.c 2009/02/22 22:11:59 1.9 +++ LVM2/tools/lvmcmdlib.c 2009/11/19 01:11:57 1.10 @@ -82,9 +82,9 @@ /* FIXME Temporary - move to libdevmapper */ ret = ECMD_PROCESSED; if (!strcmp(cmdline, "_memlock_inc")) - memlock_inc(); + memlock_inc_daemon(); else if (!strcmp(cmdline, "_memlock_dec")) - memlock_dec(); + memlock_dec_daemon(); else ret = lvm_run_command(cmd, argc, argv); --- LVM2/lib/mm/memlock.h 2007/08/20 20:55:27 1.4 +++ LVM2/lib/mm/memlock.h 2009/11/19 01:11:57 1.5 @@ -20,6 +20,8 @@ void memlock_inc(void); void memlock_dec(void); +void memlock_inc_daemon(void); +void memlock_dec_daemon(void); int memlock(void); void memlock_init(struct cmd_context *cmd); --- LVM2/lib/mm/memlock.c 2009/11/18 18:22:32 1.13 +++ LVM2/lib/mm/memlock.c 2009/11/19 01:11:57 1.14 @@ -53,6 +53,7 @@ static void *_malloc_mem = NULL; static int _memlock_count = 0; +static int _memlock_count_daemon = 0; static int _priority; static int _default_priority; @@ -123,22 +124,61 @@ strerror(errno)); } +static void _lock_mem_if_needed(void) { + if ((_memlock_count + _memlock_count_daemon) == 1) + _lock_mem(); +} + +static void _unlock_mem_if_possible(void) { + if ((_memlock_count + _memlock_count_daemon) == 0) + _unlock_mem(); +} + void memlock_inc(void) { - if (!_memlock_count++) - _lock_mem(); + ++_memlock_count; + _lock_mem_if_needed(); log_debug("memlock_count inc to %d", _memlock_count); } void memlock_dec(void) { - if (_memlock_count && (!--_memlock_count)) - _unlock_mem(); - log_debug("memlock_count dec to %d", _memlock_count); - if (_memlock_count < 0) + if (!_memlock_count) log_error("Internal error: _memlock_count has dropped below 0."); + --_memlock_count; + _unlock_mem_if_possible(); + log_debug("memlock_count dec to %d", _memlock_count); } +/* + * The memlock_*_daemon functions will force the mlockall() call that we need + * to stay in memory, but they will have no effect on device scans (unlike + * normal memlock_inc and memlock_dec). Memory is kept locked as long as either + * of memlock or memlock_daemon is in effect. + */ + +void memlock_inc_daemon(void) +{ + ++_memlock_count_daemon; + _lock_mem_if_needed(); + log_debug("memlock_count_daemon inc to %d", _memlock_count_daemon); +} + +void memlock_dec_daemon(void) +{ + if (!_memlock_count_daemon) + log_error("Internal error: _memlock_count_daemon has dropped below 0."); + --_memlock_count_daemon; + _unlock_mem_if_possible(); + log_debug("memlock_count_daemon dec to %d", _memlock_count_daemon); +} + +/* + * This disregards the daemon (dmeventd) locks, since we use memlock() to check + * whether it is safe to run a device scan, which would normally coincide with + * !memlock() -- but the daemon global memory lock breaks this assumption, so + * we do not take those into account here. + */ int memlock(void) { return _memlock_count;