|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: Questions about Cx and Px state uploading from dom0
On Wed, Apr 06, 2022 at 05:51:06PM +0200, Jan Beulich wrote:
> On 06.04.2022 17:09, Roger Pau Monné wrote:
> > On Wed, Apr 06, 2022 at 02:47:38PM +0200, Jan Beulich wrote:
> >> On 06.04.2022 12:38, Roger Pau Monné wrote:
> >>> On Wed, Apr 06, 2022 at 10:13:41AM +0200, Jan Beulich wrote:
> >>>> On 23.03.2022 09:54, Roger Pau Monné wrote:
> >>>>> Hello,
> >>>>>
> >>>>> I was looking at implementing ACPI Cx and Px state uploading from
> >>>>> FreeBSD dom0, as my main test box is considerably slower without Xen
> >>>>> knowing about the Px states. That has raised a couple of questions.
> >>>>>
> >>>>> 1. How to figure out what features to report available by OSPM when
> >>>>> calling the _PDC (or _OSC) ACPI method. I'm confused by the usage of
> >>>>> this from Linux: it seems to be used to detect mwait support in
> >>>>> xen_check_mwait but not when calling _PDC (ie: in
> >>>>> acpi_processor_set_pdc). I'm also not sure what the hypercall expects
> >>>>> the caller to provide. Should buf[2] be set to all the possible
> >>>>> features supported by the OS and Xen will trim those as required?
> >>>>
> >>>> I'm afraid upstream Linux doesn't quite use this as originally
> >>>> intended. Consulting my most recent (but meanwhile quite old) forward
> >>>> port tree of XenoLinux that I still have readily available, I find in
> >>>> drivers/acpi/processor_pdc.c:
> >>>>
> >>>> static acpi_status
> >>>> acpi_processor_eval_pdc(acpi_handle handle, struct acpi_object_list
> >>>> *pdc_in)
> >>>> {
> >>>> acpi_status status = AE_OK;
> >>>>
> >>>> #ifndef CONFIG_XEN
> >>>> if (boot_option_idle_override == IDLE_NOMWAIT) {
> >>>> /*
> >>>> * If mwait is disabled for CPU C-states, the C2C3_FFH access
> >>>> * mode will be disabled in the parameter of _PDC object.
> >>>> * Of course C1_FFH access mode will also be disabled.
> >>>> */
> >>>> #else
> >>>> {
> >>>> struct xen_platform_op op;
> >>>> #endif
> >>>> union acpi_object *obj;
> >>>> u32 *buffer = NULL;
> >>>>
> >>>> obj = pdc_in->pointer;
> >>>> buffer = (u32 *)(obj->buffer.pointer);
> >>>> #ifndef CONFIG_XEN
> >>>> buffer[2] &= ~(ACPI_PDC_C_C2C3_FFH | ACPI_PDC_C_C1_FFH);
> >>>> #else
> >>>> op.cmd = XENPF_set_processor_pminfo;
> >>>> op.u.set_pminfo.id = -1;
> >>>> op.u.set_pminfo.type = XEN_PM_PDC;
> >>>> set_xen_guest_handle(op.u.set_pminfo.u.pdc, buffer);
> >>>> VOID(HYPERVISOR_platform_op(&op));
> >>>> #endif
> >>>> }
> >>>> status = acpi_evaluate_object(handle, "_PDC", pdc_in, NULL);
> >>>>
> >>>> if (ACPI_FAILURE(status))
> >>>> ACPI_DEBUG_PRINT((ACPI_DB_INFO,
> >>>> "Could not evaluate _PDC, using legacy perf. control.\n"));
> >>>>
> >>>> return status;
> >>>> }
> >>>>
> >>>> (This is a 4.4-based tree, for reference.)
> >>>>
> >>>> IOW the buffer is passed to Xen for massaging before invoking _PDC.
> >>>
> >>> Indeed. I'm however confused by what should be pre-filled into the
> >>> buffer by the OS. _PDC is about the processor driver power management
> >>> support, and none of this power management is done by the OS (I don't
> >>> plan to let FreeBSD do CPU power management when running as hardware
> >>> domain), so IMO passing an empty buffer and letting Xen fill it is the
> >>> correct thing to do, at least for the use-case in FreeBSD.
> >>
> >> I don't think that would work: Xen doesn't "fill in" the buffer, but
> >> merely alters individual bits. The buffer really is IN/OUT here for
> >> Xen.
> >
> > Hm, but I have no idea what to put here from FreeBSD PoV, as said
> > FreeBSD will only use the processor object to upload the required data
> > to Xen, but won't attach any driver itself.
> >
> > I've so far been providing an empty buffer to Xen and it does seem to
> > set the right flags so that the Cx and Px states can be fetched
> > afterwards.
>
> Hmm, an empty buffer should result in -EINVAL from the hypercall.
> The first of the three uint32_t-s should be 1 (ACPI_PDC_REVISION_ID)
> and the 2nd (size) is supposed to be non-zero.
Right, I guess I was too simplistic here. I'm passing a buffer with
{1, 1, 0}, so no features added by the OS (because it won't attach any
driver to the processor object).
Thanks, Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |