+ iseries-convert-to-proc_fops.patch added to -mm tree

Benjamin Herrenschmidt benh at kernel.crashing.org
Tue Dec 8 15:42:19 EST 2009


On Tue, 2009-12-01 at 14:05 -0800, akpm at linux-foundation.org wrote:
> The patch titled
>      iseries: convert to proc_fops
> has been added to the -mm tree.  Its filename is
>      iseries-convert-to-proc_fops.patch

I was looking at that patch since It was in my queue, and while I
have no firm objection, I started wondering what was the point :-)

IE. What does seq_file buys us here since the conversion adds more
code than it removes and adds a hope via kmalloc that isn't necessary
before the said conversion ?

Those files are only ever one line long (and one of them is only one
character) so the seq_file doesn't really gets us any benefit does it ?

Cheers,
Ben.

> Before you just go and hit "reply", please:
>    a) Consider who else should be cc'ed
>    b) Prefer to cc a suitable mailing list as well
>    c) Ideally: find the original patch on the mailing list and do a
>       reply-to-all to that, adding suitable additional cc's
> 
> *** Remember to use Documentation/SubmitChecklist when testing your code ***
> 
> See http://userweb.kernel.org/~akpm/stuff/added-to-mm.txt to find
> out what to do about this
> 
> The current -mm tree may be found at http://userweb.kernel.org/~akpm/mmotm/
> 
> ------------------------------------------------------
> Subject: iseries: convert to proc_fops
> From: Alexey Dobriyan <adobriyan at gmail.com>
> 
> Signed-off-by: Alexey Dobriyan <adobriyan at gmail.com>
> Cc: Benjamin Herrenschmidt <benh at kernel.crashing.org>
> Cc: Michael Ellerman <michael at ellerman.id.au>
> Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
> ---
> 
>  arch/powerpc/platforms/iseries/mf.c |  147 ++++++++++++++------------
>  1 file changed, 83 insertions(+), 64 deletions(-)
> 
> diff -puN arch/powerpc/platforms/iseries/mf.c~iseries-convert-to-proc_fops arch/powerpc/platforms/iseries/mf.c
> --- a/arch/powerpc/platforms/iseries/mf.c~iseries-convert-to-proc_fops
> +++ a/arch/powerpc/platforms/iseries/mf.c
> @@ -855,59 +855,58 @@ static int mf_get_boot_rtc(struct rtc_ti
>  }
>  
>  #ifdef CONFIG_PROC_FS
> -
> -static int proc_mf_dump_cmdline(char *page, char **start, off_t off,
> -		int count, int *eof, void *data)
> +static int mf_cmdline_proc_show(struct seq_file *m, void *v)
>  {
> -	int len;
> -	char *p;
> +	char *page, *p;
>  	struct vsp_cmd_data vsp_cmd;
>  	int rc;
>  	dma_addr_t dma_addr;
>  
>  	/* The HV appears to return no more than 256 bytes of command line */
> -	if (off >= 256)
> -		return 0;
> -	if ((off + count) > 256)
> -		count = 256 - off;
> +	page = kmalloc(256, GFP_KERNEL);
> +	if (!page)
> +		return -ENOMEM;
>  
> -	dma_addr = iseries_hv_map(page, off + count, DMA_FROM_DEVICE);
> -	if (dma_addr == DMA_ERROR_CODE)
> +	dma_addr = iseries_hv_map(page, 256, DMA_FROM_DEVICE);
> +	if (dma_addr == DMA_ERROR_CODE) {
> +		kfree(page);
>  		return -ENOMEM;
> -	memset(page, 0, off + count);
> +	}
> +	memset(page, 0, 256);
>  	memset(&vsp_cmd, 0, sizeof(vsp_cmd));
>  	vsp_cmd.cmd = 33;
>  	vsp_cmd.sub_data.kern.token = dma_addr;
>  	vsp_cmd.sub_data.kern.address_type = HvLpDma_AddressType_TceIndex;
> -	vsp_cmd.sub_data.kern.side = (u64)data;
> -	vsp_cmd.sub_data.kern.length = off + count;
> +	vsp_cmd.sub_data.kern.side = (u64)m->private;
> +	vsp_cmd.sub_data.kern.length = 256;
>  	mb();
>  	rc = signal_vsp_instruction(&vsp_cmd);
> -	iseries_hv_unmap(dma_addr, off + count, DMA_FROM_DEVICE);
> -	if (rc)
> +	iseries_hv_unmap(dma_addr, 256, DMA_FROM_DEVICE);
> +	if (rc) {
> +		kfree(page);
>  		return rc;
> -	if (vsp_cmd.result_code != 0)
> +	}
> +	if (vsp_cmd.result_code != 0) {
> +		kfree(page);
>  		return -ENOMEM;
> +	}
>  	p = page;
> -	len = 0;
> -	while (len < (off + count)) {
> -		if ((*p == '\0') || (*p == '\n')) {
> -			if (*p == '\0')
> -				*p = '\n';
> -			p++;
> -			len++;
> -			*eof = 1;
> +	while (p - page < 256) {
> +		if (*p == '\0' || *p == '\n') {
> +			*p = '\n';
>  			break;
>  		}
>  		p++;
> -		len++;
> -	}
>  
> -	if (len < off) {
> -		*eof = 1;
> -		len = 0;
>  	}
> -	return len;
> +	seq_write(m, page, p - page);
> +	kfree(page);
> +	return 0;
> +}
> +
> +static int mf_cmdline_proc_open(struct inode *inode, struct file *file)
> +{
> +	return single_open(file, mf_cmdline_proc_show, PDE(inode)->data);
>  }
>  
>  #if 0
> @@ -962,10 +961,8 @@ static int proc_mf_dump_vmlinux(char *pa
>  }
>  #endif
>  
> -static int proc_mf_dump_side(char *page, char **start, off_t off,
> -		int count, int *eof, void *data)
> +static int mf_side_proc_show(struct seq_file *m, void *v)
>  {
> -	int len;
>  	char mf_current_side = ' ';
>  	struct vsp_cmd_data vsp_cmd;
>  
> @@ -989,21 +986,17 @@ static int proc_mf_dump_side(char *page,
>  		}
>  	}
>  
> -	len = sprintf(page, "%c\n", mf_current_side);
> +	seq_printf(m, "%c\n", mf_current_side);
> +	return 0;
> +}
>  
> -	if (len <= (off + count))
> -		*eof = 1;
> -	*start = page + off;
> -	len -= off;
> -	if (len > count)
> -		len = count;
> -	if (len < 0)
> -		len = 0;
> -	return len;
> +static int mf_side_proc_open(struct inode *inode, struct file *file)
> +{
> +	return single_open(file, mf_side_proc_show, NULL);
>  }
>  
> -static int proc_mf_change_side(struct file *file, const char __user *buffer,
> -		unsigned long count, void *data)
> +static ssize_t mf_side_proc_write(struct file *file, const char __user *buffer,
> +				  size_t count, loff_t *pos)
>  {
>  	char side;
>  	u64 newSide;
> @@ -1041,6 +1034,15 @@ static int proc_mf_change_side(struct fi
>  	return count;
>  }
>  
> +static const struct file_operations mf_side_proc_fops = {
> +	.owner		= THIS_MODULE,
> +	.open		= mf_side_proc_open,
> +	.read		= seq_read,
> +	.llseek		= seq_lseek,
> +	.release	= single_release,
> +	.write		= mf_side_proc_write,
> +};
> +
>  #if 0
>  static void mf_getSrcHistory(char *buffer, int size)
>  {
> @@ -1087,8 +1089,7 @@ static void mf_getSrcHistory(char *buffe
>  }
>  #endif
>  
> -static int proc_mf_dump_src(char *page, char **start, off_t off,
> -		int count, int *eof, void *data)
> +static int mf_src_proc_show(struct seq_file *m, void *v)
>  {
>  #if 0
>  	int len;
> @@ -1109,8 +1110,13 @@ static int proc_mf_dump_src(char *page, 
>  #endif
>  }
>  
> -static int proc_mf_change_src(struct file *file, const char __user *buffer,
> -		unsigned long count, void *data)
> +static int mf_src_proc_open(struct inode *inode, struct file *file)
> +{
> +	return single_open(file, mf_src_proc_show, NULL);
> +}
> +
> +static ssize_t mf_src_proc_write(struct file *file, const char __user *buffer,
> +				 size_t count, loff_t *pos)
>  {
>  	char stkbuf[10];
>  
> @@ -1135,9 +1141,19 @@ static int proc_mf_change_src(struct fil
>  	return count;
>  }
>  
> -static int proc_mf_change_cmdline(struct file *file, const char __user *buffer,
> -		unsigned long count, void *data)
> +static const struct file_operations mf_src_proc_fops = {
> +	.owner		= THIS_MODULE,
> +	.open		= mf_src_proc_open,
> +	.read		= seq_read,
> +	.llseek		= seq_lseek,
> +	.release	= single_release,
> +	.write		= mf_src_proc_write,
> +};
> +
> +static ssize_t mf_cmdline_proc_write(struct file *file, const char __user *buffer,
> +				     size_t count, loff_t *pos)
>  {
> +	void *data = PDE(file->f_path.dentry->d_inode)->data;
>  	struct vsp_cmd_data vsp_cmd;
>  	dma_addr_t dma_addr;
>  	char *page;
> @@ -1172,6 +1188,15 @@ out:
>  	return ret;
>  }
>  
> +static const struct file_operations mf_cmdline_proc_fops = {
> +	.owner		= THIS_MODULE,
> +	.open		= mf_cmdline_proc_open,
> +	.read		= seq_read,
> +	.llseek		= seq_lseek,
> +	.release	= single_release,
> +	.write		= mf_cmdline_proc_write,
> +};
> +
>  static ssize_t proc_mf_change_vmlinux(struct file *file,
>  				      const char __user *buf,
>  				      size_t count, loff_t *ppos)
> @@ -1246,12 +1271,10 @@ static int __init mf_proc_init(void)
>  		if (!mf)
>  			return 1;
>  
> -		ent = create_proc_entry("cmdline", S_IFREG|S_IRUSR|S_IWUSR, mf);
> +		ent = proc_create_data("cmdline", S_IRUSR|S_IWUSR, mf,
> +				       &mf_cmdline_proc_fops, (void *)(long)i);
>  		if (!ent)
>  			return 1;
> -		ent->data = (void *)(long)i;
> -		ent->read_proc = proc_mf_dump_cmdline;
> -		ent->write_proc = proc_mf_change_cmdline;
>  
>  		if (i == 3)	/* no vmlinux entry for 'D' */
>  			continue;
> @@ -1263,19 +1286,15 @@ static int __init mf_proc_init(void)
>  			return 1;
>  	}
>  
> -	ent = create_proc_entry("side", S_IFREG|S_IRUSR|S_IWUSR, mf_proc_root);
> +	ent = proc_create("side", S_IFREG|S_IRUSR|S_IWUSR, mf_proc_root,
> +			  &mf_side_proc_fops);
>  	if (!ent)
>  		return 1;
> -	ent->data = (void *)0;
> -	ent->read_proc = proc_mf_dump_side;
> -	ent->write_proc = proc_mf_change_side;
>  
> -	ent = create_proc_entry("src", S_IFREG|S_IRUSR|S_IWUSR, mf_proc_root);
> +	ent = proc_create("src", S_IFREG|S_IRUSR|S_IWUSR, mf_proc_root,
> +			  &mf_src_proc_fops);
>  	if (!ent)
>  		return 1;
> -	ent->data = (void *)0;
> -	ent->read_proc = proc_mf_dump_src;
> -	ent->write_proc = proc_mf_change_src;
>  
>  	return 0;
>  }
> _
> 
> Patches currently in -mm which might be from adobriyan at gmail.com are
> 
> linux-next.patch
> thinkpad_acpi-convert-to-seq_file.patch
> asus_acpi-convert-to-seq_file.patch
> toshiba_acpi-convert-to-seq_file.patch
> arm-convert-proc-cpu-aligment-to-seq_file.patch
> proc_fops-convert-av7110.patch
> proc_fops-convert-cpia.patch
> proc_fops-convert-drivers-isdn-to-seq_file.patch
> proc_fops-convert-drivers-isdn-to-seq_file-fix.patch
> mpt-fusion-convert-to-seq_file.patch
> const-constify-remaining-dev_pm_ops.patch
> uml-irq-register-race-condition.patch
> make-debug_bugverbose-default-to-y.patch
> proc-rename-de_get-to-pde_get-and-inline-it.patch
> pnpbios-convert-to-seq_file.patch
> const-constify-remaining-pipe_buf_operations.patch
> ufs-pass-qstr-instead-of-dentry-where-necessary-for-nfs.patch
> ufs-nfs-support.patch
> reiserfs-remove-proc-fs-reiserfs-version.patch
> reiserfs-dont-compile-procfso-at-all-if-no-support.patch
> uml-convert-to-seq_file-proc_fops.patch
> alpha-convert-srm-code-to-seq_file.patch
> iseries-convert-to-proc_fops.patch
> clps711xfb-convert-to-proc_fops.patch
> parisc-convert-proc-pdc-lcdled-to-seq_file.patch
> via-pmu-convert-to-proc_fops-seq_file.patch




More information about the Linuxppc-dev mailing list