|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v7 09/12] tools: add physinfo arch_capabilities handling for Arm
> On 25 May 2023, at 10:21, Luca Fancellu <Luca.Fancellu@xxxxxxx> wrote:
>
>>>
>>> (...)
>>>
>>>> diff --git a/tools/python/xen/lowlevel/xc/xc.c
>>>> b/tools/python/xen/lowlevel/xc/xc.c
>>>> index 9728b34185ac..b3699fdac58e 100644
>>>> --- a/tools/python/xen/lowlevel/xc/xc.c
>>>> +++ b/tools/python/xen/lowlevel/xc/xc.c
>>>> @@ -22,6 +22,7 @@
>>>> #include <xen/hvm/hvm_info_table.h>
>>>> #include <xen/hvm/params.h>
>>>>
>>>> +#include <xen-tools/arm-arch-capabilities.h>
>>>> #include <xen-tools/common-macros.h>
>>>>
>>>> /* Needed for Python versions earlier than 2.3. */
>>>> @@ -897,7 +898,7 @@ static PyObject *pyxc_physinfo(XcObject *self)
>>>> if ( p != virt_caps )
>>>> *(p-1) = '\0';
>>>>
>>>> - return Py_BuildValue("{s:i,s:i,s:i,s:i,s:l,s:l,s:l,s:i,s:s,s:s}",
>>>> + return Py_BuildValue("{s:i,s:i,s:i,s:i,s:l,s:l,s:l,s:i,s:s,s:s,s:I}",
>>>> "nr_nodes", pinfo.nr_nodes,
>>>> "threads_per_core", pinfo.threads_per_core,
>>>> "cores_per_socket", pinfo.cores_per_socket,
>>>> @@ -907,7 +908,10 @@ static PyObject *pyxc_physinfo(XcObject *self)
>>>> "scrub_memory",
>>>> pages_to_kib(pinfo.scrub_pages),
>>>> "cpu_khz", pinfo.cpu_khz,
>>>> "hw_caps", cpu_cap,
>>>> - "virt_caps", virt_caps);
>>>> + "virt_caps", virt_caps,
>>>> + "arm_sve_vl",
>>>> +
>>>> arch_capabilities_arm_sve(pinfo.arch_capabilities)
>>>> + );
>>>
>>> This should be added only when building for ARM, similar as for other
>>> bindings.
>>
>> Hi Marek,
>>
>> Thank you for taking the time to review this, are you ok if I make these
>> changes to the code?
>>
>> diff --git a/tools/python/xen/lowlevel/xc/xc.c
>> b/tools/python/xen/lowlevel/xc/xc.c
>> index b3699fdac58e..c7f690189770 100644
>> --- a/tools/python/xen/lowlevel/xc/xc.c
>> +++ b/tools/python/xen/lowlevel/xc/xc.c
>> @@ -872,6 +872,8 @@ static PyObject *pyxc_physinfo(XcObject *self)
>> const char *virtcap_names[] = { "hvm", "pv" };
>> const unsigned virtcaps_bits[] = { XEN_SYSCTL_PHYSCAP_hvm,
>> XEN_SYSCTL_PHYSCAP_pv };
>> + PyObject *objret;
>> + int retcode;
>>
>> if ( xc_physinfo(self->xc_handle, &pinfo) != 0 )
>> return pyxc_error_to_exception(self->xc_handle);
>> @@ -898,20 +900,31 @@ static PyObject *pyxc_physinfo(XcObject *self)
>> if ( p != virt_caps )
>> *(p-1) = '\0';
>>
>> - return Py_BuildValue("{s:i,s:i,s:i,s:i,s:l,s:l,s:l,s:i,s:s,s:s,s:I}",
>> - "nr_nodes", pinfo.nr_nodes,
>> - "threads_per_core", pinfo.threads_per_core,
>> - "cores_per_socket", pinfo.cores_per_socket,
>> - "nr_cpus", pinfo.nr_cpus,
>> - "total_memory",
>> pages_to_kib(pinfo.total_pages),
>> - "free_memory",
>> pages_to_kib(pinfo.free_pages),
>> - "scrub_memory",
>> pages_to_kib(pinfo.scrub_pages),
>> - "cpu_khz", pinfo.cpu_khz,
>> - "hw_caps", cpu_cap,
>> - "virt_caps", virt_caps,
>> - "arm_sve_vl",
>> -
>> arch_capabilities_arm_sve(pinfo.arch_capabilities)
>> + objret = Py_BuildValue("{s:i,s:i,s:i,s:i,s:l,s:l,s:l,s:i,s:s,s:s}",
>> + "nr_nodes", pinfo.nr_nodes,
>> + "threads_per_core", pinfo.threads_per_core,
>> + "cores_per_socket", pinfo.cores_per_socket,
>> + "nr_cpus", pinfo.nr_cpus,
>> + "total_memory",
>> pages_to_kib(pinfo.total_pages),
>> + "free_memory",
>> pages_to_kib(pinfo.free_pages),
>> + "scrub_memory",
>> pages_to_kib(pinfo.scrub_pages),
>> + "cpu_khz", pinfo.cpu_khz,
>> + "hw_caps", cpu_cap,
>> + "virt_caps", virt_caps
>> );
>> +
>> + #if defined(__aarch64__)
>> + if (objret) {
>> + retcode = PyDict_SetItemString(
>> + objret, "arm_sve_vl",
>> +
>> arch_capabilities_arm_sve(pinfo.arch_capabilities)
>> + );
>> + if ( retcode < 0 )
>> + return NULL;
>> + }
>> + #endif
>> +
>> + return objret;
>> }
>>
>> static PyObject *pyxc_getcpuinfo(XcObject *self, PyObject *args, PyObject
>> *kwds)
>>
>>
>> Please notice that now we can have a path that could return NULL, are you ok
>> for
>> It or should I just ignore the return code for PyDict_SetItemString?
>>
>> Also, do you want me to protect the include to
>> <xen-tools/arm-arch-capabilities.h>
>> with ifdef?
>>
>
> EDIT: I saw this doesn’t even compile, I will ask later when I will have
> something working,
> I saw PyDict_SetItemString is used somewhere else so I will use that approach
> before
> Proposing you a solution
>
>
Ok, so this is my proposed solution:
diff --git a/tools/python/xen/lowlevel/xc/xc.c
b/tools/python/xen/lowlevel/xc/xc.c
index b3699fdac58e..e52aa88f3c5f 100644
--- a/tools/python/xen/lowlevel/xc/xc.c
+++ b/tools/python/xen/lowlevel/xc/xc.c
@@ -872,6 +872,7 @@ static PyObject *pyxc_physinfo(XcObject *self)
const char *virtcap_names[] = { "hvm", "pv" };
const unsigned virtcaps_bits[] = { XEN_SYSCTL_PHYSCAP_hvm,
XEN_SYSCTL_PHYSCAP_pv };
+ PyObject *objret;
if ( xc_physinfo(self->xc_handle, &pinfo) != 0 )
return pyxc_error_to_exception(self->xc_handle);
@@ -898,20 +899,36 @@ static PyObject *pyxc_physinfo(XcObject *self)
if ( p != virt_caps )
*(p-1) = '\0';
- return Py_BuildValue("{s:i,s:i,s:i,s:i,s:l,s:l,s:l,s:i,s:s,s:s,s:I}",
- "nr_nodes", pinfo.nr_nodes,
- "threads_per_core", pinfo.threads_per_core,
- "cores_per_socket", pinfo.cores_per_socket,
- "nr_cpus", pinfo.nr_cpus,
- "total_memory",
pages_to_kib(pinfo.total_pages),
- "free_memory", pages_to_kib(pinfo.free_pages),
- "scrub_memory",
pages_to_kib(pinfo.scrub_pages),
- "cpu_khz", pinfo.cpu_khz,
- "hw_caps", cpu_cap,
- "virt_caps", virt_caps,
- "arm_sve_vl",
-
arch_capabilities_arm_sve(pinfo.arch_capabilities)
+ objret = Py_BuildValue("{s:i,s:i,s:i,s:i,s:l,s:l,s:l,s:i,s:s,s:s}",
+ "nr_nodes", pinfo.nr_nodes,
+ "threads_per_core", pinfo.threads_per_core,
+ "cores_per_socket", pinfo.cores_per_socket,
+ "nr_cpus", pinfo.nr_cpus,
+ "total_memory", pages_to_kib(pinfo.total_pages),
+ "free_memory", pages_to_kib(pinfo.free_pages),
+ "scrub_memory", pages_to_kib(pinfo.scrub_pages),
+ "cpu_khz", pinfo.cpu_khz,
+ "hw_caps", cpu_cap,
+ "virt_caps", virt_caps
);
+
+ #if defined(__aarch64__)
+ if ( objret ) {
+ unsigned int sve_vl_bits;
+ PyObject *py_arm_sve_vl;
+
+ sve_vl_bits = arch_capabilities_arm_sve(pinfo.arch_capabilities);
+ py_arm_sve_vl = PyLong_FromUnsignedLong(sve_vl_bits);
+
+ if ( !py_arm_sve_vl )
+ return NULL;
+
+ if( PyDict_SetItemString(objret, "arm_sve_vl", py_arm_sve_vl) )
+ return NULL;
+ }
+ #endif
+
+ return objret;
}
static PyObject *pyxc_getcpuinfo(XcObject *self, PyObject *args, PyObject
*kwds)
Would it work for you?
>
>>>
>>>> }
>>>>
>>>> static PyObject *pyxc_getcpuinfo(XcObject *self, PyObject *args, PyObject
>>>> *kwds)
>>>
>>> --
>>> Best Regards,
>>> Marek Marczykowski-Górecki
>>> Invisible Things Lab
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |