Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+19 -13
+19 -13
drivers/tee/tee_shm.c
··· 12 12 #include <linux/uio.h> 13 13 #include "tee_private.h" 14 14 15 + static void release_registered_pages(struct tee_shm *shm) 16 + { 17 + if (shm->pages) { 18 + if (shm->flags & TEE_SHM_USER_MAPPED) { 19 + unpin_user_pages(shm->pages, shm->num_pages); 20 + } else { 21 + size_t n; 22 + 23 + for (n = 0; n < shm->num_pages; n++) 24 + put_page(shm->pages[n]); 25 + } 26 + 27 + kfree(shm->pages); 28 + } 29 + } 30 + 15 31 static void tee_shm_release(struct tee_shm *shm) 16 32 { 17 33 struct tee_device *teedev = shm->ctx->teedev; ··· 48 32 49 33 poolm->ops->free(poolm, shm); 50 34 } else if (shm->flags & TEE_SHM_REGISTER) { 51 - size_t n; 52 35 int rc = teedev->desc->ops->shm_unregister(shm->ctx, shm); 53 36 54 37 if (rc) 55 38 dev_err(teedev->dev.parent, 56 39 "unregister shm %p failed: %d", shm, rc); 57 40 58 - for (n = 0; n < shm->num_pages; n++) 59 - put_page(shm->pages[n]); 60 - 61 - kfree(shm->pages); 41 + release_registered_pages(shm); 62 42 } 63 43 64 44 teedev_ctx_put(shm->ctx); ··· 240 228 } 241 229 242 230 if (flags & TEE_SHM_USER_MAPPED) { 243 - rc = get_user_pages_fast(start, num_pages, FOLL_WRITE, 231 + rc = pin_user_pages_fast(start, num_pages, FOLL_WRITE, 244 232 shm->pages); 245 233 } else { 246 234 struct kvec *kiov; ··· 304 292 return shm; 305 293 err: 306 294 if (shm) { 307 - size_t n; 308 - 309 295 if (shm->id >= 0) { 310 296 mutex_lock(&teedev->mutex); 311 297 idr_remove(&teedev->idr, shm->id); 312 298 mutex_unlock(&teedev->mutex); 313 299 } 314 - if (shm->pages) { 315 - for (n = 0; n < shm->num_pages; n++) 316 - put_page(shm->pages[n]); 317 - kfree(shm->pages); 318 - } 300 + release_registered_pages(shm); 319 301 } 320 302 kfree(shm); 321 303 teedev_ctx_put(ctx);