[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 2/5] xen/arm: ffa: Introduce VM to VM support
Hi Julien, > On 30 Mar 2025, at 23:26, Julien Grall <julien@xxxxxxx> wrote: > > Hi Bertrand, > > On 27/03/2025 08:25, Bertrand Marquis wrote: >>> On 27 Mar 2025, at 00:14, Julien Grall <julien@xxxxxxx> wrote: >>>> +static int32_t ffa_get_sp_partinfo(uint32_t *uuid, uint32_t *sp_count, >>>> + void *dst_buf, void *end_buf, >>>> + uint32_t dst_size) >>>> { >>>> int32_t ret; >>>> + uint32_t src_size, real_sp_count; >>>> + void *src_buf = ffa_rx; >>>> + uint32_t count = 0; >>>> + >>>> + /* Do we have a RX buffer with the SPMC */ >>>> + if ( !ffa_rx ) >>>> + return FFA_RET_DENIED; >>>> + >>>> + /* We need to use the RX buffer to receive the list */ >>>> + spin_lock(&ffa_rx_buffer_lock); >>>> + >>>> + ret = ffa_partition_info_get(uuid, 0, &real_sp_count, &src_size); >>>> + if ( ret ) >>>> + goto out; >>>> + >>>> + /* We now own the RX buffer */ >>>> + >>>> + /* We only support a 1.1 firmware version */ >>>> + if ( src_size < sizeof(struct ffa_partition_info_1_0) ) >>>> + { >>>> + ret = FFA_RET_NOT_SUPPORTED; >>>> + goto out_release; >>>> + } >>>> + >>>> + for ( uint32_t sp_num = 0; sp_num < real_sp_count; sp_num++ ) >>> >>> What's the upper limit of real_sp_count? Asking just in case we need to >>> handle preemption. >> In theory that would be 32k but in practice the number of entries we can >> receive is >> limited by the size of the exchange area we have with the secure world. >> This area is currently defined to be one page and each entry is 8 byte in the >> case where firmware is 1.0 (24 bytes otherwise). >> This is an upper limit of 500 entries. >> Now I do think this is completely unrealistic to imagine a secure world with >> 500 SPs >> so If you are ok I would rather define an upper limit in Xen (I would say 64 >> SPs) that >> can be changed in the code (through a define). >> This call currently does not support preemption in the FF-A spec (and that >> is something >> i will check for future versions) so I would have no solution to "continue" >> it. > >> Would the "define" solution be acceptable for now ? > > I think the define solution is acceptable for now and possibly longer. It is > an easy way to avoid dealing with preemption. I will do something with a default value of 64 which should fit for now (and maybe longer). > > [...] > > >>>> +static uint32_t ffa_get_vm_count(void) >>> >>> Is this meant to be called often? If so, can we instead have a counter that >>> will be incremented when the vTEE is first initialized and then decremented >>> when the VM is destroyed? >> As of now we could have a global counter that we increase or decrease >> when a domain version is negociated and when a domain is destroyed. >> We could also have some kind of global save of the result to be returned >> to a guest. >> But I did not do that because: >> - cpu time required to update the list would be taken out an FF-A call >> for FFA_VERSION of a VM which would require a global lock to protect >> the data > > I would have thought an atomic counter would be sufficient. Is there anything > you had in mind? Very good idea. I only need to increase it when an FFA_VERSION has been negociated and decrease on VM destruction. I will do that. > >> - when we will have filtering the data will be per VM (which would make >> the initial update more complex) >> - incoming we have a notion of UUID and filtering depending on the >> requested UUID which will make the global value only useable in a >> limited number of cases. >> I have 2 pending series on top of this one which would have to remove >> such optimisations. >> At the end this is definitely not something supposed to call often (linux >> driver is calling it once during init). > > I think it was a mistake for me to asked whether this is called often or not. > When it comes to security, what matter is whether a malicious guest could > indirectly call ffa_get_vm_count() and delay any work on the pCPU (Xen is not > preemptible). > > We don't have to resolve this now. But this will need to be addressed before > we can we consider FFA security supported. So we should at least add it in > the list of issue at the top of the file. No this is really useful and I will fix it and also the partition info part because: - all information is read only and known when the VM is created (VM ID, max vcpus and 64bit or not) - I do not need anything else than that to build the result - If we can prevent to take a lock this will make the code better. So I will: - add an atomic to count the number of VMs with FF-A - create a chain list of VM FF-A contexts - add a context to the chain when a version is negociated - put the infos i need in the ffa ctx structure - just go through the list to build the partinfo result > >>> >>>> +{ >>>> + struct domain *d = current->domain; >>>> + struct domain *dom; >>> >>> NIT: "d" and "dom" are a bit too close. Could we rename "d" with "curr_d"? >> i will go with curr_d dest_d to make this clearer. >>> >>>> + uint32_t vm_count = 0; >>>> + >>>> + /* Count the number of VM with FF-A support */ >>> >>> This comment implies this is including the current VM. But ... >>> >>>> + rcu_read_lock(&domlist_read_lock); >>>> + for_each_domain( dom ) >>>> + { >>>> + struct ffa_ctx *vm = dom->arch.tee; >>>> + >>>> + if ( dom != d && vm != NULL && vm->guest_vers != 0 ) >>> >>> ... here you are excluding it. Also, it sounds like this is support by the >>> OS rather than the VM itself. Is that correct? >> I have a comment to explain that one in a different serie that i will put >> here. > > > Basically before 1.2, the spec was a bit blurry on if or not the result > > > should include the >> calling VM and in fact Linux driver (before 1.2) was ending with an error if >> its own data >> was included in the result hence this filter. > > Thanks for the clarification. Just to clarify... > >> I will add a comment for that. > > ... will the comment be added in this patch? Yes i will add the comment in the next version of the patch. > >>> >>>> + vm_count++;> + } >>>> + rcu_read_unlock(&domlist_read_lock); >>>> +> + return vm_count; >>> >>> OOI, I guess this value is just used as an hint? Asking because the number >>> of domains can change at any point. >> Definitely yes. The data is what it is when called but anything could change >> after. >> This is mostly used as hint by callers. > > Does this mean we would always return a fixed number? Asking because this > would solve nicely the preemption problem in ffa_get_vm_count(). Well the number is changing when VMs are created or destroyed but as explain earlier i will modify the design to prevent the lock using an atomic and a chain list. Now the problem of the potential high number of VMs still stand so I will add a todo for that and discuss with others to check if this could be solved in the FF-A spec in the feature. Thanks a lot for the comments. I will work on v4 for when you get back :-) Cheers Bertrand
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |