diff options
-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; } |