* [PATCH v3] KVM: arm64: Add memory length checks and remove inline in do_ffa_mem_xfer
@ 2024-09-09 18:01 Snehal Koukuntla
2024-09-09 22:36 ` Oliver Upton
` (3 more replies)
0 siblings, 4 replies; 8+ messages in thread
From: Snehal Koukuntla @ 2024-09-09 18:01 UTC (permalink / raw)
To: Marc Zyngier, Oliver Upton
Cc: James Morse, Suzuki K Poulose, Zenghui Yu, Catalin Marinas,
Will Deacon, Sudeep Holla, Sebastian Ene, Vincent Donnefort,
Snehal, Jean-Philippe Brucker, linux-arm-kernel, kvmarm,
linux-kernel, stable
When we share memory through FF-A and the description of the buffers
exceeds the size of the mapped buffer, the fragmentation API is used.
The fragmentation API allows specifying chunks of descriptors in subsequent
FF-A fragment calls and no upper limit has been established for this.
The entire memory region transferred is identified by a handle which can be
used to reclaim the transferred memory.
To be able to reclaim the memory, the description of the buffers has to fit
in the ffa_desc_buf.
Add a bounds check on the FF-A sharing path to prevent the memory reclaim
from failing.
Also do_ffa_mem_xfer() does not need __always_inline
Fixes: 634d90cf0ac65 ("KVM: arm64: Handle FFA_MEM_LEND calls from the host")
Cc: stable@vger.kernel.org
Reviewed-by: Sebastian Ene <sebastianene@google.com>
Signed-off-by: Snehal Koukuntla <snehalreddy@google.com>
---
arch/arm64/kvm/hyp/nvhe/ffa.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/kvm/hyp/nvhe/ffa.c b/arch/arm64/kvm/hyp/nvhe/ffa.c
index e715c157c2c4..637425f63fd1 100644
--- a/arch/arm64/kvm/hyp/nvhe/ffa.c
+++ b/arch/arm64/kvm/hyp/nvhe/ffa.c
@@ -426,7 +426,7 @@ static void do_ffa_mem_frag_tx(struct arm_smccc_res *res,
return;
}
-static __always_inline void do_ffa_mem_xfer(const u64 func_id,
+static void do_ffa_mem_xfer(const u64 func_id,
struct arm_smccc_res *res,
struct kvm_cpu_context *ctxt)
{
@@ -461,6 +461,11 @@ static __always_inline void do_ffa_mem_xfer(const u64 func_id,
goto out_unlock;
}
+ if (len > ffa_desc_buf.len) {
+ ret = FFA_RET_NO_MEMORY;
+ goto out_unlock;
+ }
+
buf = hyp_buffers.tx;
memcpy(buf, host_buffers.tx, fraglen);
--
2.46.0.598.g6f2099f65c-goog
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v3] KVM: arm64: Add memory length checks and remove inline in do_ffa_mem_xfer
2024-09-09 18:01 [PATCH v3] KVM: arm64: Add memory length checks and remove inline in do_ffa_mem_xfer Snehal Koukuntla
@ 2024-09-09 22:36 ` Oliver Upton
2024-09-10 7:23 ` Marc Zyngier
` (2 subsequent siblings)
3 siblings, 0 replies; 8+ messages in thread
From: Oliver Upton @ 2024-09-09 22:36 UTC (permalink / raw)
To: Snehal Koukuntla
Cc: Marc Zyngier, James Morse, Suzuki K Poulose, Zenghui Yu,
Catalin Marinas, Will Deacon, Sudeep Holla, Sebastian Ene,
Vincent Donnefort, Jean-Philippe Brucker, linux-arm-kernel,
kvmarm, linux-kernel, stable
Hi Snehal,
On Mon, Sep 09, 2024 at 06:01:54PM +0000, Snehal Koukuntla wrote:
> When we share memory through FF-A and the description of the buffers
> exceeds the size of the mapped buffer, the fragmentation API is used.
> The fragmentation API allows specifying chunks of descriptors in subsequent
> FF-A fragment calls and no upper limit has been established for this.
> The entire memory region transferred is identified by a handle which can be
> used to reclaim the transferred memory.
> To be able to reclaim the memory, the description of the buffers has to fit
> in the ffa_desc_buf.
> Add a bounds check on the FF-A sharing path to prevent the memory reclaim
> from failing.
>
> Also do_ffa_mem_xfer() does not need __always_inline
>
> Fixes: 634d90cf0ac65 ("KVM: arm64: Handle FFA_MEM_LEND calls from the host")
> Cc: stable@vger.kernel.org
> Reviewed-by: Sebastian Ene <sebastianene@google.com>
> Signed-off-by: Snehal Koukuntla <snehalreddy@google.com>
> ---
Next time around, please include some notes on what's changed between
versions and ideally a link to the last patch. It helps latecomers (i.e.
me) get an idea of what's happening w/ a patch.
> arch/arm64/kvm/hyp/nvhe/ffa.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm64/kvm/hyp/nvhe/ffa.c b/arch/arm64/kvm/hyp/nvhe/ffa.c
> index e715c157c2c4..637425f63fd1 100644
> --- a/arch/arm64/kvm/hyp/nvhe/ffa.c
> +++ b/arch/arm64/kvm/hyp/nvhe/ffa.c
> @@ -426,7 +426,7 @@ static void do_ffa_mem_frag_tx(struct arm_smccc_res *res,
> return;
> }
>
> -static __always_inline void do_ffa_mem_xfer(const u64 func_id,
> +static void do_ffa_mem_xfer(const u64 func_id,
> struct arm_smccc_res *res,
> struct kvm_cpu_context *ctxt)
> {
> @@ -461,6 +461,11 @@ static __always_inline void do_ffa_mem_xfer(const u64 func_id,
> goto out_unlock;
> }
>
> + if (len > ffa_desc_buf.len) {
> + ret = FFA_RET_NO_MEMORY;
> + goto out_unlock;
> + }
> +
This check doesn't need to happen behind the host_buffers spinlock. Of
course, keeping it behind the lock is benign, but this sort of thing
prompts a reviewer to ask "why?"
Besides that,
Reviewed-by: Oliver Upton <oliver.upton@linux.dev>
--
Thanks,
Oliver
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v3] KVM: arm64: Add memory length checks and remove inline in do_ffa_mem_xfer
2024-09-09 18:01 [PATCH v3] KVM: arm64: Add memory length checks and remove inline in do_ffa_mem_xfer Snehal Koukuntla
2024-09-09 22:36 ` Oliver Upton
@ 2024-09-10 7:23 ` Marc Zyngier
2024-09-10 16:32 ` Wei-Lin Chang
2024-09-10 20:11 ` Marc Zyngier
3 siblings, 0 replies; 8+ messages in thread
From: Marc Zyngier @ 2024-09-10 7:23 UTC (permalink / raw)
To: Oliver Upton, Snehal Koukuntla
Cc: James Morse, Suzuki K Poulose, Zenghui Yu, Catalin Marinas,
Will Deacon, Sudeep Holla, Sebastian Ene, Vincent Donnefort,
Jean-Philippe Brucker, linux-arm-kernel, kvmarm, linux-kernel,
stable
On Mon, 09 Sep 2024 18:01:54 +0000, Snehal Koukuntla wrote:
> When we share memory through FF-A and the description of the buffers
> exceeds the size of the mapped buffer, the fragmentation API is used.
> The fragmentation API allows specifying chunks of descriptors in subsequent
> FF-A fragment calls and no upper limit has been established for this.
> The entire memory region transferred is identified by a handle which can be
> used to reclaim the transferred memory.
> To be able to reclaim the memory, the description of the buffers has to fit
> in the ffa_desc_buf.
> Add a bounds check on the FF-A sharing path to prevent the memory reclaim
> from failing.
>
> [...]
Applied to next, thanks!
[1/1] KVM: arm64: Add memory length checks and remove inline in do_ffa_mem_xfer
commit: 39dacbeeee703d29140aca7bc2826d4b1936ecb6
Cheers,
M.
--
Without deviation from the norm, progress is not possible.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v3] KVM: arm64: Add memory length checks and remove inline in do_ffa_mem_xfer
2024-09-09 18:01 [PATCH v3] KVM: arm64: Add memory length checks and remove inline in do_ffa_mem_xfer Snehal Koukuntla
2024-09-09 22:36 ` Oliver Upton
2024-09-10 7:23 ` Marc Zyngier
@ 2024-09-10 16:32 ` Wei-Lin Chang
2024-09-10 18:18 ` Oliver Upton
2024-09-10 20:11 ` Marc Zyngier
3 siblings, 1 reply; 8+ messages in thread
From: Wei-Lin Chang @ 2024-09-10 16:32 UTC (permalink / raw)
To: Snehal Koukuntla, Marc Zyngier, Oliver Upton
Cc: James Morse, Suzuki K Poulose, Zenghui Yu, Catalin Marinas,
Will Deacon, Sudeep Holla, Sebastian Ene, Vincent Donnefort,
Jean-Philippe Brucker, linux-arm-kernel, kvmarm, linux-kernel,
stable, r09922117
Hi everyone,
On Mon, Sep 09, 2024 at 06:01:54PM GMT, Snehal Koukuntla wrote:
> When we share memory through FF-A and the description of the buffers
> exceeds the size of the mapped buffer, the fragmentation API is used.
> The fragmentation API allows specifying chunks of descriptors in subsequent
> FF-A fragment calls and no upper limit has been established for this.
> The entire memory region transferred is identified by a handle which can be
> used to reclaim the transferred memory.
> To be able to reclaim the memory, the description of the buffers has to fit
> in the ffa_desc_buf.
> Add a bounds check on the FF-A sharing path to prevent the memory reclaim
> from failing.
>
> Also do_ffa_mem_xfer() does not need __always_inline
>
> Fixes: 634d90cf0ac65 ("KVM: arm64: Handle FFA_MEM_LEND calls from the host")
> Cc: stable@vger.kernel.org
> Reviewed-by: Sebastian Ene <sebastianene@google.com>
> Signed-off-by: Snehal Koukuntla <snehalreddy@google.com>
> ---
> arch/arm64/kvm/hyp/nvhe/ffa.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm64/kvm/hyp/nvhe/ffa.c b/arch/arm64/kvm/hyp/nvhe/ffa.c
> index e715c157c2c4..637425f63fd1 100644
> --- a/arch/arm64/kvm/hyp/nvhe/ffa.c
> +++ b/arch/arm64/kvm/hyp/nvhe/ffa.c
> @@ -426,7 +426,7 @@ static void do_ffa_mem_frag_tx(struct arm_smccc_res *res,
> return;
> }
>
> -static __always_inline void do_ffa_mem_xfer(const u64 func_id,
> +static void do_ffa_mem_xfer(const u64 func_id,
I am seeing a compilation error because of this.
----- LOG START -----
$ clang --version
clang version 18.1.8
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
$ make LLVM=1 ARCH=arm64 defconfig
$ make LLVM=1 ARCH=arm64 Image
...
arch/arm64/kvm/hyp/nvhe/ffa.c:443:2: error: call to '__compiletime_assert_776' declared with 'error' attribute: BUILD_BUG_ON failed: func_id != FFA_FN64_MEM_SHARE && func_id != FFA_FN64_MEM_LEND
443 | BUILD_BUG_ON(func_id != FFA_FN64_MEM_SHARE &&
| ^
./include/linux/build_bug.h:50:2: note: expanded from macro 'BUILD_BUG_ON'
50 | BUILD_BUG_ON_MSG(condition, "BUILD_BUG_ON failed: " #condition)
| ^
./include/linux/build_bug.h:39:37: note: expanded from macro 'BUILD_BUG_ON_MSG'
39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
| ^
././include/linux/compiler_types.h:510:2: note: expanded from macro 'compiletime_assert'
510 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
| ^
././include/linux/compiler_types.h:498:2: note: expanded from macro '_compiletime_assert'
498 | __compiletime_assert(condition, msg, prefix, suffix)
| ^
././include/linux/compiler_types.h:491:4: note: expanded from macro '__compiletime_assert'
491 | prefix ## suffix(); \
| ^
<scratch space>:66:1: note: expanded from here
66 | __compiletime_assert_776
| ^
1 error generated.
make[6]: *** [arch/arm64/kvm/hyp/nvhe/Makefile:46: arch/arm64/kvm/hyp/nvhe/ffa.nvhe.o] Error 1
make[5]: *** [scripts/Makefile.build:485: arch/arm64/kvm/hyp/nvhe] Error 2
make[4]: *** [scripts/Makefile.build:485: arch/arm64/kvm/hyp] Error 2
make[3]: *** [scripts/Makefile.build:485: arch/arm64/kvm] Error 2
make[3]: *** Waiting for unfinished jobs....
----- LOG END -----
Is this expected? Because when I add back the __always_inline, or change the
BUILD_BUG_ON to BUG_ON, it compiles successfully.
Thanks,
Wei-Lin Chang
> struct arm_smccc_res *res,
> struct kvm_cpu_context *ctxt)
> {
> @@ -461,6 +461,11 @@ static __always_inline void do_ffa_mem_xfer(const u64 func_id,
> goto out_unlock;
> }
>
> + if (len > ffa_desc_buf.len) {
> + ret = FFA_RET_NO_MEMORY;
> + goto out_unlock;
> + }
> +
> buf = hyp_buffers.tx;
> memcpy(buf, host_buffers.tx, fraglen);
>
> --
> 2.46.0.598.g6f2099f65c-goog
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v3] KVM: arm64: Add memory length checks and remove inline in do_ffa_mem_xfer
2024-09-10 16:32 ` Wei-Lin Chang
@ 2024-09-10 18:18 ` Oliver Upton
2024-09-10 19:49 ` Marc Zyngier
0 siblings, 1 reply; 8+ messages in thread
From: Oliver Upton @ 2024-09-10 18:18 UTC (permalink / raw)
To: Wei-Lin Chang
Cc: Snehal Koukuntla, Marc Zyngier, James Morse, Suzuki K Poulose,
Zenghui Yu, Catalin Marinas, Will Deacon, Sudeep Holla,
Sebastian Ene, Vincent Donnefort, Jean-Philippe Brucker,
linux-arm-kernel, kvmarm, linux-kernel, stable
On Wed, Sep 11, 2024 at 12:32:29AM +0800, Wei-Lin Chang wrote:
> Hi everyone,
>
> On Mon, Sep 09, 2024 at 06:01:54PM GMT, Snehal Koukuntla wrote:
> > When we share memory through FF-A and the description of the buffers
> > exceeds the size of the mapped buffer, the fragmentation API is used.
> > The fragmentation API allows specifying chunks of descriptors in subsequent
> > FF-A fragment calls and no upper limit has been established for this.
> > The entire memory region transferred is identified by a handle which can be
> > used to reclaim the transferred memory.
> > To be able to reclaim the memory, the description of the buffers has to fit
> > in the ffa_desc_buf.
> > Add a bounds check on the FF-A sharing path to prevent the memory reclaim
> > from failing.
> >
> > Also do_ffa_mem_xfer() does not need __always_inline
> >
> > Fixes: 634d90cf0ac65 ("KVM: arm64: Handle FFA_MEM_LEND calls from the host")
> > Cc: stable@vger.kernel.org
> > Reviewed-by: Sebastian Ene <sebastianene@google.com>
> > Signed-off-by: Snehal Koukuntla <snehalreddy@google.com>
> > ---
> > arch/arm64/kvm/hyp/nvhe/ffa.c | 7 ++++++-
> > 1 file changed, 6 insertions(+), 1 deletion(-)
> >
> > diff --git a/arch/arm64/kvm/hyp/nvhe/ffa.c b/arch/arm64/kvm/hyp/nvhe/ffa.c
> > index e715c157c2c4..637425f63fd1 100644
> > --- a/arch/arm64/kvm/hyp/nvhe/ffa.c
> > +++ b/arch/arm64/kvm/hyp/nvhe/ffa.c
> > @@ -426,7 +426,7 @@ static void do_ffa_mem_frag_tx(struct arm_smccc_res *res,
> > return;
> > }
> >
> > -static __always_inline void do_ffa_mem_xfer(const u64 func_id,
> > +static void do_ffa_mem_xfer(const u64 func_id,
>
> I am seeing a compilation error because of this.
Thanks for reporting this. Looks like the __always_inline was slightly
more load bearing...
Marc, can you put something like this on top?
From c2712eaa94989ae6457baad3ec459cf363ec5119 Mon Sep 17 00:00:00 2001
From: Oliver Upton <oliver.upton@linux.dev>
Date: Tue, 10 Sep 2024 16:45:30 +0000
Subject: [PATCH] KVM: arm64: Drop BUILD_BUG_ON() from do_ffa_mem_xfer()
__always_inline was recently discarded from do_ffa_mem_xfer() since it
appeared to be unnecessary. Of course, this was ~immediately proven
wrong, as the compile-time check against @func_id depends on inlining
for the value to be known.
Just downgrade to a WARN_ON() instead of putting the old mess back in
place. Fix the wrapping/indentation of the function parameters while at
it.
Fixes: 39dacbeeee70 ("KVM: arm64: Add memory length checks and remove inline in do_ffa_mem_xfer")
Reported-by: Wei-Lin Chang <r09922117@csie.ntu.edu.tw>
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
---
arch/arm64/kvm/hyp/nvhe/ffa.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/arch/arm64/kvm/hyp/nvhe/ffa.c b/arch/arm64/kvm/hyp/nvhe/ffa.c
index 637425f63fd1..316d269341f3 100644
--- a/arch/arm64/kvm/hyp/nvhe/ffa.c
+++ b/arch/arm64/kvm/hyp/nvhe/ffa.c
@@ -426,9 +426,8 @@ static void do_ffa_mem_frag_tx(struct arm_smccc_res *res,
return;
}
-static void do_ffa_mem_xfer(const u64 func_id,
- struct arm_smccc_res *res,
- struct kvm_cpu_context *ctxt)
+static void do_ffa_mem_xfer(const u64 func_id, struct arm_smccc_res *res,
+ struct kvm_cpu_context *ctxt)
{
DECLARE_REG(u32, len, ctxt, 1);
DECLARE_REG(u32, fraglen, ctxt, 2);
@@ -440,8 +439,10 @@ static void do_ffa_mem_xfer(const u64 func_id,
u32 offset, nr_ranges;
int ret = 0;
- BUILD_BUG_ON(func_id != FFA_FN64_MEM_SHARE &&
- func_id != FFA_FN64_MEM_LEND);
+ if (WARN_ON(func_id != FFA_FN64_MEM_SHARE && func_id != FFA_FN64_MEM_LEND)) {
+ ret = SMCCC_RET_NOT_SUPPORTED;
+ goto out;
+ }
if (addr_mbz || npages_mbz || fraglen > len ||
fraglen > KVM_FFA_MBOX_NR_PAGES * PAGE_SIZE) {
--
2.46.0.598.g6f2099f65c-goog
--
Thanks,
Oliver
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v3] KVM: arm64: Add memory length checks and remove inline in do_ffa_mem_xfer
2024-09-10 18:18 ` Oliver Upton
@ 2024-09-10 19:49 ` Marc Zyngier
2024-09-10 19:53 ` Oliver Upton
0 siblings, 1 reply; 8+ messages in thread
From: Marc Zyngier @ 2024-09-10 19:49 UTC (permalink / raw)
To: Oliver Upton
Cc: Wei-Lin Chang, Snehal Koukuntla, James Morse, Suzuki K Poulose,
Zenghui Yu, Catalin Marinas, Will Deacon, Sudeep Holla,
Sebastian Ene, Vincent Donnefort, Jean-Philippe Brucker,
linux-arm-kernel, kvmarm, linux-kernel, stable
On Tue, 10 Sep 2024 19:18:41 +0100,
Oliver Upton <oliver.upton@linux.dev> wrote:
>
> On Wed, Sep 11, 2024 at 12:32:29AM +0800, Wei-Lin Chang wrote:
> > Hi everyone,
> >
> > On Mon, Sep 09, 2024 at 06:01:54PM GMT, Snehal Koukuntla wrote:
> > > When we share memory through FF-A and the description of the buffers
> > > exceeds the size of the mapped buffer, the fragmentation API is used.
> > > The fragmentation API allows specifying chunks of descriptors in subsequent
> > > FF-A fragment calls and no upper limit has been established for this.
> > > The entire memory region transferred is identified by a handle which can be
> > > used to reclaim the transferred memory.
> > > To be able to reclaim the memory, the description of the buffers has to fit
> > > in the ffa_desc_buf.
> > > Add a bounds check on the FF-A sharing path to prevent the memory reclaim
> > > from failing.
> > >
> > > Also do_ffa_mem_xfer() does not need __always_inline
> > >
> > > Fixes: 634d90cf0ac65 ("KVM: arm64: Handle FFA_MEM_LEND calls from the host")
> > > Cc: stable@vger.kernel.org
> > > Reviewed-by: Sebastian Ene <sebastianene@google.com>
> > > Signed-off-by: Snehal Koukuntla <snehalreddy@google.com>
> > > ---
> > > arch/arm64/kvm/hyp/nvhe/ffa.c | 7 ++++++-
> > > 1 file changed, 6 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/arch/arm64/kvm/hyp/nvhe/ffa.c b/arch/arm64/kvm/hyp/nvhe/ffa.c
> > > index e715c157c2c4..637425f63fd1 100644
> > > --- a/arch/arm64/kvm/hyp/nvhe/ffa.c
> > > +++ b/arch/arm64/kvm/hyp/nvhe/ffa.c
> > > @@ -426,7 +426,7 @@ static void do_ffa_mem_frag_tx(struct arm_smccc_res *res,
> > > return;
> > > }
> > >
> > > -static __always_inline void do_ffa_mem_xfer(const u64 func_id,
> > > +static void do_ffa_mem_xfer(const u64 func_id,
> >
> > I am seeing a compilation error because of this.
>
> Thanks for reporting this. Looks like the __always_inline was slightly
> more load bearing...
>
> Marc, can you put something like this on top?
>
>
> From c2712eaa94989ae6457baad3ec459cf363ec5119 Mon Sep 17 00:00:00 2001
> From: Oliver Upton <oliver.upton@linux.dev>
> Date: Tue, 10 Sep 2024 16:45:30 +0000
> Subject: [PATCH] KVM: arm64: Drop BUILD_BUG_ON() from do_ffa_mem_xfer()
>
> __always_inline was recently discarded from do_ffa_mem_xfer() since it
> appeared to be unnecessary. Of course, this was ~immediately proven
> wrong, as the compile-time check against @func_id depends on inlining
> for the value to be known.
>
> Just downgrade to a WARN_ON() instead of putting the old mess back in
> place. Fix the wrapping/indentation of the function parameters while at
> it.
>
> Fixes: 39dacbeeee70 ("KVM: arm64: Add memory length checks and remove inline in do_ffa_mem_xfer")
> Reported-by: Wei-Lin Chang <r09922117@csie.ntu.edu.tw>
> Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
> ---
> arch/arm64/kvm/hyp/nvhe/ffa.c | 11 ++++++-----
> 1 file changed, 6 insertions(+), 5 deletions(-)
>
> diff --git a/arch/arm64/kvm/hyp/nvhe/ffa.c b/arch/arm64/kvm/hyp/nvhe/ffa.c
> index 637425f63fd1..316d269341f3 100644
> --- a/arch/arm64/kvm/hyp/nvhe/ffa.c
> +++ b/arch/arm64/kvm/hyp/nvhe/ffa.c
> @@ -426,9 +426,8 @@ static void do_ffa_mem_frag_tx(struct arm_smccc_res *res,
> return;
> }
>
> -static void do_ffa_mem_xfer(const u64 func_id,
> - struct arm_smccc_res *res,
> - struct kvm_cpu_context *ctxt)
> +static void do_ffa_mem_xfer(const u64 func_id, struct arm_smccc_res *res,
> + struct kvm_cpu_context *ctxt)
> {
> DECLARE_REG(u32, len, ctxt, 1);
> DECLARE_REG(u32, fraglen, ctxt, 2);
> @@ -440,8 +439,10 @@ static void do_ffa_mem_xfer(const u64 func_id,
> u32 offset, nr_ranges;
> int ret = 0;
>
> - BUILD_BUG_ON(func_id != FFA_FN64_MEM_SHARE &&
> - func_id != FFA_FN64_MEM_LEND);
> + if (WARN_ON(func_id != FFA_FN64_MEM_SHARE && func_id != FFA_FN64_MEM_LEND)) {
> + ret = SMCCC_RET_NOT_SUPPORTED;
> + goto out;
> + }
I'm not overly on the WARN_ON(), as it has pretty fatal effects on
pKVM (it simply panics). What do you think of this instead, which
compiles with my prehistoric version of clang (14.0.6):
diff --git a/arch/arm64/kvm/hyp/nvhe/ffa.c b/arch/arm64/kvm/hyp/nvhe/ffa.c
index 637425f63fd1b..e433dfab882aa 100644
--- a/arch/arm64/kvm/hyp/nvhe/ffa.c
+++ b/arch/arm64/kvm/hyp/nvhe/ffa.c
@@ -426,9 +426,9 @@ static void do_ffa_mem_frag_tx(struct arm_smccc_res *res,
return;
}
-static void do_ffa_mem_xfer(const u64 func_id,
- struct arm_smccc_res *res,
- struct kvm_cpu_context *ctxt)
+static void __do_ffa_mem_xfer(const u64 func_id,
+ struct arm_smccc_res *res,
+ struct kvm_cpu_context *ctxt)
{
DECLARE_REG(u32, len, ctxt, 1);
DECLARE_REG(u32, fraglen, ctxt, 2);
@@ -440,9 +440,6 @@ static void do_ffa_mem_xfer(const u64 func_id,
u32 offset, nr_ranges;
int ret = 0;
- BUILD_BUG_ON(func_id != FFA_FN64_MEM_SHARE &&
- func_id != FFA_FN64_MEM_LEND);
-
if (addr_mbz || npages_mbz || fraglen > len ||
fraglen > KVM_FFA_MBOX_NR_PAGES * PAGE_SIZE) {
ret = FFA_RET_INVALID_PARAMETERS;
@@ -517,6 +514,13 @@ static void do_ffa_mem_xfer(const u64 func_id,
goto out_unlock;
}
+#define do_ffa_mem_xfer(fid, res, ctxt) \
+ do { \
+ BUILD_BUG_ON((fid) != FFA_FN64_MEM_SHARE && \
+ (fid) != FFA_FN64_MEM_LEND); \
+ __do_ffa_mem_xfer((fid), (res), (ctxt)); \
+ } while (0);
+
static void do_ffa_mem_reclaim(struct arm_smccc_res *res,
struct kvm_cpu_context *ctxt)
{
It preserves the build-time assertion, which was the intention of the
original author.
I can easily squash that in the original commit, avoiding the headache
of backporting both patch to stable.
M.
--
Without deviation from the norm, progress is not possible.
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v3] KVM: arm64: Add memory length checks and remove inline in do_ffa_mem_xfer
2024-09-10 19:49 ` Marc Zyngier
@ 2024-09-10 19:53 ` Oliver Upton
0 siblings, 0 replies; 8+ messages in thread
From: Oliver Upton @ 2024-09-10 19:53 UTC (permalink / raw)
To: Marc Zyngier
Cc: Wei-Lin Chang, Snehal Koukuntla, James Morse, Suzuki K Poulose,
Zenghui Yu, Catalin Marinas, Will Deacon, Sudeep Holla,
Sebastian Ene, Vincent Donnefort, Jean-Philippe Brucker,
linux-arm-kernel, kvmarm, linux-kernel, stable
On Tue, Sep 10, 2024 at 08:49:28PM +0100, Marc Zyngier wrote:
> On Tue, 10 Sep 2024 19:18:41 +0100,
> Oliver Upton <oliver.upton@linux.dev> wrote:
> >
> > On Wed, Sep 11, 2024 at 12:32:29AM +0800, Wei-Lin Chang wrote:
> > > Hi everyone,
> > >
> > > On Mon, Sep 09, 2024 at 06:01:54PM GMT, Snehal Koukuntla wrote:
> > > > When we share memory through FF-A and the description of the buffers
> > > > exceeds the size of the mapped buffer, the fragmentation API is used.
> > > > The fragmentation API allows specifying chunks of descriptors in subsequent
> > > > FF-A fragment calls and no upper limit has been established for this.
> > > > The entire memory region transferred is identified by a handle which can be
> > > > used to reclaim the transferred memory.
> > > > To be able to reclaim the memory, the description of the buffers has to fit
> > > > in the ffa_desc_buf.
> > > > Add a bounds check on the FF-A sharing path to prevent the memory reclaim
> > > > from failing.
> > > >
> > > > Also do_ffa_mem_xfer() does not need __always_inline
> > > >
> > > > Fixes: 634d90cf0ac65 ("KVM: arm64: Handle FFA_MEM_LEND calls from the host")
> > > > Cc: stable@vger.kernel.org
> > > > Reviewed-by: Sebastian Ene <sebastianene@google.com>
> > > > Signed-off-by: Snehal Koukuntla <snehalreddy@google.com>
> > > > ---
> > > > arch/arm64/kvm/hyp/nvhe/ffa.c | 7 ++++++-
> > > > 1 file changed, 6 insertions(+), 1 deletion(-)
> > > >
> > > > diff --git a/arch/arm64/kvm/hyp/nvhe/ffa.c b/arch/arm64/kvm/hyp/nvhe/ffa.c
> > > > index e715c157c2c4..637425f63fd1 100644
> > > > --- a/arch/arm64/kvm/hyp/nvhe/ffa.c
> > > > +++ b/arch/arm64/kvm/hyp/nvhe/ffa.c
> > > > @@ -426,7 +426,7 @@ static void do_ffa_mem_frag_tx(struct arm_smccc_res *res,
> > > > return;
> > > > }
> > > >
> > > > -static __always_inline void do_ffa_mem_xfer(const u64 func_id,
> > > > +static void do_ffa_mem_xfer(const u64 func_id,
> > >
> > > I am seeing a compilation error because of this.
> >
> > Thanks for reporting this. Looks like the __always_inline was slightly
> > more load bearing...
> >
> > Marc, can you put something like this on top?
> >
> >
> > From c2712eaa94989ae6457baad3ec459cf363ec5119 Mon Sep 17 00:00:00 2001
> > From: Oliver Upton <oliver.upton@linux.dev>
> > Date: Tue, 10 Sep 2024 16:45:30 +0000
> > Subject: [PATCH] KVM: arm64: Drop BUILD_BUG_ON() from do_ffa_mem_xfer()
> >
> > __always_inline was recently discarded from do_ffa_mem_xfer() since it
> > appeared to be unnecessary. Of course, this was ~immediately proven
> > wrong, as the compile-time check against @func_id depends on inlining
> > for the value to be known.
> >
> > Just downgrade to a WARN_ON() instead of putting the old mess back in
> > place. Fix the wrapping/indentation of the function parameters while at
> > it.
> >
> > Fixes: 39dacbeeee70 ("KVM: arm64: Add memory length checks and remove inline in do_ffa_mem_xfer")
> > Reported-by: Wei-Lin Chang <r09922117@csie.ntu.edu.tw>
> > Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
> > ---
> > arch/arm64/kvm/hyp/nvhe/ffa.c | 11 ++++++-----
> > 1 file changed, 6 insertions(+), 5 deletions(-)
> >
> > diff --git a/arch/arm64/kvm/hyp/nvhe/ffa.c b/arch/arm64/kvm/hyp/nvhe/ffa.c
> > index 637425f63fd1..316d269341f3 100644
> > --- a/arch/arm64/kvm/hyp/nvhe/ffa.c
> > +++ b/arch/arm64/kvm/hyp/nvhe/ffa.c
> > @@ -426,9 +426,8 @@ static void do_ffa_mem_frag_tx(struct arm_smccc_res *res,
> > return;
> > }
> >
> > -static void do_ffa_mem_xfer(const u64 func_id,
> > - struct arm_smccc_res *res,
> > - struct kvm_cpu_context *ctxt)
> > +static void do_ffa_mem_xfer(const u64 func_id, struct arm_smccc_res *res,
> > + struct kvm_cpu_context *ctxt)
> > {
> > DECLARE_REG(u32, len, ctxt, 1);
> > DECLARE_REG(u32, fraglen, ctxt, 2);
> > @@ -440,8 +439,10 @@ static void do_ffa_mem_xfer(const u64 func_id,
> > u32 offset, nr_ranges;
> > int ret = 0;
> >
> > - BUILD_BUG_ON(func_id != FFA_FN64_MEM_SHARE &&
> > - func_id != FFA_FN64_MEM_LEND);
> > + if (WARN_ON(func_id != FFA_FN64_MEM_SHARE && func_id != FFA_FN64_MEM_LEND)) {
> > + ret = SMCCC_RET_NOT_SUPPORTED;
> > + goto out;
> > + }
>
>
> I'm not overly on the WARN_ON(), as it has pretty fatal effects on
> pKVM (it simply panics).
It's unexpected, what else are you wanting? :P
> What do you think of this instead, which
> compiles with my prehistoric version of clang (14.0.6):
LGTM, macro expansion makes the relation a bit more obvious. Feel free
to add:
Reviewed-by: Oliver Upton <oliver.upton@linux.dev>
--
Thanks,
Oliver
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v3] KVM: arm64: Add memory length checks and remove inline in do_ffa_mem_xfer
2024-09-09 18:01 [PATCH v3] KVM: arm64: Add memory length checks and remove inline in do_ffa_mem_xfer Snehal Koukuntla
` (2 preceding siblings ...)
2024-09-10 16:32 ` Wei-Lin Chang
@ 2024-09-10 20:11 ` Marc Zyngier
3 siblings, 0 replies; 8+ messages in thread
From: Marc Zyngier @ 2024-09-10 20:11 UTC (permalink / raw)
To: Oliver Upton, Snehal Koukuntla, Wei-Lin Chang
Cc: James Morse, Suzuki K Poulose, Zenghui Yu, Catalin Marinas,
Will Deacon, Sudeep Holla, Sebastian Ene, Vincent Donnefort,
Jean-Philippe Brucker, linux-arm-kernel, kvmarm, linux-kernel,
stable
On Mon, 09 Sep 2024 18:01:54 +0000, Snehal Koukuntla wrote:
> When we share memory through FF-A and the description of the buffers
> exceeds the size of the mapped buffer, the fragmentation API is used.
> The fragmentation API allows specifying chunks of descriptors in subsequent
> FF-A fragment calls and no upper limit has been established for this.
> The entire memory region transferred is identified by a handle which can be
> used to reclaim the transferred memory.
> To be able to reclaim the memory, the description of the buffers has to fit
> in the ffa_desc_buf.
> Add a bounds check on the FF-A sharing path to prevent the memory reclaim
> from failing.
>
> [...]
Applied to next, with the BUILD_BUG_ON() issue fixed.
[1/1] KVM: arm64: Add memory length checks and remove inline in do_ffa_mem_xfer
commit: f26a525b77e040d584e967369af1e018d2d59112
Cheers,
M.
--
Without deviation from the norm, progress is not possible.
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2024-09-10 20:13 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-09-09 18:01 [PATCH v3] KVM: arm64: Add memory length checks and remove inline in do_ffa_mem_xfer Snehal Koukuntla
2024-09-09 22:36 ` Oliver Upton
2024-09-10 7:23 ` Marc Zyngier
2024-09-10 16:32 ` Wei-Lin Chang
2024-09-10 18:18 ` Oliver Upton
2024-09-10 19:49 ` Marc Zyngier
2024-09-10 19:53 ` Oliver Upton
2024-09-10 20:11 ` Marc Zyngier
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).