[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [XEN PATCH v3 5/5] xen/arm: ffa: support notification
Hi Bertrand, On Mon, Apr 29, 2024 at 9:20 AM Bertrand Marquis <Bertrand.Marquis@xxxxxxx> wrote: [...] > >> +static void notif_irq_handler(int irq, void *data) > >> +{ > >> + const struct arm_smccc_1_2_regs arg = { > >> + .a0 = FFA_NOTIFICATION_INFO_GET_64, > >> + }; > >> + struct arm_smccc_1_2_regs resp; > >> + unsigned int id_pos; > >> + unsigned int list_count; > >> + uint64_t ids_count; > >> + unsigned int n; > >> + int32_t res; > >> + > >> + do { > >> + arm_smccc_1_2_smc(&arg, &resp); > >> + res = ffa_get_ret_code(&resp); > >> + if ( res ) > >> + { > >> + if ( res != FFA_RET_NO_DATA ) > >> + printk(XENLOG_ERR "ffa: notification info get failed: > >> error %d\n", > >> + res); > >> + return; > >> + } > >> + > >> + ids_count = resp.a2 >> FFA_NOTIF_INFO_GET_ID_LIST_SHIFT; > >> + list_count = ( resp.a2 >> FFA_NOTIF_INFO_GET_ID_COUNT_SHIFT ) & > >> + FFA_NOTIF_INFO_GET_ID_COUNT_MASK; > >> + > >> + id_pos = 0; > >> + for ( n = 0; n < list_count; n++ ) > >> + { > >> + unsigned int count = ((ids_count >> 2 * n) & 0x3) + 1; > >> + struct domain *d; > >> + > >> + d = ffa_get_domain_by_vm_id(get_id_from_resp(&resp, id_pos)); > > > > Thinking a bit more about the question from Bertrand about get_domain_id() > > vs rcu_lock_domain_by_id(). I am actually not sure whether either are ok > > here. > > > > If I am not mistaken, d->arch.tee will be freed as part of the domain > > teardown process. This means you can have the following scenario: > > > > CPU0: ffa_get_domain_by_vm_id() (return the domain as it is alive) > > > > CPU1: call domain_kill() > > CPU1: teardown is called, free d->arch.tee (the pointer is not set to NULL) > > > > d->arch.tee is now a dangling pointer > > > > CPU0: access d->arch.tee > > > > This implies you may need to gain a global lock (I don't have a better idea > > so far) to protect the IRQ handler against domains teardown. > > > > Did I miss anything? > > I think you are right which is why I was thinking to use > rcu_lock_live_remote_domain_by_id to only get a reference > to the domain if it is not dying. > > From the comment in sched.h: > /* > * rcu_lock_domain_by_id() is more efficient than get_domain_by_id(). > * This is the preferred function if the returned domain reference > * is short lived, but it cannot be used if the domain reference needs > * to be kept beyond the current scope (e.g., across a softirq). > * The returned domain reference must be discarded using rcu_unlock_domain(). > */ > > Now the question of short lived should be challenged but I do not think we can > consider the current code as "long lived". > > It would be a good idea to start a mailing list thread discussion with other > maintainers on the subject to confirm. > @Jens: as i will be off for some time, would you mind doing it ? Sure, first I'll send out a new patch set with the current comments addressed. I'll update to use rcu_lock_live_remote_domain_by_id() both because it makes more sense than the current code, and also to have a good base for the discussion. Thanks, Jens
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |