diff options
Diffstat (limited to 'arch/s390/hypfs/hypfs_vm.c')
| -rw-r--r-- | arch/s390/hypfs/hypfs_vm.c | 136 | 
1 files changed, 59 insertions, 77 deletions
diff --git a/arch/s390/hypfs/hypfs_vm.c b/arch/s390/hypfs/hypfs_vm.c index 26cf177f6a3..32040ace00e 100644 --- a/arch/s390/hypfs/hypfs_vm.c +++ b/arch/s390/hypfs/hypfs_vm.c @@ -1,7 +1,7 @@  /*   *    Hypervisor filesystem for Linux on s390. z/VM implementation.   * - *    Copyright (C) IBM Corp. 2006 + *    Copyright IBM Corp. 2006   *    Author(s): Michael Holzheu <holzheu@de.ibm.com>   */ @@ -20,8 +20,6 @@ static char local_guest[] = "        ";  static char all_guests[] = "*       ";  static char *guest_query; -static struct dentry *dbfs_d2fc_file; -  struct diag2fc_data {  	__u32 version;  	__u32 flags; @@ -34,7 +32,7 @@ struct diag2fc_data {  	__u32 pcpus;  	__u32 lcpus;  	__u32 vcpus; -	__u32 cpu_min; +	__u32 ocpus;  	__u32 cpu_max;  	__u32 cpu_shares;  	__u32 cpu_use_samp; @@ -104,21 +102,20 @@ static void *diag2fc_store(char *query, unsigned int *count, int offset)  	return data;  } -static void diag2fc_free(void *data) +static void diag2fc_free(const void *data)  {  	vfree(data);  } -#define ATTRIBUTE(sb, dir, name, member) \ +#define ATTRIBUTE(dir, name, member) \  do { \  	void *rc; \ -	rc = hypfs_create_u64(sb, dir, name, member); \ +	rc = hypfs_create_u64(dir, name, member); \  	if (IS_ERR(rc)) \  		return PTR_ERR(rc); \  } while(0) -static int hpyfs_vm_create_guest(struct super_block *sb, -				 struct dentry *systems_dir, +static int hpyfs_vm_create_guest(struct dentry *systems_dir,  				 struct diag2fc_data *data)  {  	char guest_name[NAME_LEN + 1] = {}; @@ -132,46 +129,51 @@ static int hpyfs_vm_create_guest(struct super_block *sb,  	memcpy(guest_name, data->guest_name, NAME_LEN);  	EBCASC(guest_name, NAME_LEN);  	strim(guest_name); -	guest_dir = hypfs_mkdir(sb, systems_dir, guest_name); +	guest_dir = hypfs_mkdir(systems_dir, guest_name);  	if (IS_ERR(guest_dir))  		return PTR_ERR(guest_dir); -	ATTRIBUTE(sb, guest_dir, "onlinetime_us", data->el_time); +	ATTRIBUTE(guest_dir, "onlinetime_us", data->el_time);  	/* logical cpu information */ -	cpus_dir = hypfs_mkdir(sb, guest_dir, "cpus"); +	cpus_dir = hypfs_mkdir(guest_dir, "cpus");  	if (IS_ERR(cpus_dir))  		return PTR_ERR(cpus_dir); -	ATTRIBUTE(sb, cpus_dir, "cputime_us", data->used_cpu); -	ATTRIBUTE(sb, cpus_dir, "capped", capped_value); -	ATTRIBUTE(sb, cpus_dir, "dedicated", dedicated_flag); -	ATTRIBUTE(sb, cpus_dir, "count", data->vcpus); -	ATTRIBUTE(sb, cpus_dir, "weight_min", data->cpu_min); -	ATTRIBUTE(sb, cpus_dir, "weight_max", data->cpu_max); -	ATTRIBUTE(sb, cpus_dir, "weight_cur", data->cpu_shares); +	ATTRIBUTE(cpus_dir, "cputime_us", data->used_cpu); +	ATTRIBUTE(cpus_dir, "capped", capped_value); +	ATTRIBUTE(cpus_dir, "dedicated", dedicated_flag); +	ATTRIBUTE(cpus_dir, "count", data->vcpus); +	/* +	 * Note: The "weight_min" attribute got the wrong name. +	 * The value represents the number of non-stopped (operating) +	 * CPUS. +	 */ +	ATTRIBUTE(cpus_dir, "weight_min", data->ocpus); +	ATTRIBUTE(cpus_dir, "weight_max", data->cpu_max); +	ATTRIBUTE(cpus_dir, "weight_cur", data->cpu_shares);  	/* memory information */ -	mem_dir = hypfs_mkdir(sb, guest_dir, "mem"); +	mem_dir = hypfs_mkdir(guest_dir, "mem");  	if (IS_ERR(mem_dir))  		return PTR_ERR(mem_dir); -	ATTRIBUTE(sb, mem_dir, "min_KiB", data->mem_min_kb); -	ATTRIBUTE(sb, mem_dir, "max_KiB", data->mem_max_kb); -	ATTRIBUTE(sb, mem_dir, "used_KiB", data->mem_used_kb); -	ATTRIBUTE(sb, mem_dir, "share_KiB", data->mem_share_kb); +	ATTRIBUTE(mem_dir, "min_KiB", data->mem_min_kb); +	ATTRIBUTE(mem_dir, "max_KiB", data->mem_max_kb); +	ATTRIBUTE(mem_dir, "used_KiB", data->mem_used_kb); +	ATTRIBUTE(mem_dir, "share_KiB", data->mem_share_kb);  	/* samples */ -	samples_dir = hypfs_mkdir(sb, guest_dir, "samples"); +	samples_dir = hypfs_mkdir(guest_dir, "samples");  	if (IS_ERR(samples_dir))  		return PTR_ERR(samples_dir); -	ATTRIBUTE(sb, samples_dir, "cpu_using", data->cpu_use_samp); -	ATTRIBUTE(sb, samples_dir, "cpu_delay", data->cpu_delay_samp); -	ATTRIBUTE(sb, samples_dir, "mem_delay", data->page_wait_samp); -	ATTRIBUTE(sb, samples_dir, "idle", data->idle_samp); -	ATTRIBUTE(sb, samples_dir, "other", data->other_samp); -	ATTRIBUTE(sb, samples_dir, "total", data->total_samp); +	ATTRIBUTE(samples_dir, "cpu_using", data->cpu_use_samp); +	ATTRIBUTE(samples_dir, "cpu_delay", data->cpu_delay_samp); +	ATTRIBUTE(samples_dir, "mem_delay", data->page_wait_samp); +	ATTRIBUTE(samples_dir, "idle", data->idle_samp); +	ATTRIBUTE(samples_dir, "other", data->other_samp); +	ATTRIBUTE(samples_dir, "total", data->total_samp);  	return 0;  } -int hypfs_vm_create_files(struct super_block *sb, struct dentry *root) +int hypfs_vm_create_files(struct dentry *root)  {  	struct dentry *dir, *file;  	struct diag2fc_data *data; @@ -183,38 +185,38 @@ int hypfs_vm_create_files(struct super_block *sb, struct dentry *root)  		return PTR_ERR(data);  	/* Hpervisor Info */ -	dir = hypfs_mkdir(sb, root, "hyp"); +	dir = hypfs_mkdir(root, "hyp");  	if (IS_ERR(dir)) {  		rc = PTR_ERR(dir);  		goto failed;  	} -	file = hypfs_create_str(sb, dir, "type", "z/VM Hypervisor"); +	file = hypfs_create_str(dir, "type", "z/VM Hypervisor");  	if (IS_ERR(file)) {  		rc = PTR_ERR(file);  		goto failed;  	}  	/* physical cpus */ -	dir = hypfs_mkdir(sb, root, "cpus"); +	dir = hypfs_mkdir(root, "cpus");  	if (IS_ERR(dir)) {  		rc = PTR_ERR(dir);  		goto failed;  	} -	file = hypfs_create_u64(sb, dir, "count", data->lcpus); +	file = hypfs_create_u64(dir, "count", data->lcpus);  	if (IS_ERR(file)) {  		rc = PTR_ERR(file);  		goto failed;  	}  	/* guests */ -	dir = hypfs_mkdir(sb, root, "systems"); +	dir = hypfs_mkdir(root, "systems");  	if (IS_ERR(dir)) {  		rc = PTR_ERR(dir);  		goto failed;  	}  	for (i = 0; i < count; i++) { -		rc = hpyfs_vm_create_guest(sb, dir, &(data[i])); +		rc = hpyfs_vm_create_guest(dir, &(data[i]));  		if (rc)  			goto failed;  	} @@ -239,43 +241,29 @@ struct dbfs_d2fc {  	char			buf[];	/* d2fc buffer */  } __attribute__ ((packed)); -static int dbfs_d2fc_open(struct inode *inode, struct file *file) +static int dbfs_diag2fc_create(void **data, void **data_free_ptr, size_t *size)  { -	struct dbfs_d2fc *data; +	struct dbfs_d2fc *d2fc;  	unsigned int count; -	data = diag2fc_store(guest_query, &count, sizeof(data->hdr)); -	if (IS_ERR(data)) -		return PTR_ERR(data); -	get_clock_ext(data->hdr.tod_ext); -	data->hdr.len = count * sizeof(struct diag2fc_data); -	data->hdr.version = DBFS_D2FC_HDR_VERSION; -	data->hdr.count = count; -	memset(&data->hdr.reserved, 0, sizeof(data->hdr.reserved)); -	file->private_data = data; -	return nonseekable_open(inode, file); -} - -static int dbfs_d2fc_release(struct inode *inode, struct file *file) -{ -	diag2fc_free(file->private_data); +	d2fc = diag2fc_store(guest_query, &count, sizeof(d2fc->hdr)); +	if (IS_ERR(d2fc)) +		return PTR_ERR(d2fc); +	get_tod_clock_ext(d2fc->hdr.tod_ext); +	d2fc->hdr.len = count * sizeof(struct diag2fc_data); +	d2fc->hdr.version = DBFS_D2FC_HDR_VERSION; +	d2fc->hdr.count = count; +	memset(&d2fc->hdr.reserved, 0, sizeof(d2fc->hdr.reserved)); +	*data = d2fc; +	*data_free_ptr = d2fc; +	*size = d2fc->hdr.len + sizeof(struct dbfs_d2fc_hdr);  	return 0;  } -static ssize_t dbfs_d2fc_read(struct file *file, char __user *buf, -				    size_t size, loff_t *ppos) -{ -	struct dbfs_d2fc *data = file->private_data; - -	return simple_read_from_buffer(buf, size, ppos, data, data->hdr.len + -				       sizeof(struct dbfs_d2fc_hdr)); -} - -static const struct file_operations dbfs_d2fc_ops = { -	.open		= dbfs_d2fc_open, -	.read		= dbfs_d2fc_read, -	.release	= dbfs_d2fc_release, -	.llseek		= no_llseek, +static struct hypfs_dbfs_file dbfs_file_2fc = { +	.name		= "diag_2fc", +	.data_create	= dbfs_diag2fc_create, +	.data_free	= diag2fc_free,  };  int hypfs_vm_init(void) @@ -288,18 +276,12 @@ int hypfs_vm_init(void)  		guest_query = local_guest;  	else  		return -EACCES; - -	dbfs_d2fc_file = debugfs_create_file("diag_2fc", 0400, hypfs_dbfs_dir, -					     NULL, &dbfs_d2fc_ops); -	if (IS_ERR(dbfs_d2fc_file)) -		return PTR_ERR(dbfs_d2fc_file); - -	return 0; +	return hypfs_dbfs_create_file(&dbfs_file_2fc);  }  void hypfs_vm_exit(void)  {  	if (!MACHINE_IS_VM)  		return; -	debugfs_remove(dbfs_d2fc_file); +	hypfs_dbfs_remove_file(&dbfs_file_2fc);  }  | 
