mirror of
https://git.yoctoproject.org/meta-ti
synced 2026-07-26 22:07:51 +00:00
9bc77dff5f
Regenerate all beaglebone patches and add one vfs tracer patch for powertop Signed-off-by: Koen Kooi <koen@dominion.thruhere.net> Signed-off-by: Denys Dmytriyenko <denys@ti.com>
96 lines
2.8 KiB
Diff
96 lines
2.8 KiB
Diff
From d93e7e98bbff07495ac95fd10c02c2e0d5392079 Mon Sep 17 00:00:00 2001
|
|
From: Mike Snitzer <snitzer@redhat.com>
|
|
Date: Tue, 3 Jul 2012 12:55:37 +0100
|
|
Subject: [PATCH 21/49] dm persistent data: fix allocation failure in space
|
|
map checker init
|
|
|
|
commit b0239faaf87c38bb419c9264bf20817438ddc3a9 upstream.
|
|
|
|
If CONFIG_DM_DEBUG_SPACE_MAPS is enabled and memory is fragmented and a
|
|
sufficiently-large metadata device is used in a thin pool then the space
|
|
map checker will fail to allocate the memory it requires.
|
|
|
|
Switch from kmalloc to vmalloc to allow larger virtually contiguous
|
|
allocations for the space map checker's internal count arrays.
|
|
|
|
Reported-by: Vivek Goyal <vgoyal@redhat.com>
|
|
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
|
|
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
|
|
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
|
---
|
|
drivers/md/persistent-data/dm-space-map-checker.c | 30 +++++++++++++--------
|
|
1 file changed, 19 insertions(+), 11 deletions(-)
|
|
|
|
diff --git a/drivers/md/persistent-data/dm-space-map-checker.c b/drivers/md/persistent-data/dm-space-map-checker.c
|
|
index 6d7c832..fc90c11 100644
|
|
--- a/drivers/md/persistent-data/dm-space-map-checker.c
|
|
+++ b/drivers/md/persistent-data/dm-space-map-checker.c
|
|
@@ -8,6 +8,7 @@
|
|
|
|
#include <linux/device-mapper.h>
|
|
#include <linux/export.h>
|
|
+#include <linux/vmalloc.h>
|
|
|
|
#ifdef CONFIG_DM_DEBUG_SPACE_MAPS
|
|
|
|
@@ -89,13 +90,23 @@ static int ca_create(struct count_array *ca, struct dm_space_map *sm)
|
|
|
|
ca->nr = nr_blocks;
|
|
ca->nr_free = nr_blocks;
|
|
- ca->counts = kzalloc(sizeof(*ca->counts) * nr_blocks, GFP_KERNEL);
|
|
- if (!ca->counts)
|
|
- return -ENOMEM;
|
|
+
|
|
+ if (!nr_blocks)
|
|
+ ca->counts = NULL;
|
|
+ else {
|
|
+ ca->counts = vzalloc(sizeof(*ca->counts) * nr_blocks);
|
|
+ if (!ca->counts)
|
|
+ return -ENOMEM;
|
|
+ }
|
|
|
|
return 0;
|
|
}
|
|
|
|
+static void ca_destroy(struct count_array *ca)
|
|
+{
|
|
+ vfree(ca->counts);
|
|
+}
|
|
+
|
|
static int ca_load(struct count_array *ca, struct dm_space_map *sm)
|
|
{
|
|
int r;
|
|
@@ -126,12 +137,14 @@ static int ca_load(struct count_array *ca, struct dm_space_map *sm)
|
|
static int ca_extend(struct count_array *ca, dm_block_t extra_blocks)
|
|
{
|
|
dm_block_t nr_blocks = ca->nr + extra_blocks;
|
|
- uint32_t *counts = kzalloc(sizeof(*counts) * nr_blocks, GFP_KERNEL);
|
|
+ uint32_t *counts = vzalloc(sizeof(*counts) * nr_blocks);
|
|
if (!counts)
|
|
return -ENOMEM;
|
|
|
|
- memcpy(counts, ca->counts, sizeof(*counts) * ca->nr);
|
|
- kfree(ca->counts);
|
|
+ if (ca->counts) {
|
|
+ memcpy(counts, ca->counts, sizeof(*counts) * ca->nr);
|
|
+ ca_destroy(ca);
|
|
+ }
|
|
ca->nr = nr_blocks;
|
|
ca->nr_free += extra_blocks;
|
|
ca->counts = counts;
|
|
@@ -151,11 +164,6 @@ static int ca_commit(struct count_array *old, struct count_array *new)
|
|
return 0;
|
|
}
|
|
|
|
-static void ca_destroy(struct count_array *ca)
|
|
-{
|
|
- kfree(ca->counts);
|
|
-}
|
|
-
|
|
/*----------------------------------------------------------------*/
|
|
|
|
struct sm_checker {
|
|
--
|
|
1.7.10
|
|
|