sysctl: add sysctl interface for querying PCI topology

Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Acked-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
This commit is contained in:
Boris Ostrovsky authored and Jan Beulich committed 2015-05-08 11:02:41 +02:00
1 parent 06615b0de0
commit 61319fbfd9
4 files changed
+84

No files matched your search

+55
View File
@@ -412,6 +412,61 @@ long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl)
break;
#endif
#ifdef HAS_PCI
case XEN_SYSCTL_pcitopoinfo:
{
xen_sysctl_pcitopoinfo_t *ti = &op->u.pcitopoinfo;
unsigned int i = 0;
if ( guest_handle_is_null(ti->devs) ||
guest_handle_is_null(ti->nodes) )
{
ret = -EINVAL;
break;
}
while ( i < ti->num_devs )
{
physdev_pci_device_t dev;
uint32_t node;
const struct pci_dev *pdev;
if ( copy_from_guest_offset(&dev, ti->devs, i, 1) )
{
ret = -EFAULT;
break;
}
spin_lock(&pcidevs_lock);
pdev = pci_get_pdev(dev.seg, dev.bus, dev.devfn);
if ( !pdev )
node = XEN_INVALID_DEV;
else if ( pdev->node == NUMA_NO_NODE )
node = XEN_INVALID_NODE_ID;
else
node = pdev->node;
spin_unlock(&pcidevs_lock);
if ( copy_to_guest_offset(ti->nodes, i, &node, 1) )
{
ret = -EFAULT;
break;
}
if ( (++i > 0x3f) && hypercall_preempt_check() )
break;
}
if ( !ret && (ti->num_devs != i) )
{
ti->num_devs = i;
if ( __copy_field_to_guest(u_sysctl, op, u.pcitopoinfo.num_devs) )
ret = -EFAULT;
}
break;
}
#endif
default:
ret = arch_do_sysctl(op, u_sysctl);
copyback = 0;
+27
View File
@@ -33,6 +33,7 @@
#include "xen.h"
#include "domctl.h"
#include "physdev.h"
#define XEN_SYSCTL_INTERFACE_VERSION 0x0000000C
@@ -669,6 +670,30 @@ struct xen_sysctl_psr_cmt_op {
typedef struct xen_sysctl_psr_cmt_op xen_sysctl_psr_cmt_op_t;
DEFINE_XEN_GUEST_HANDLE(xen_sysctl_psr_cmt_op_t);
/* XEN_SYSCTL_pcitopoinfo */
#define XEN_INVALID_DEV (XEN_INVALID_NODE_ID - 1)
struct xen_sysctl_pcitopoinfo {
/*
* IN: Number of elements in 'pcitopo' and 'nodes' arrays.
* OUT: Number of processed elements of those arrays.
*/
uint32_t num_devs;
/* IN: list of devices for which node IDs are requested. */
XEN_GUEST_HANDLE_64(physdev_pci_device_t) devs;
/*
* OUT: node identifier for each device.
* If information for a particular device is not available then
* corresponding entry will be set to XEN_INVALID_NODE_ID. If
* device is not known to the hypervisor then XEN_INVALID_DEV
* will be provided.
*/
XEN_GUEST_HANDLE_64(uint32) nodes;
};
typedef struct xen_sysctl_pcitopoinfo xen_sysctl_pcitopoinfo_t;
DEFINE_XEN_GUEST_HANDLE(xen_sysctl_pcitopoinfo_t);
struct xen_sysctl {
uint32_t cmd;
#define XEN_SYSCTL_readconsole 1
@@ -691,12 +716,14 @@ struct xen_sysctl {
#define XEN_SYSCTL_scheduler_op 19
#define XEN_SYSCTL_coverage_op 20
#define XEN_SYSCTL_psr_cmt_op 21
#define XEN_SYSCTL_pcitopoinfo 22
uint32_t interface_version; /* XEN_SYSCTL_INTERFACE_VERSION */
union {
struct xen_sysctl_readconsole readconsole;
struct xen_sysctl_tbuf_op tbuf_op;
struct xen_sysctl_physinfo physinfo;
struct xen_sysctl_cputopoinfo cputopoinfo;
struct xen_sysctl_pcitopoinfo pcitopoinfo;
struct xen_sysctl_numainfo numainfo;
struct xen_sysctl_sched_id sched_id;
struct xen_sysctl_perfc_op perfc_op;
+1
View File
@@ -783,6 +783,7 @@ static int flask_sysctl(int cmd)
case XEN_SYSCTL_physinfo:
case XEN_SYSCTL_cputopoinfo:
case XEN_SYSCTL_numainfo:
case XEN_SYSCTL_pcitopoinfo:
return domain_has_xen(current->domain, XEN__PHYSINFO);
case XEN_SYSCTL_psr_cmt_op:
+1
View File
@@ -28,6 +28,7 @@ class xen
# XENPF_microcode_update
microcode
# XEN_SYSCTL_physinfo, XEN_SYSCTL_cputopoinfo, XEN_SYSCTL_numainfo
# XEN_SYSCTL_pcitopoinfo
physinfo
# XENPF_platform_quirk
quirk
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.