diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-06-08 16:16:05 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-06-08 16:16:05 -0400 |
| commit | 8e61f6f7c308a828f8402db6651f6e38ba66c009 (patch) | |
| tree | 5bbbc54efc0c8cb65fe5d88e797bb7b3d83a943a | |
| parent | 3d4645bf7a76886c70a482a1c6742bac98553f47 (diff) | |
| parent | 1d5c76e66433382a1e170d1d5845bb0fed7467aa (diff) | |
Merge tag 'for-linus-5.2b-rc4-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip
Pull xen fix from Juergen Gross:
"Just one fix for the Xen block frontend driver avoiding allocations
with order > 0"
* tag 'for-linus-5.2b-rc4-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip:
xen-blkfront: switch kcalloc to kvcalloc for large array allocation
| -rw-r--r-- | drivers/block/xen-blkfront.c | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index d43a5677ccbc..a74d03913822 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c | |||
| @@ -1310,11 +1310,11 @@ static void blkif_free_ring(struct blkfront_ring_info *rinfo) | |||
| 1310 | } | 1310 | } |
| 1311 | 1311 | ||
| 1312 | free_shadow: | 1312 | free_shadow: |
| 1313 | kfree(rinfo->shadow[i].grants_used); | 1313 | kvfree(rinfo->shadow[i].grants_used); |
| 1314 | rinfo->shadow[i].grants_used = NULL; | 1314 | rinfo->shadow[i].grants_used = NULL; |
| 1315 | kfree(rinfo->shadow[i].indirect_grants); | 1315 | kvfree(rinfo->shadow[i].indirect_grants); |
| 1316 | rinfo->shadow[i].indirect_grants = NULL; | 1316 | rinfo->shadow[i].indirect_grants = NULL; |
| 1317 | kfree(rinfo->shadow[i].sg); | 1317 | kvfree(rinfo->shadow[i].sg); |
| 1318 | rinfo->shadow[i].sg = NULL; | 1318 | rinfo->shadow[i].sg = NULL; |
| 1319 | } | 1319 | } |
| 1320 | 1320 | ||
| @@ -1353,7 +1353,7 @@ static void blkif_free(struct blkfront_info *info, int suspend) | |||
| 1353 | for (i = 0; i < info->nr_rings; i++) | 1353 | for (i = 0; i < info->nr_rings; i++) |
| 1354 | blkif_free_ring(&info->rinfo[i]); | 1354 | blkif_free_ring(&info->rinfo[i]); |
| 1355 | 1355 | ||
| 1356 | kfree(info->rinfo); | 1356 | kvfree(info->rinfo); |
| 1357 | info->rinfo = NULL; | 1357 | info->rinfo = NULL; |
| 1358 | info->nr_rings = 0; | 1358 | info->nr_rings = 0; |
| 1359 | } | 1359 | } |
| @@ -1914,9 +1914,9 @@ static int negotiate_mq(struct blkfront_info *info) | |||
| 1914 | if (!info->nr_rings) | 1914 | if (!info->nr_rings) |
| 1915 | info->nr_rings = 1; | 1915 | info->nr_rings = 1; |
| 1916 | 1916 | ||
| 1917 | info->rinfo = kcalloc(info->nr_rings, | 1917 | info->rinfo = kvcalloc(info->nr_rings, |
| 1918 | sizeof(struct blkfront_ring_info), | 1918 | sizeof(struct blkfront_ring_info), |
| 1919 | GFP_KERNEL); | 1919 | GFP_KERNEL); |
| 1920 | if (!info->rinfo) { | 1920 | if (!info->rinfo) { |
| 1921 | xenbus_dev_fatal(info->xbdev, -ENOMEM, "allocating ring_info structure"); | 1921 | xenbus_dev_fatal(info->xbdev, -ENOMEM, "allocating ring_info structure"); |
| 1922 | info->nr_rings = 0; | 1922 | info->nr_rings = 0; |
| @@ -2232,17 +2232,17 @@ static int blkfront_setup_indirect(struct blkfront_ring_info *rinfo) | |||
| 2232 | 2232 | ||
| 2233 | for (i = 0; i < BLK_RING_SIZE(info); i++) { | 2233 | for (i = 0; i < BLK_RING_SIZE(info); i++) { |
| 2234 | rinfo->shadow[i].grants_used = | 2234 | rinfo->shadow[i].grants_used = |
| 2235 | kcalloc(grants, | 2235 | kvcalloc(grants, |
| 2236 | sizeof(rinfo->shadow[i].grants_used[0]), | 2236 | sizeof(rinfo->shadow[i].grants_used[0]), |
| 2237 | GFP_NOIO); | 2237 | GFP_NOIO); |
| 2238 | rinfo->shadow[i].sg = kcalloc(psegs, | 2238 | rinfo->shadow[i].sg = kvcalloc(psegs, |
| 2239 | sizeof(rinfo->shadow[i].sg[0]), | 2239 | sizeof(rinfo->shadow[i].sg[0]), |
| 2240 | GFP_NOIO); | 2240 | GFP_NOIO); |
| 2241 | if (info->max_indirect_segments) | 2241 | if (info->max_indirect_segments) |
| 2242 | rinfo->shadow[i].indirect_grants = | 2242 | rinfo->shadow[i].indirect_grants = |
| 2243 | kcalloc(INDIRECT_GREFS(grants), | 2243 | kvcalloc(INDIRECT_GREFS(grants), |
| 2244 | sizeof(rinfo->shadow[i].indirect_grants[0]), | 2244 | sizeof(rinfo->shadow[i].indirect_grants[0]), |
| 2245 | GFP_NOIO); | 2245 | GFP_NOIO); |
| 2246 | if ((rinfo->shadow[i].grants_used == NULL) || | 2246 | if ((rinfo->shadow[i].grants_used == NULL) || |
| 2247 | (rinfo->shadow[i].sg == NULL) || | 2247 | (rinfo->shadow[i].sg == NULL) || |
| 2248 | (info->max_indirect_segments && | 2248 | (info->max_indirect_segments && |
| @@ -2256,11 +2256,11 @@ static int blkfront_setup_indirect(struct blkfront_ring_info *rinfo) | |||
| 2256 | 2256 | ||
| 2257 | out_of_memory: | 2257 | out_of_memory: |
| 2258 | for (i = 0; i < BLK_RING_SIZE(info); i++) { | 2258 | for (i = 0; i < BLK_RING_SIZE(info); i++) { |
| 2259 | kfree(rinfo->shadow[i].grants_used); | 2259 | kvfree(rinfo->shadow[i].grants_used); |
| 2260 | rinfo->shadow[i].grants_used = NULL; | 2260 | rinfo->shadow[i].grants_used = NULL; |
| 2261 | kfree(rinfo->shadow[i].sg); | 2261 | kvfree(rinfo->shadow[i].sg); |
| 2262 | rinfo->shadow[i].sg = NULL; | 2262 | rinfo->shadow[i].sg = NULL; |
| 2263 | kfree(rinfo->shadow[i].indirect_grants); | 2263 | kvfree(rinfo->shadow[i].indirect_grants); |
| 2264 | rinfo->shadow[i].indirect_grants = NULL; | 2264 | rinfo->shadow[i].indirect_grants = NULL; |
| 2265 | } | 2265 | } |
| 2266 | if (!list_empty(&rinfo->indirect_pages)) { | 2266 | if (!list_empty(&rinfo->indirect_pages)) { |
