* [PATCH] convert ircomm to seq_file interface
@ 2003-08-18 19:31 Stephen Hemminger
2003-08-18 20:09 ` Jean Tourrilhes
0 siblings, 1 reply; 4+ messages in thread
From: Stephen Hemminger @ 2003-08-18 19:31 UTC (permalink / raw)
To: Jean Tourrilhes, David S. Miller; +Cc: irda-users, netdev
Convert ircomm /proc interface to seq_file.
Note: don't need spin_lock_irq because list is not ever locked
from inside interrupt context.
Last IRDA patch for today ;-)
diff -Nru a/net/irda/ircomm/ircomm_core.c b/net/irda/ircomm/ircomm_core.c
--- a/net/irda/ircomm/ircomm_core.c Mon Aug 18 12:30:42 2003
+++ b/net/irda/ircomm/ircomm_core.c Mon Aug 18 12:30:42 2003
@@ -33,6 +33,7 @@
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/proc_fs.h>
+#include <linux/seq_file.h>
#include <linux/init.h>
#include <net/irda/irda.h>
@@ -53,7 +54,15 @@
struct sk_buff *skb, int clen);
#ifdef CONFIG_PROC_FS
-static int ircomm_proc_read(char *buf, char **start, off_t offset, int len);
+static int ircomm_seq_open(struct inode *inode, struct file *file);
+
+static struct file_operations ircomm_fops = {
+ .owner = THIS_MODULE,
+ .open = ircomm_seq_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = seq_release,
+};
extern struct proc_dir_entry *proc_irda;
#endif /* CONFIG_PROC_FS */
@@ -69,7 +78,15 @@
}
#ifdef CONFIG_PROC_FS
- create_proc_info_entry("ircomm", 0, proc_irda, ircomm_proc_read);
+ { struct proc_dir_entry *proc;
+ proc = create_proc_entry("ircomm", 0, proc_irda);
+ if (!proc) {
+ printk(KERN_ERR "ircomm_init: can't create /proc entry!\n");
+ return -ENODEV;
+ }
+
+ proc->proc_fops = &ircomm_fops;
+ }
#endif /* CONFIG_PROC_FS */
MESSAGE("IrCOMM protocol (Dag Brattli)\n");
@@ -497,49 +514,80 @@
#ifdef CONFIG_PROC_FS
/*
- * Function ircomm_proc_read (buf, start, offset, len, unused)
- *
- *
- *
+ * Start of reading /proc entries.
+ * Return entry at pos, or NULL if end of file
*/
-int ircomm_proc_read(char *buf, char **start, off_t offset, int len)
-{
+static void *ircomm_seq_start(struct seq_file *seq, loff_t *pos)
+{
+ int i = 0;
struct ircomm_cb *self;
- unsigned long flags;
-
- len = 0;
- spin_lock_irqsave(&ircomm->hb_spinlock, flags);
+ spin_lock(&ircomm->hb_spinlock);
+ for (self = (struct ircomm_cb *) hashbin_get_first(ircomm);
+ self != NULL;
+ self = (struct ircomm_cb *) hashbin_get_next(ircomm)) {
+ if (*pos == i)
+ return self;
+ ++i;
+ }
+ return NULL;
+}
- self = (struct ircomm_cb *) hashbin_get_first(ircomm);
- while (self != NULL) {
- ASSERT(self->magic == IRCOMM_MAGIC, break;);
-
- if(self->line < 0x10)
- len += sprintf(buf+len, "ircomm%d", self->line);
- else
- len += sprintf(buf+len, "irlpt%d", self->line - 0x10);
- len += sprintf(buf+len, " state: %s, ",
- ircomm_state[ self->state]);
- len += sprintf(buf+len,
- "slsap_sel: %#02x, dlsap_sel: %#02x, mode:",
- self->slsap_sel, self->dlsap_sel);
- if(self->service_type & IRCOMM_3_WIRE_RAW)
- len += sprintf(buf+len, " 3-wire-raw");
- if(self->service_type & IRCOMM_3_WIRE)
- len += sprintf(buf+len, " 3-wire");
- if(self->service_type & IRCOMM_9_WIRE)
- len += sprintf(buf+len, " 9-wire");
- if(self->service_type & IRCOMM_CENTRONICS)
- len += sprintf(buf+len, " Centronics");
- len += sprintf(buf+len, "\n");
-
- self = (struct ircomm_cb *) hashbin_get_next(ircomm);
- }
- spin_unlock_irqrestore(&ircomm->hb_spinlock, flags);
+/* Return entry after v, and increment pos */
+static void *ircomm_seq_next(struct seq_file *seq, void *v, loff_t *pos)
+{
+ ++*pos;
+ return hashbin_get_next(ircomm);
+}
- return len;
+/* End of reading /proc file */
+static void ircomm_seq_stop(struct seq_file *seq, void *v)
+{
+ spin_unlock(&ircomm->hb_spinlock);
}
+
+
+/*
+ * Show one entry in /proc file.
+ */
+static int ircomm_seq_show(struct seq_file *seq, void *v)
+{
+ const struct ircomm_cb *self = v;
+
+ if(self->line < 0x10)
+ seq_printf(seq, "ircomm%d", self->line);
+ else
+ seq_printf(seq, "irlpt%d", self->line - 0x10);
+ seq_printf(seq, " state: %s, ", ircomm_state[self->state]);
+ seq_printf(seq, "slsap_sel: %#02x, dlsap_sel: %#02x, mode:",
+ self->slsap_sel, self->dlsap_sel);
+
+ if(self->service_type & IRCOMM_3_WIRE_RAW)
+ seq_puts(seq, " 3-wire-raw");
+ if(self->service_type & IRCOMM_3_WIRE)
+ seq_puts(seq, " 3-wire");
+ if(self->service_type & IRCOMM_9_WIRE)
+ seq_puts(seq, " 9-wire");
+ if(self->service_type & IRCOMM_CENTRONICS)
+ seq_puts(seq, " Centronics");
+ seq_putc(seq, '\n');
+
+
+ return 0;
+}
+
+static struct seq_operations ircomm_seq_ops = {
+ .start = ircomm_seq_start,
+ .next = ircomm_seq_next,
+ .stop = ircomm_seq_stop,
+ .show = ircomm_seq_show,
+};
+
+static int ircomm_seq_open(struct inode *inode, struct file *file)
+{
+ return seq_open(file, &ircomm_seq_ops);
+}
+
#endif /* CONFIG_PROC_FS */
MODULE_AUTHOR("Dag Brattli <dag@brattli.net>");
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] convert ircomm to seq_file interface
2003-08-18 19:31 [PATCH] convert ircomm to seq_file interface Stephen Hemminger
@ 2003-08-18 20:09 ` Jean Tourrilhes
2003-08-20 4:20 ` David S. Miller
0 siblings, 1 reply; 4+ messages in thread
From: Jean Tourrilhes @ 2003-08-18 20:09 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: David S. Miller, irda-users, netdev
On Mon, Aug 18, 2003 at 12:31:42PM -0700, Stephen Hemminger wrote:
> Convert ircomm /proc interface to seq_file.
>
> Note: don't need spin_lock_irq because list is not ever locked
> from inside interrupt context.
I don't agree with this change.
If you look in ircomm_lmp.c ; ircomm_lmp_flow_control(), you
will see that the hashbin is accessed from BH context. So, at minimum
it should be a spin_lock_bh().
Currently, all the IrDA stack uses spin_lock_irqsave(), where
is fact a only spin_lock_bh() is needed. But, this is something that I
kept for 2.7.X, because I would rather make sure previous locking
changes are safe, before going to the next step. So, for consistency
with the rest of the IrDA stack and the code in hashbin, I would keep
the spin_lock_irqsave().
What do you think ?
On the other hand, the conversion to seq_file is badly needed,
because the current /proc code was known to be very buggy. Thanks for
doing that.
Have fun...
Jean
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] convert ircomm to seq_file interface
2003-08-18 20:09 ` Jean Tourrilhes
@ 2003-08-20 4:20 ` David S. Miller
2003-08-20 16:48 ` Jean Tourrilhes
0 siblings, 1 reply; 4+ messages in thread
From: David S. Miller @ 2003-08-20 4:20 UTC (permalink / raw)
To: jt; +Cc: jt, shemminger, irda-users, netdev
On Mon, 18 Aug 2003 13:09:23 -0700
Jean Tourrilhes <jt@bougret.hpl.hp.com> wrote:
> On Mon, Aug 18, 2003 at 12:31:42PM -0700, Stephen Hemminger wrote:
> > Convert ircomm /proc interface to seq_file.
> >
> > Note: don't need spin_lock_irq because list is not ever locked
> > from inside interrupt context.
>
> I don't agree with this change.
I'll let you guys work this one out. Let me know when a
final version of the patch is ready.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] convert ircomm to seq_file interface
2003-08-20 4:20 ` David S. Miller
@ 2003-08-20 16:48 ` Jean Tourrilhes
0 siblings, 0 replies; 4+ messages in thread
From: Jean Tourrilhes @ 2003-08-20 16:48 UTC (permalink / raw)
To: David S. Miller; +Cc: shemminger, irda-users, netdev
On Tue, Aug 19, 2003 at 09:20:09PM -0700, David S. Miller wrote:
> On Mon, 18 Aug 2003 13:09:23 -0700
> Jean Tourrilhes <jt@bougret.hpl.hp.com> wrote:
>
> > On Mon, Aug 18, 2003 at 12:31:42PM -0700, Stephen Hemminger wrote:
> > > Convert ircomm /proc interface to seq_file.
> > >
> > > Note: don't need spin_lock_irq because list is not ever locked
> > > from inside interrupt context.
> >
> > I don't agree with this change.
>
> I'll let you guys work this one out. Let me know when a
> final version of the patch is ready.
Oh, that's fairly simple. You just need to revert the
spin_lock() to a spin_lock_irqsave().
By the way, I would prefer Stephen to not rock the boat when
it come to locking, I know that the locking of the IrDA stack is still
"fragile" in areas.
Have fun...
Jean
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2003-08-20 16:48 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-08-18 19:31 [PATCH] convert ircomm to seq_file interface Stephen Hemminger
2003-08-18 20:09 ` Jean Tourrilhes
2003-08-20 4:20 ` David S. Miller
2003-08-20 16:48 ` Jean Tourrilhes
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).