On Mon, 30 Nov 2020 19:18:30 -0500
Tony Krowiak <akrow...@linux.ibm.com> wrote:

> >>>> +static bool vfio_ap_assign_apid_to_apcb(struct ap_matrix_mdev 
> >>>> *matrix_mdev,
> >>>> +                                        unsigned long apid)
> >>>> +{
> >>>> +        unsigned long apqi, apqn;
> >>>> +        unsigned long *aqm = matrix_mdev->shadow_apcb.aqm;
> >>>> +
> >>>> +        /*
> >>>> +         * If the APID is already assigned to the guest's shadow APCB, 
> >>>> there is
> >>>> +         * no need to assign it.
> >>>> +         */
> >>>> +        if (test_bit_inv(apid, matrix_mdev->shadow_apcb.apm))
> >>>> +                return false;
> >>>> +
> >>>> +        /*
> >>>> +         * If no domains have yet been assigned to the shadow APCB and 
> >>>> one or
> >>>> +         * more domains have been assigned to the matrix mdev, then use
> >>>> +         * the domains assigned to the matrix mdev; otherwise, there is 
> >>>> nothing
> >>>> +         * to assign to the shadow APCB.
> >>>> +         */
> >>>> +        if (bitmap_empty(matrix_mdev->shadow_apcb.aqm, AP_DOMAINS)) {
> >>>> +                if (bitmap_empty(matrix_mdev->matrix.aqm, AP_DOMAINS))
> >>>> +                        return false;
> >>>> +
> >>>> +                aqm = matrix_mdev->matrix.aqm;
> >>>> +        }
> >>>> +
> >>>> +        /* Make sure all APQNs are bound to the vfio_ap driver */
> >>>> +        for_each_set_bit_inv(apqi, aqm, AP_DOMAINS) {
> >>>> +                apqn = AP_MKQID(apid, apqi);
> >>>> +
> >>>> +                if (vfio_ap_mdev_get_queue(matrix_mdev, apqn) == NULL)
> >>>> +                        return false;
> >>>> +        }
> >>>> +
> >>>> +        set_bit_inv(apid, matrix_mdev->shadow_apcb.apm);
> >>>> +
> >>>> +        /*
> >>>> +         * If we verified APQNs using the domains assigned to the 
> >>>> matrix mdev,
> >>>> +         * then copy the APQIs of those domains into the guest's APCB
> >>>> +         */
> >>>> +        if (bitmap_empty(matrix_mdev->shadow_apcb.aqm, AP_DOMAINS))
> >>>> +                bitmap_copy(matrix_mdev->shadow_apcb.aqm,
> >>>> +                            matrix_mdev->matrix.aqm, AP_DOMAINS);
> >>>> +
> >>>> +        return true;
> >>>> +}  
> >>> What is the rationale behind the shadow aqm empty special handling?  
> >> The rationale was to avoid taking the VCPUs
> >> out of SIE in order to make an update to the guest's APCB
> >> unnecessarily. For example, suppose the guest is started
> >> without access to any APQNs (i.e., all matrix and shadow_apcb
> >> masks are zeros). Now suppose the administrator proceeds to
> >> start assigning AP resources to the mdev. Let's say he starts
> >> by assigning adapters 1 through 100. The code below will return
> >> true indicating the shadow_apcb was updated. Consequently,
> >> the calling code will commit the changes to the guest's
> >> APCB. The problem there is that in order to update the guest's
> >> VCPUs, they will have to be taken out of SIE, yet the guest will
> >> not get access to the adapter since no domains have yet been
> >> assigned to the APCB. Doing this 100 times - once for each
> >> adapter 1-100 - is probably a bad idea.
> >>  
> > Not yanking the VCPUs out of SIE does make a lot of sense. At least
> > I understand your motivation now. I will think some more about this,
> > but in the meanwhile, please try to answer one more question (see
> > below).
> >     
> >>>    I.e.
> >>> why not simply:
> >>>
> >>>
> >>> static bool vfio_ap_assign_apid_to_apcb(struct ap_matrix_mdev 
> >>> *matrix_mdev,
> >>>                                           unsigned long apid)
> >>> {
> >>>           unsigned long apqi, apqn;
> >>>           unsigned long *aqm = matrix_mdev->shadow_apcb.aqm;
> >>>                                                                           
> >>>         
> >>>           /*
> >>>            * If the APID is already assigned to the guest's shadow APCB, 
> >>> there is
> >>>            * no need to assign it.
> >>>            */
> >>>           if (test_bit_inv(apid, matrix_mdev->shadow_apcb.apm))
> >>>                   return false;
> >>>                                                                           
> >>>         
> >>>           /* Make sure all APQNs are bound to the vfio_ap driver */
> >>>           for_each_set_bit_inv(apqi, aqm, AP_DOMAINS) {
> >>>                   apqn = AP_MKQID(apid, apqi);
> >>>                                                                           
> >>>         
> >>>                   if (vfio_ap_mdev_get_queue(matrix_mdev, apqn) == NULL)
> >>>                           return false;
> >>>           }
> >>>                                                                           
> >>>         
> >>>           set_bit_inv(apid, matrix_mdev->shadow_apcb.apm);
> >>>                                                                           
> >>>         
> >>>           return true;  
> > Would
> > s/return true/return !bitmap_empty(matrix_mdev->shadow_apcb.aqm,
> > AP_DOMAINS)/
> > do the trick?
> >
> > I mean if empty, then we would not commit the APCB, so we would
> > not take the vCPUs out of SIE -- see below.  
> 
> At first glance I'd say yes, it does the trick; but, I need to consider
> all possible scenarios. For example, that will work fine when someone
> either assigns all of the adapters or all of the domains first, then assigns
> the other.

Maybe I can help you. The only caveat I have in mind is the show of the
guest_matrix attribute. We probably don't want to display adapters
without domains and vice-versa. But that can be easily handled with
a flag.

Regards,
Halil

Reply via email to