Converts tee subsystem to use pin_user_pages() instead of get_user_pages()
-----BEGIN PGP SIGNATURE----- iQJOBAABCgA4FiEEFV+gSSXZJY9ZyuB5LinzTIcAHJcFAl9E09QaHGplbnMud2lr bGFuZGVyQGxpbmFyby5vcmcACgkQLinzTIcAHJdlFhAAkz1UuhSN4/vkPuAO7zXD e1T+Z/3jioZOIHUH82ZB6QYTHtO4S1zjY516RXOQA3F+Lot1ikUQArHgITD4nbmN YtAY+hnlMcsHJLeLu55MNCZXVLHdT/kG0oDQfmt9l9xzXYVxl14sZcLL5Q96E++Z reb4oxwdrr4Fecz8WJUdAPfPlvl91s/tLLizmTwHI6Ex0Lgin5Db+PxkiQmv3tKB 2ByvE85ZoMh7OWHB6X0edRAqTVTHGGUZfIH7eGWuXBJqFvRMODEFc4j1VvVD0CSA XTag12PJWqFOGUrGQ8t/YD/3kQpahq3fNET4QL6K/LWejHnolankCpd9ZsV+GhKU FeLdreZzpeWMzIM42MTBbLnfoJBOi7ik5ExexXQ+t3GRGl0uBqq4dyJv6pQDcKzD rbLemh0F4myYbHenVNkzTBl9km0Jo+Ts10eqyupRKMB4ZLRs9qTzqZPYhAsoenFc PQdyrQcSx88WogqoHm1Lr9qf2ssTV8j968859t2U0XbAodo9YBWofIt3bp5y4cSY RRQZLwTu2nU5+Go3XhYcyCJbHdcDP+PWZ/dA8fkiBKVQKvfUqqeSivbQ7Anuvift 9hC3tJ419Hn04/ze9A7D8CFs8afueMinyx1rhx1y1QQN88jW7KlrTeFdyoMgsKct QVqGObdEREvgwJpJqlIfTRk= =MyeM -----END PGP SIGNATURE----- Merge tag 'tee-pin-user-pages-for-5.10' of git://git.linaro.org/people/jens.wiklander/linux-tee into arm/drivers Converts tee subsystem to use pin_user_pages() instead of get_user_pages() * tag 'tee-pin-user-pages-for-5.10' of git://git.linaro.org/people/jens.wiklander/linux-tee: tee: convert get_user_pages() --> pin_user_pages() Link: https://lore.kernel.org/r/20200825090715.GA2370775@jade Signed-off-by: Olof Johansson <olof@lixom.net>
This commit is contained in:
commit
aa10e3cfdb
@ -12,6 +12,22 @@
|
||||
#include <linux/uio.h>
|
||||
#include "tee_private.h"
|
||||
|
||||
static void release_registered_pages(struct tee_shm *shm)
|
||||
{
|
||||
if (shm->pages) {
|
||||
if (shm->flags & TEE_SHM_USER_MAPPED) {
|
||||
unpin_user_pages(shm->pages, shm->num_pages);
|
||||
} else {
|
||||
size_t n;
|
||||
|
||||
for (n = 0; n < shm->num_pages; n++)
|
||||
put_page(shm->pages[n]);
|
||||
}
|
||||
|
||||
kfree(shm->pages);
|
||||
}
|
||||
}
|
||||
|
||||
static void tee_shm_release(struct tee_shm *shm)
|
||||
{
|
||||
struct tee_device *teedev = shm->ctx->teedev;
|
||||
@ -32,17 +48,13 @@ static void tee_shm_release(struct tee_shm *shm)
|
||||
|
||||
poolm->ops->free(poolm, shm);
|
||||
} else if (shm->flags & TEE_SHM_REGISTER) {
|
||||
size_t n;
|
||||
int rc = teedev->desc->ops->shm_unregister(shm->ctx, shm);
|
||||
|
||||
if (rc)
|
||||
dev_err(teedev->dev.parent,
|
||||
"unregister shm %p failed: %d", shm, rc);
|
||||
|
||||
for (n = 0; n < shm->num_pages; n++)
|
||||
put_page(shm->pages[n]);
|
||||
|
||||
kfree(shm->pages);
|
||||
release_registered_pages(shm);
|
||||
}
|
||||
|
||||
teedev_ctx_put(shm->ctx);
|
||||
@ -228,7 +240,7 @@ struct tee_shm *tee_shm_register(struct tee_context *ctx, unsigned long addr,
|
||||
}
|
||||
|
||||
if (flags & TEE_SHM_USER_MAPPED) {
|
||||
rc = get_user_pages_fast(start, num_pages, FOLL_WRITE,
|
||||
rc = pin_user_pages_fast(start, num_pages, FOLL_WRITE,
|
||||
shm->pages);
|
||||
} else {
|
||||
struct kvec *kiov;
|
||||
@ -292,18 +304,12 @@ struct tee_shm *tee_shm_register(struct tee_context *ctx, unsigned long addr,
|
||||
return shm;
|
||||
err:
|
||||
if (shm) {
|
||||
size_t n;
|
||||
|
||||
if (shm->id >= 0) {
|
||||
mutex_lock(&teedev->mutex);
|
||||
idr_remove(&teedev->idr, shm->id);
|
||||
mutex_unlock(&teedev->mutex);
|
||||
}
|
||||
if (shm->pages) {
|
||||
for (n = 0; n < shm->num_pages; n++)
|
||||
put_page(shm->pages[n]);
|
||||
kfree(shm->pages);
|
||||
}
|
||||
release_registered_pages(shm);
|
||||
}
|
||||
kfree(shm);
|
||||
teedev_ctx_put(ctx);
|
||||
|
Loading…
Reference in New Issue
Block a user