]> sourceware.org Git - lvm2.git/commitdiff
Directly allocate buffer memory in a pvck scan instead of using a mempool.
authorPeter Rajnoha <prajnoha@redhat.com>
Mon, 29 Aug 2011 13:37:36 +0000 (13:37 +0000)
committerPeter Rajnoha <prajnoha@redhat.com>
Mon, 29 Aug 2011 13:37:36 +0000 (13:37 +0000)
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.

WHATS_NEW
lib/format_text/format-text.c

index 98ee74fa3c11c09ad303f412be6517b3a274abcd..b3f579a55eb524b30fd2e3b6ee3cf416ac47725d 100644 (file)
--- 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).
 
index 4a025b2279219f55352bcd5b6597455c195029f5..513ac96a1e852e885e3b5deae87f23fb13876136 100644 (file)
@@ -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;
This page took 0.043162 seconds and 5 git commands to generate.