From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=57119 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Q4dfK-0007Ya-Ai for qemu-devel@nongnu.org; Tue, 29 Mar 2011 14:29:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Q4dfC-0003kf-CT for qemu-devel@nongnu.org; Tue, 29 Mar 2011 14:29:11 -0400 Received: from smtp02.citrix.com ([66.165.176.63]:7014) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Q4dfC-0003gw-6Z for qemu-devel@nongnu.org; Tue, 29 Mar 2011 14:29:10 -0400 From: anthony.perard@citrix.com Date: Tue, 29 Mar 2011 19:28:03 +0100 Message-Id: <1301423290-12443-11-git-send-email-anthony.perard@citrix.com> In-Reply-To: <1301423290-12443-1-git-send-email-anthony.perard@citrix.com> References: <1301423290-12443-1-git-send-email-anthony.perard@citrix.com> Subject: [Qemu-devel] [PATCH V12 10/17] xen: Adds a cap to the number of map cache entries. List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: QEMU-devel , Anthony Liguori , Alexander Graf Cc: Anthony PERARD , John Baboval , Xen Devel , Stefano Stabellini From: John Baboval Adds a cap to the number of map cache entries. This prevents the map cache from overwhelming system memory. I also removed the bitmap macros and #included bitmap.h instead. Signed-off-By: John Baboval Signed-off-by: Anthony PERARD --- xen-mapcache.c | 21 ++++++++++----------- 1 files changed, 10 insertions(+), 11 deletions(-) diff --git a/xen-mapcache.c b/xen-mapcache.c index d7f44a7..eab97bc 100644 --- a/xen-mapcache.c +++ b/xen-mapcache.c @@ -12,6 +12,7 @@ #include "hw/xen_backend.h" #include "blockdev.h" +#include "bitmap.h" #include #include @@ -31,15 +32,13 @@ #if defined(__i386__) # define MCACHE_BUCKET_SHIFT 16 +# define MCACHE_MAX_SIZE (1UL<<31) /* 2GB Cap */ #elif defined(__x86_64__) # define MCACHE_BUCKET_SHIFT 20 +# define MCACHE_MAX_SIZE (1UL<<35) /* 32GB Cap */ #endif #define MCACHE_BUCKET_SIZE (1UL << MCACHE_BUCKET_SHIFT) -#define BITS_PER_LONG (sizeof(long) * 8) -#define BITS_TO_LONGS(bits) (((bits) + BITS_PER_LONG - 1) / BITS_PER_LONG) -#define DECLARE_BITMAP(name, bits) unsigned long name[BITS_TO_LONGS(bits)] - typedef struct MapCacheEntry { target_phys_addr_t paddr_index; uint8_t *vaddr_base; @@ -68,11 +67,6 @@ typedef struct MapCache { static MapCache *mapcache; -static inline int test_bit(unsigned int bit, const unsigned long *map) -{ - return !!((map)[(bit) / BITS_PER_LONG] & (1UL << ((bit) % BITS_PER_LONG))); -} - void qemu_map_cache_init(void) { unsigned long size; @@ -84,9 +78,14 @@ void qemu_map_cache_init(void) mapcache->last_address_index = -1; getrlimit(RLIMIT_AS, &rlimit_as); - rlimit_as.rlim_cur = rlimit_as.rlim_max; + if (rlimit_as.rlim_max < MCACHE_MAX_SIZE) { + rlimit_as.rlim_cur = rlimit_as.rlim_max; + } else { + rlimit_as.rlim_cur = MCACHE_MAX_SIZE; + } + setrlimit(RLIMIT_AS, &rlimit_as); - mapcache->max_mcache_size = rlimit_as.rlim_max; + mapcache->max_mcache_size = rlimit_as.rlim_cur; mapcache->nr_buckets = (((mapcache->max_mcache_size >> XC_PAGE_SHIFT) + -- 1.7.2.3