mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH] net/core/dev.c: convert /proc/net/dev to seq_file
@ 2002-11-24 20:39 Arnaldo Carvalho de Melo
  0 siblings, 0 replies; only message in thread
From: Arnaldo Carvalho de Melo @ 2002-11-24 20:39 UTC (permalink / raw)
  To: David S. Miller; +Cc: Linux Kernel Mailing List

Hi David,

	Please pull from:

master.kernel.org:/home/acme/BK/net-2.5

	Now there are three outstanding changesets.

- Arnaldo

You can import this changeset into BK by piping this whole message to:
'| bk receive [path to repository]' or apply the patch as usual.

===================================================================


ChangeSet@1.860, 2002-11-24 12:44:43-02:00, acme@conectiva.com.br
  o net/core/dev.c: convert /proc/net/dev to seq_file


 dev.c |  175 ++++++++++++++++++++++++++++++++++++++----------------------------
 1 files changed, 102 insertions(+), 73 deletions(-)


diff -Nru a/net/core/dev.c b/net/core/dev.c
--- a/net/core/dev.c	Sun Nov 24 12:45:07 2002
+++ b/net/core/dev.c	Sun Nov 24 12:45:07 2002
@@ -94,6 +94,7 @@
 #include <net/sock.h>
 #include <linux/rtnetlink.h>
 #include <linux/proc_fs.h>
+#include <linux/seq_file.h>
 #include <linux/stat.h>
 #include <linux/if_bridge.h>
 #include <linux/divert.h>
@@ -114,6 +115,7 @@
 extern int plip_init(void);
 #endif
 
+#include <asm/current.h>
 
 /* This define, if set, will randomly drop a packet when congestion
  * is more than moderate.  It helps fairness in the multi-interface
@@ -1719,85 +1721,79 @@
 	return copy_to_user(arg, &ifc, sizeof(struct ifconf)) ? -EFAULT : 0;
 }
 
+#ifdef CONFIG_PROC_FS
 /*
  *	This is invoked by the /proc filesystem handler to display a device
  *	in detail.
  */
+static __inline__ struct net_device *dev_get_idx(struct seq_file *seq,
+						 loff_t pos)
+{
+	struct net_device *dev;
+	loff_t i;
 
-#ifdef CONFIG_PROC_FS
+	for (i = 0, dev = dev_base; dev && i < pos; dev = dev->next);
+
+	return i == pos ? dev : NULL;
+}
+
+static void *dev_seq_start(struct seq_file *seq, loff_t *pos)
+{
+	read_lock(&dev_base_lock);
+	return *pos ? dev_get_idx(seq, *pos) : (void *)1;
+}
 
-static int sprintf_stats(char *buffer, struct net_device *dev)
+static void *dev_seq_next(struct seq_file *seq, void *v, loff_t *pos)
+{
+	return v == (void *)1 ? dev_base : ((struct net_device *)v)->next;
+}
+
+static void dev_seq_stop(struct seq_file *seq, void *v)
+{
+	read_unlock(&dev_base_lock);
+}
+
+static void dev_seq_printf_stats(struct seq_file *seq, struct net_device *dev)
 {
 	struct net_device_stats *stats = dev->get_stats ? dev->get_stats(dev) :
 							  NULL;
-	int size;
-
 	if (stats)
-		size = sprintf(buffer, "%6s:%8lu %7lu %4lu %4lu %4lu %5lu "
-				       "%10lu %9lu %8lu %7lu %4lu %4lu %4lu "
-				       "%5lu %7lu %10lu\n",
- 		   dev->name,
-		   stats->rx_bytes,
-		   stats->rx_packets, stats->rx_errors,
-		   stats->rx_dropped + stats->rx_missed_errors,
-		   stats->rx_fifo_errors,
-		   stats->rx_length_errors + stats->rx_over_errors +
-		   	stats->rx_crc_errors + stats->rx_frame_errors,
-		   stats->rx_compressed, stats->multicast,
-		   stats->tx_bytes,
-		   stats->tx_packets, stats->tx_errors, stats->tx_dropped,
-		   stats->tx_fifo_errors, stats->collisions,
-		   stats->tx_carrier_errors + stats->tx_aborted_errors +
-		   	stats->tx_window_errors + stats->tx_heartbeat_errors,
-		   stats->tx_compressed);
+		seq_printf(seq, "%6s:%8lu %7lu %4lu %4lu %4lu %5lu %10lu %9lu "
+				"%8lu %7lu %4lu %4lu %4lu %5lu %7lu %10lu\n",
+			   dev->name, stats->rx_bytes, stats->rx_packets,
+			   stats->rx_errors,
+			   stats->rx_dropped + stats->rx_missed_errors,
+			   stats->rx_fifo_errors,
+			   stats->rx_length_errors + stats->rx_over_errors +
+			     stats->rx_crc_errors + stats->rx_frame_errors,
+			   stats->rx_compressed, stats->multicast,
+			   stats->tx_bytes, stats->tx_packets,
+			   stats->tx_errors, stats->tx_dropped,
+			   stats->tx_fifo_errors, stats->collisions,
+			   stats->tx_carrier_errors +
+			     stats->tx_aborted_errors +
+			     stats->tx_window_errors +
+			     stats->tx_heartbeat_errors,
+			   stats->tx_compressed);
 	else
-		size = sprintf(buffer, "%6s: No statistics available.\n",
-			       dev->name);
-
-	return size;
+		seq_printf(seq, "%6s: No statistics available.\n", dev->name);
 }
 
 /*
  *	Called from the PROCfs module. This now uses the new arbitrary sized
  *	/proc/net interface to create /proc/net/dev
  */
-static int dev_get_info(char *buffer, char **start, off_t offset, int length)
+static int dev_seq_show(struct seq_file *seq, void *v)
 {
-	int len = 0;
-	off_t begin = 0;
-	off_t pos = 0;
-	int size;
-	struct net_device *dev;
-
-	size = sprintf(buffer,
-		"Inter-|   Receive                                                |  Transmit\n"
-		" face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed\n");
-
-	pos += size;
-	len += size;
-
-	read_lock(&dev_base_lock);
-	for (dev = dev_base; dev; dev = dev->next) {
-		size = sprintf_stats(buffer+len, dev);
-		len += size;
-		pos = begin + len;
-
-		if (pos < offset) {
-			len = 0;
-			begin = pos;
-		}
-		if (pos > offset + length)
-			break;
-	}
-	read_unlock(&dev_base_lock);
-
-	*start = buffer + (offset - begin);	/* Start of wanted data */
-	len -= offset - begin;			/* Start slop */
-	if (len > length)
-		len = length;			/* Ending slop */
-	if (len < 0)
-		len = 0;
-	return len;
+	if (v == (void *)1)
+		seq_printf(seq, "Inter-|   Receive                            "
+				"                    |  Transmit\n"
+				" face |bytes    packets errs drop fifo frame "
+				"compressed multicast|bytes    packets errs "
+				"drop fifo colls carrier compressed\n");
+	else
+		dev_seq_printf_stats(seq, v);
+	return 0;
 }
 
 static int dev_proc_stats(char *buffer, char **start, off_t offset,
@@ -1841,6 +1837,44 @@
 	return len;
 }
 
+static struct seq_operations dev_seq_ops = {
+	.start = dev_seq_start,
+	.next  = dev_seq_next,
+	.stop  = dev_seq_stop,
+	.show  = dev_seq_show,
+};
+
+static int dev_seq_open(struct inode *inode, struct file *file)
+{
+	return seq_open(file, &dev_seq_ops);
+}
+
+static struct file_operations dev_seq_fops = {
+	.open    = dev_seq_open,
+	.read    = seq_read,
+	.llseek  = seq_lseek,
+	.release = seq_release,
+};
+
+static int __init dev_proc_init(void)
+{
+	struct proc_dir_entry *p;
+	int rc = -ENOMEM;
+
+	p = create_proc_entry("dev", S_IRUGO, proc_net);
+	if (!p)
+		goto out;
+	p->proc_fops = &dev_seq_fops;
+	create_proc_read_entry("net/softnet_stat", 0, 0, dev_proc_stats, NULL);
+#ifdef WIRELESS_EXT
+	proc_net_create("wireless", 0, dev_get_wireless_info);
+#endif
+	rc = 0;
+out:
+	return rc;
+}
+#else
+#define dev_proc_init() 0
 #endif	/* CONFIG_PROC_FS */
 
 
@@ -2680,10 +2714,13 @@
 static int __init net_dev_init(void)
 {
 	struct net_device *dev, **dp;
-	int i;
+	int i, rc = -ENOMEM;
 
 	BUG_ON(!dev_boot_phase);
 
+	if (dev_proc_init())
+		goto out;
+
 #ifdef CONFIG_NET_DIVERT
 	dv_init();
 #endif /* CONFIG_NET_DIVERT */
@@ -2787,15 +2824,6 @@
 		}
 	}
 
-#ifdef CONFIG_PROC_FS
-	proc_net_create("dev", 0, dev_get_info);
-	create_proc_read_entry("net/softnet_stat", 0, 0, dev_proc_stats, NULL);
-#ifdef WIRELESS_EXT
-	/* Available in net/core/wireless.c */
-	proc_net_create("wireless", 0, dev_get_wireless_info);
-#endif	/* WIRELESS_EXT */
-#endif	/* CONFIG_PROC_FS */
-
 	dev_boot_phase = 0;
 
 	open_softirq(NET_TX_SOFTIRQ, net_tx_action, NULL);
@@ -2812,8 +2840,9 @@
 	 */
 
 	net_device_init();
-
-	return 0;
+	rc = 0;
+out:
+	return rc;
 }
 
 subsys_initcall(net_dev_init);

===================================================================


This BitKeeper patch contains the following changesets:
1.860
## Wrapped with gzip_uu ##


begin 664 bkpatch10474
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
#$```
`
end

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2002-11-24 20:32 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-11-24 20:39 [PATCH] net/core/dev.c: convert /proc/net/dev to seq_file Arnaldo Carvalho de Melo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®