* [PATCH v2] tee: convert convert get_user_pages() --> pin_user_pages() [not found] <CAHUa44FrxidzSUOM_JchOTa5pF6P+j8uZJA5DpKfGLWaS6tCcw@mail.gmail.com> @ 2020-08-24 18:36 ` John Hubbard 2020-08-24 18:42 ` John Hubbard 2020-08-24 21:11 ` [PATCH v3] " John Hubbard 1 sibling, 1 reply; 6+ messages in thread From: John Hubbard @ 2020-08-24 18:36 UTC (permalink / raw) To: jens.wiklander Cc: arm, jhubbard, linux-arm-kernel, linux-kernel, olof, soc, tee-dev, Sumit Semwal, linux-media, dri-devel, linaro-mm-sig This code was using get_user_pages*(), in a "Case 2" scenario (DMA/RDMA), using the categorization from [1]. That means that it's time to convert the get_user_pages*() + put_page() calls to pin_user_pages*() + unpin_user_pages() calls. There is some helpful background in [2]: basically, this is a small part of fixing a long-standing disconnect between pinning pages, and file systems' use of those pages. [1] Documentation/core-api/pin_user_pages.rst [2] "Explicit pinning of user-space pages": https://lwn.net/Articles/807108/ Cc: Jens Wiklander <jens.wiklander@linaro.org> Cc: Sumit Semwal <sumit.semwal@linaro.org> Cc: tee-dev@lists.linaro.org Cc: linux-media@vger.kernel.org Cc: dri-devel@lists.freedesktop.org Cc: linaro-mm-sig@lists.linaro.org Signed-off-by: John Hubbard <jhubbard@nvidia.com> --- OK, this should be indentical to v1 [1], but now rebased against Linux 5.9-rc2. As before, I've compile-tested it again with a cross compiler, but that's the only testing I'm set up for with CONFIG_TEE. [1] https://lore.kernel.org/r/20200519051850.2845561-1-jhubbard@nvidia.com thanks, John Hubbard NVIDIA drivers/tee/tee_shm.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c index 827ac3d0fea9..3c29e6c3ebe8 100644 --- a/drivers/tee/tee_shm.c +++ b/drivers/tee/tee_shm.c @@ -32,16 +32,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]); - + unpin_user_pages(shm->pages, shm->num_pages); kfree(shm->pages); } @@ -228,7 +225,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,16 +289,13 @@ 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]); + unpin_user_pages(shm->pages, shm->num_pages); kfree(shm->pages); } } -- 2.28.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2] tee: convert convert get_user_pages() --> pin_user_pages() 2020-08-24 18:36 ` [PATCH v2] tee: convert convert get_user_pages() --> pin_user_pages() John Hubbard @ 2020-08-24 18:42 ` John Hubbard 0 siblings, 0 replies; 6+ messages in thread From: John Hubbard @ 2020-08-24 18:42 UTC (permalink / raw) To: jens.wiklander Cc: arm, linux-arm-kernel, linux-kernel, olof, soc, tee-dev, Sumit Semwal, linux-media, dri-devel, linaro-mm-sig On 8/24/20 11:36 AM, John Hubbard wrote: > This code was using get_user_pages*(), in a "Case 2" scenario > (DMA/RDMA), using the categorization from [1]. That means that it's > time to convert the get_user_pages*() + put_page() calls to > pin_user_pages*() + unpin_user_pages() calls. > > There is some helpful background in [2]: basically, this is a small > part of fixing a long-standing disconnect between pinning pages, and > file systems' use of those pages. > > [1] Documentation/core-api/pin_user_pages.rst > > [2] "Explicit pinning of user-space pages": > https://lwn.net/Articles/807108/ > > Cc: Jens Wiklander <jens.wiklander@linaro.org> > Cc: Sumit Semwal <sumit.semwal@linaro.org> > Cc: tee-dev@lists.linaro.org > Cc: linux-media@vger.kernel.org > Cc: dri-devel@lists.freedesktop.org > Cc: linaro-mm-sig@lists.linaro.org > Signed-off-by: John Hubbard <jhubbard@nvidia.com> > --- > > OK, this should be indentical to v1 [1], but now rebased against > Linux 5.9-rc2. > ...ohhh, wait, I should have read the earlier message from Jens more carefully: "The conflict isn't trivial, I guess we need to handle the different types of pages differently when releasing them." So it's not good to have a logically identical patch. argghhh. Let me see how hard it is to track these memory types separately and handle the release accordingly, just a sec. Sorry about the false move here. thanks, -- John Hubbard NVIDIA > As before, I've compile-tested it again with a cross compiler, but that's > the only testing I'm set up for with CONFIG_TEE. > > [1] https://lore.kernel.org/r/20200519051850.2845561-1-jhubbard@nvidia.com > > thanks, > John Hubbard > NVIDIA > > drivers/tee/tee_shm.c | 12 +++--------- > 1 file changed, 3 insertions(+), 9 deletions(-) > > diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c > index 827ac3d0fea9..3c29e6c3ebe8 100644 > --- a/drivers/tee/tee_shm.c > +++ b/drivers/tee/tee_shm.c > @@ -32,16 +32,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]); > - > + unpin_user_pages(shm->pages, shm->num_pages); > kfree(shm->pages); > } > > @@ -228,7 +225,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,16 +289,13 @@ 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]); > + unpin_user_pages(shm->pages, shm->num_pages); > kfree(shm->pages); > } > } > v ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v3] tee: convert convert get_user_pages() --> pin_user_pages() [not found] <CAHUa44FrxidzSUOM_JchOTa5pF6P+j8uZJA5DpKfGLWaS6tCcw@mail.gmail.com> 2020-08-24 18:36 ` [PATCH v2] tee: convert convert get_user_pages() --> pin_user_pages() John Hubbard @ 2020-08-24 21:11 ` John Hubbard 2020-08-25 8:32 ` Jens Wiklander 1 sibling, 1 reply; 6+ messages in thread From: John Hubbard @ 2020-08-24 21:11 UTC (permalink / raw) To: jens.wiklander Cc: arm, jhubbard, linux-arm-kernel, linux-kernel, olof, soc, tee-dev, Sumit Semwal, linux-media, dri-devel, linaro-mm-sig This code was using get_user_pages*(), in a "Case 2" scenario (DMA/RDMA), using the categorization from [1]. That means that it's time to convert the get_user_pages*() + put_page() calls to pin_user_pages*() + unpin_user_pages() calls. Factor out a new, small release_registered_pages() function, in order to consolidate the logic for discerning between TEE_SHM_USER_MAPPED and TEE_SHM_KERNEL_MAPPED pages. This also absorbs the kfree() call that is also required there. There is some helpful background in [2]: basically, this is a small part of fixing a long-standing disconnect between pinning pages, and file systems' use of those pages. [1] Documentation/core-api/pin_user_pages.rst [2] "Explicit pinning of user-space pages": https://lwn.net/Articles/807108/ Cc: Jens Wiklander <jens.wiklander@linaro.org> Cc: Sumit Semwal <sumit.semwal@linaro.org> Cc: tee-dev@lists.linaro.org Cc: linux-media@vger.kernel.org Cc: dri-devel@lists.freedesktop.org Cc: linaro-mm-sig@lists.linaro.org Signed-off-by: John Hubbard <jhubbard@nvidia.com> --- OK, one more try, this time actually handling the _USER_MAPPED vs. _KERNEL_MAPPED pages! thanks, John Hubbard NVIDIA drivers/tee/tee_shm.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c index 827ac3d0fea9..00472f5ce22e 100644 --- a/drivers/tee/tee_shm.c +++ b/drivers/tee/tee_shm.c @@ -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); -- 2.28.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v3] tee: convert convert get_user_pages() --> pin_user_pages() 2020-08-24 21:11 ` [PATCH v3] " John Hubbard @ 2020-08-25 8:32 ` Jens Wiklander 2020-08-25 8:54 ` John Hubbard 0 siblings, 1 reply; 6+ messages in thread From: Jens Wiklander @ 2020-08-25 8:32 UTC (permalink / raw) To: John Hubbard Cc: arm, linux-arm-kernel, linux-kernel, olof, soc, tee-dev, Sumit Semwal, linux-media, dri-devel, linaro-mm-sig On Mon, Aug 24, 2020 at 02:11:25PM -0700, John Hubbard wrote: > This code was using get_user_pages*(), in a "Case 2" scenario > (DMA/RDMA), using the categorization from [1]. That means that it's > time to convert the get_user_pages*() + put_page() calls to > pin_user_pages*() + unpin_user_pages() calls. > > Factor out a new, small release_registered_pages() function, in > order to consolidate the logic for discerning between > TEE_SHM_USER_MAPPED and TEE_SHM_KERNEL_MAPPED pages. This also > absorbs the kfree() call that is also required there. > > There is some helpful background in [2]: basically, this is a small > part of fixing a long-standing disconnect between pinning pages, and > file systems' use of those pages. > > [1] Documentation/core-api/pin_user_pages.rst > > [2] "Explicit pinning of user-space pages": > https://lwn.net/Articles/807108/ > > Cc: Jens Wiklander <jens.wiklander@linaro.org> > Cc: Sumit Semwal <sumit.semwal@linaro.org> > Cc: tee-dev@lists.linaro.org > Cc: linux-media@vger.kernel.org > Cc: dri-devel@lists.freedesktop.org > Cc: linaro-mm-sig@lists.linaro.org > Signed-off-by: John Hubbard <jhubbard@nvidia.com> > --- > > OK, one more try, this time actually handling the _USER_MAPPED vs. > _KERNEL_MAPPED pages! > > thanks, > John Hubbard > NVIDIA Looks good and it works too! :-) I've tested it on my Hikey board with the OP-TEE test suite. I'm picking this up. Thanks, Jens ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v3] tee: convert convert get_user_pages() --> pin_user_pages() 2020-08-25 8:32 ` Jens Wiklander @ 2020-08-25 8:54 ` John Hubbard 2020-08-25 9:02 ` Jens Wiklander 0 siblings, 1 reply; 6+ messages in thread From: John Hubbard @ 2020-08-25 8:54 UTC (permalink / raw) To: Jens Wiklander Cc: arm, linux-arm-kernel, linux-kernel, olof, soc, tee-dev, Sumit Semwal, linux-media, dri-devel, linaro-mm-sig On 8/25/20 1:32 AM, Jens Wiklander wrote: > On Mon, Aug 24, 2020 at 02:11:25PM -0700, John Hubbard wrote: ... >> OK, one more try, this time actually handling the _USER_MAPPED vs. >> _KERNEL_MAPPED pages! >> >> thanks, >> John Hubbard >> NVIDIA > > Looks good and it works too! :-) I've tested it on my Hikey board with > the OP-TEE test suite. > I'm picking this up. > Great! I see that I have, once again, somehow doubled up on the subject line: "tee: convert convert ...". This particular typo just seems to stick to me. :) If you get a chance to fix that up by changing it to just a single "convert" I'd appreciate it. thanks, -- John Hubbard NVIDIA ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v3] tee: convert convert get_user_pages() --> pin_user_pages() 2020-08-25 8:54 ` John Hubbard @ 2020-08-25 9:02 ` Jens Wiklander 0 siblings, 0 replies; 6+ messages in thread From: Jens Wiklander @ 2020-08-25 9:02 UTC (permalink / raw) To: John Hubbard Cc: arm-soc, Linux ARM, Linux Kernel Mailing List, Olof Johansson, SoC Team, tee-dev @ lists . linaro . org, Sumit Semwal, linux-media, DRI Development, linaro-mm-sig On Tue, Aug 25, 2020 at 10:54 AM John Hubbard <jhubbard@nvidia.com> wrote: > > On 8/25/20 1:32 AM, Jens Wiklander wrote: > > On Mon, Aug 24, 2020 at 02:11:25PM -0700, John Hubbard wrote: > ... > >> OK, one more try, this time actually handling the _USER_MAPPED vs. > >> _KERNEL_MAPPED pages! > >> > >> thanks, > >> John Hubbard > >> NVIDIA > > > > Looks good and it works too! :-) I've tested it on my Hikey board with > > the OP-TEE test suite. > > I'm picking this up. > > > > Great! I see that I have, once again, somehow doubled up on the subject line: > "tee: convert convert ...". This particular typo just seems to stick to me. :) > > If you get a chance to fix that up by changing it to just a single "convert" > I'd appreciate it. Sure, no problem. Cheers, Jens ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2020-08-25 9:02 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <CAHUa44FrxidzSUOM_JchOTa5pF6P+j8uZJA5DpKfGLWaS6tCcw@mail.gmail.com>
2020-08-24 18:36 ` [PATCH v2] tee: convert convert get_user_pages() --> pin_user_pages() John Hubbard
2020-08-24 18:42 ` John Hubbard
2020-08-24 21:11 ` [PATCH v3] " John Hubbard
2020-08-25 8:32 ` Jens Wiklander
2020-08-25 8:54 ` John Hubbard
2020-08-25 9:02 ` Jens Wiklander
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox