[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4] x86: irq: Do not BUG_ON multiple unbind calls for shared pirqs
On 09.03.2020 18:47, Paul Durrant wrote: >> -----Original Message----- >> From: Jan Beulich <jbeulich@xxxxxxxx> >> Sent: 09 March 2020 16:29 >> >> On 06.03.2020 17:02, paul@xxxxxxx wrote: >>> --- a/xen/arch/x86/irq.c >>> +++ b/xen/arch/x86/irq.c >>> @@ -1680,9 +1680,23 @@ static irq_guest_action_t *__pirq_guest_unbind( >>> >>> BUG_ON(!(desc->status & IRQ_GUEST)); >>> >>> - for ( i = 0; (i < action->nr_guests) && (action->guest[i] != d); i++ ) >>> - continue; >>> - BUG_ON(i == action->nr_guests); >>> + for ( i = 0; i < action->nr_guests; i++ ) >>> + if ( action->guest[i] == d ) >>> + break; >>> + >>> + if ( i == action->nr_guests ) /* No matching entry */ >>> + { >>> + /* >>> + * In case the pirq was shared, unbound for this domain in an >>> earlier >>> + * call, but still existed on the domain's pirq_tree, we still >>> reach >>> + * here if there are any later unbind calls on the same pirq. >>> Return >>> + * if such an unbind happens. >>> + */ >>> + ASSERT(action->shareable); >>> + return NULL; >>> + } >>> + >>> + ASSERT(action->nr_guests > 0); >> >> This seems pointless to have here - v3 had it inside the if(), >> where it would actually guard against coming here with nr_guests >> equal to zero. > > Why. The code just after this decrements nr_guests so it seems > like entirely the right point to have the ASSERT. I can make it > ASSERT >= 0, if that makes more sense. There's no way to come here when nr_guests == 0. This is because in this case the loop will be exited with i being zero, and hence the earlier if()'s body will be entered. (And no, >= 0 wouldn't make sense to me - it would mean we might have a count of -1 after the decrement.) >> v3 also used if() and BUG() instead of ASSERT() >> inside this if(), which to me would seem more in line with our >> current ./CODING_STYLE guidelines of handling unexpected >> conditions. Could you clarify why you switched things? >> > > Because I don't think there is need to kill the host in a > non-debug context if we hit this condition; it is entirely > survivable as far as I can tell so a BUG_ON() did not seem > appropriate. It'll mean we have a non-sharable IRQ in a place where this is not supposed to happen. How can we be sure the system is in a state allowing to safely continue? To me, if shareable / non- shareable is of any concern here, then it ought to be BUG(). If it's not, then the ASSERT() ought to be dropped as well. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |