summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErick Reyes <erickreyes@google.com>2021-07-27 21:52:16 +0000
committerErick Reyes <erickreyes@google.com>2021-07-27 23:05:32 +0000
commitaff3f643c2514c78feea823a247fdf95ec37cbad (patch)
tree98b5c1069a62d4e0b3f8107ebbf6c54969fbc15c
parent35c35f589ab443d9bc5b468f127cd6a0113b8104 (diff)
downloadedgetpu-aff3f643c2514c78feea823a247fdf95ec37cbad.tar.gz
edgetpu: use kvmalloc for pages array
Under heavy memory pressure, allocating a physically contiguous buffer for a struct pages * array may fail. Since this array does not need to be physically contiguous, switch to kvmalloc instead. Bug: 193759145 Signed-off-by: Erick Reyes <erickreyes@google.com> Change-Id: I810019402315e7211e00f942dff5fc32687a3d25
-rw-r--r--drivers/edgetpu/edgetpu-device-group.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/edgetpu/edgetpu-device-group.c b/drivers/edgetpu/edgetpu-device-group.c
index 9e07a03..fd0c410 100644
--- a/drivers/edgetpu/edgetpu-device-group.c
+++ b/drivers/edgetpu/edgetpu-device-group.c
@@ -1159,9 +1159,12 @@ static struct page **edgetpu_pin_user_pages(struct edgetpu_device_group *group,
* "num_pages" is decided from user-space arguments, don't show warnings
* when facing malicious input.
*/
- pages = kcalloc(num_pages, sizeof(*pages), GFP_KERNEL | __GFP_NOWARN);
- if (!pages)
+ pages = kvmalloc((num_pages * sizeof(*pages)), GFP_KERNEL | __GFP_NOWARN);
+ if (!pages) {
+ etdev_dbg(etdev, "%s: kvmalloc failed (%lu bytes)\n", __func__,
+ (num_pages * sizeof(*pages)));
return ERR_PTR(-ENOMEM);
+ }
/*
* The host pages might be read-only and could fail if we attempt to pin
@@ -1202,7 +1205,7 @@ static struct page **edgetpu_pin_user_pages(struct edgetpu_device_group *group,
error:
for (i = 0; i < num_pages; i++)
unpin_user_page(pages[i]);
- kfree(pages);
+ kvfree(pages);
return ERR_PTR(ret);
}
@@ -1467,7 +1470,7 @@ int edgetpu_device_group_map(struct edgetpu_device_group *group,
mutex_unlock(&group->lock);
arg->device_address = map->device_address;
- kfree(pages);
+ kvfree(pages);
return 0;
error:
@@ -1482,7 +1485,7 @@ error:
unpin_user_page(pages[i]);
}
mutex_unlock(&group->lock);
- kfree(pages);
+ kvfree(pages);
return ret;
}