diff options
author | Erick Reyes <erickreyes@google.com> | 2021-07-27 21:52:16 +0000 |
---|---|---|
committer | Erick Reyes <erickreyes@google.com> | 2021-07-27 23:05:32 +0000 |
commit | aff3f643c2514c78feea823a247fdf95ec37cbad (patch) | |
tree | 98b5c1069a62d4e0b3f8107ebbf6c54969fbc15c /drivers | |
parent | 35c35f589ab443d9bc5b468f127cd6a0113b8104 (diff) | |
download | abrolhos-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
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/edgetpu/edgetpu-device-group.c | 13 |
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; } |