forked from luck/tmp_suning_uos_patched
s390/protvirt: Add sysfs firmware interface for Ultravisor information
That information, e.g. the maximum number of guests or installed Ultravisor facilities, is interesting for QEMU, Libvirt and administrators. Let's provide an easily parsable API to get that information. Signed-off-by: Janosch Frank <frankja@linux.ibm.com> Reviewed-by: Cornelia Huck <cohuck@redhat.com> Reviewed-by: David Hildenbrand <david@redhat.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
This commit is contained in:
parent
084ea4d611
commit
a0f60f8431
|
@ -325,3 +325,90 @@ int arch_make_page_accessible(struct page *page)
|
|||
EXPORT_SYMBOL_GPL(arch_make_page_accessible);
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_PROTECTED_VIRTUALIZATION_GUEST) || IS_ENABLED(CONFIG_KVM)
|
||||
static ssize_t uv_query_facilities(struct kobject *kobj,
|
||||
struct kobj_attribute *attr, char *page)
|
||||
{
|
||||
return snprintf(page, PAGE_SIZE, "%lx\n%lx\n%lx\n%lx\n",
|
||||
uv_info.inst_calls_list[0],
|
||||
uv_info.inst_calls_list[1],
|
||||
uv_info.inst_calls_list[2],
|
||||
uv_info.inst_calls_list[3]);
|
||||
}
|
||||
|
||||
static struct kobj_attribute uv_query_facilities_attr =
|
||||
__ATTR(facilities, 0444, uv_query_facilities, NULL);
|
||||
|
||||
static ssize_t uv_query_max_guest_cpus(struct kobject *kobj,
|
||||
struct kobj_attribute *attr, char *page)
|
||||
{
|
||||
return snprintf(page, PAGE_SIZE, "%d\n",
|
||||
uv_info.max_guest_cpus);
|
||||
}
|
||||
|
||||
static struct kobj_attribute uv_query_max_guest_cpus_attr =
|
||||
__ATTR(max_cpus, 0444, uv_query_max_guest_cpus, NULL);
|
||||
|
||||
static ssize_t uv_query_max_guest_vms(struct kobject *kobj,
|
||||
struct kobj_attribute *attr, char *page)
|
||||
{
|
||||
return snprintf(page, PAGE_SIZE, "%d\n",
|
||||
uv_info.max_num_sec_conf);
|
||||
}
|
||||
|
||||
static struct kobj_attribute uv_query_max_guest_vms_attr =
|
||||
__ATTR(max_guests, 0444, uv_query_max_guest_vms, NULL);
|
||||
|
||||
static ssize_t uv_query_max_guest_addr(struct kobject *kobj,
|
||||
struct kobj_attribute *attr, char *page)
|
||||
{
|
||||
return snprintf(page, PAGE_SIZE, "%lx\n",
|
||||
uv_info.max_sec_stor_addr);
|
||||
}
|
||||
|
||||
static struct kobj_attribute uv_query_max_guest_addr_attr =
|
||||
__ATTR(max_address, 0444, uv_query_max_guest_addr, NULL);
|
||||
|
||||
static struct attribute *uv_query_attrs[] = {
|
||||
&uv_query_facilities_attr.attr,
|
||||
&uv_query_max_guest_cpus_attr.attr,
|
||||
&uv_query_max_guest_vms_attr.attr,
|
||||
&uv_query_max_guest_addr_attr.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct attribute_group uv_query_attr_group = {
|
||||
.attrs = uv_query_attrs,
|
||||
};
|
||||
|
||||
static struct kset *uv_query_kset;
|
||||
static struct kobject *uv_kobj;
|
||||
|
||||
static int __init uv_info_init(void)
|
||||
{
|
||||
int rc = -ENOMEM;
|
||||
|
||||
if (!test_facility(158))
|
||||
return 0;
|
||||
|
||||
uv_kobj = kobject_create_and_add("uv", firmware_kobj);
|
||||
if (!uv_kobj)
|
||||
return -ENOMEM;
|
||||
|
||||
uv_query_kset = kset_create_and_add("query", NULL, uv_kobj);
|
||||
if (!uv_query_kset)
|
||||
goto out_kobj;
|
||||
|
||||
rc = sysfs_create_group(&uv_query_kset->kobj, &uv_query_attr_group);
|
||||
if (!rc)
|
||||
return 0;
|
||||
|
||||
kset_unregister(uv_query_kset);
|
||||
out_kobj:
|
||||
kobject_del(uv_kobj);
|
||||
kobject_put(uv_kobj);
|
||||
return rc;
|
||||
}
|
||||
device_initcall(uv_info_init);
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue
Block a user