summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Rajnoha <prajnoha@redhat.com>2011-08-29 13:37:36 +0000
committerPeter Rajnoha <prajnoha@redhat.com>2011-08-29 13:37:36 +0000
commitd35188058be01bd29128dcf1f5b79220fbcb135b (patch)
tree3266486483756631c78900afb86efa12c1e18556
parent11bfaa1df8a1cae26a891c128f9bbaf8116c9453 (diff)
downloadlvm2-d35188058be01bd29128dcf1f5b79220fbcb135b.tar.gz
lvm2-d35188058be01bd29128dcf1f5b79220fbcb135b.tar.xz
lvm2-d35188058be01bd29128dcf1f5b79220fbcb135b.zip
Directly allocate buffer memory in a pvck scan instead of using a mempool.
There's a very high memory usage when calling _pv_analyse_mda_raw (e.g. while executing pvck) that can end up with "out of memory". _pv_analyse_mda_raw scans for metadata in the MDA, iteratively increasing the size to scan with SECTOR_SIZE until we find a probable config section or we're at the edge of the metadata area. However, when using a memory pool, we're also iteratively chasing for bigger and bigger mempool chunk which can't be found and so we're always allocating a new one, consuming more and more memory... This patch just changes the mempool to direct memory allocation in this problematic part of the code.
-rw-r--r--WHATS_NEW1
-rw-r--r--lib/format_text/format-text.c6
2 files changed, 4 insertions, 3 deletions
diff --git a/WHATS_NEW b/WHATS_NEW
index 98ee74fa..b3f579a5 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.89 -
==================================
+ Directly allocate buffer memory in a pvck scan instead of using a mempool.
Add configure --with-thin for (unimplemented) segtypes "thin" and "thin_pool".
Fix raid shared lib segtype registration (2.02.87).
diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c
index 4a025b22..513ac96a 100644
--- a/lib/format_text/format-text.c
+++ b/lib/format_text/format-text.c
@@ -226,7 +226,7 @@ static int _pv_analyze_mda_raw (const struct format_type * fmt,
* "maybe_config_section" returning true when there's no valid
* metadata in a sector (sectors with all nulls).
*/
- if (!(buf = dm_pool_alloc(fmt->cmd->mem, size + size2)))
+ if (!(buf = dm_malloc(size + size2)))
goto_out;
if (!dev_read_circular(area->dev, offset, size,
@@ -261,14 +261,14 @@ static int _pv_analyze_mda_raw (const struct format_type * fmt,
size += SECTOR_SIZE;
}
}
- dm_pool_free(fmt->cmd->mem, buf);
+ dm_free(buf);
buf = NULL;
}
r = 1;
out:
if (buf)
- dm_pool_free(fmt->cmd->mem, buf);
+ dm_free(buf);
if (!dev_close(area->dev))
stack;
return r;