From: Prasanna S Panchamukhi <prasanna@in.ibm.com>
To: lkcd-devel@lists.sourceforge.net
Cc: linux-kernel@vger.kernel.org, mpm@selenic.com, suparna@in.ibm.com
Subject: LKCD Network dump over netpoll patch (2.6.0-test9)
Date: Mon, 10 Nov 2003 19:24:54 +0530 [thread overview]
Message-ID: <20031110135454.GH1409@in.ibm.com> (raw)
Hi,
This patch includes LKCD networkdump code changes over netpoll API's for
kernel version 2.6.0-test9. Both the netconsole and network dumping can be
achieved. Procedure for netdumping is explained below:
1. Apply the netpoll-core.patch and netconsole.patch (http://www.selenic.com/netpoll/)
2. Download the LKCD code from the cvs using
cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/lkcd login (presee enter key for passwd)
cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/lkcd co 2.6
cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/lkcd co lkcdutils
3. Copy the lkcd files to the kernel source directory.
#cp -r ../2.6/* ./linux-2.6-test9/
4. Apply the kernel-changes.patch from the 2.6/patches directory.
5. Apply the pollcontroller.patch from the 2.6/patches
directory now.
6. Apply the lkcd-netpoll.patch(below)
7. Buid the kernel with LKCD network dumping enabled ;reboot and insert the dump_netdev.o module.
8. You also need to install and setup the lkcdutils.
#./configure; make ; make install.
#cd netdump
#make; make install.
9. Configure the netdump fileds in the /etc/sysconfig/dump file.
#you need to specify the local port,remote port, local ip, target ip and device name for netdump.
eg : DUMP_ACTIVE=1
DUMPDEV=eth0
DUMPDIR=/var/log/dump
DUMP_SAVE=1
DUMP_LEVEL=2
DUMP_FLAGS=0x40000000
DUMP_COMPRESS=0
PANIC_TIMEOUT=5
TARGET_HOST=9.182.14.40 #h set this to vaild hostname/IP
TARGET_PORT=6688
SOURCE_PORT=6688
ETH_ADDRESS=00:07:95:E6:08:FB
10. Run lkcd config and now you can try test dumps..
diff -urNp linux.orig/drivers/net/3c59x.c linux-2.6.0-test9/drivers/net/3c59x.c
--- linux.orig/drivers/net/3c59x.c 2003-11-11 06:14:48.000000000 +0530
+++ linux-2.6.0-test9/drivers/net/3c59x.c 2003-11-11 06:15:54.386937760 +0530
@@ -900,6 +900,7 @@ static void set_rx_mode(struct net_devic
static int vortex_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
static void vortex_tx_timeout(struct net_device *dev);
static void acpi_set_WOL(struct net_device *dev);
+static void vorboom_poll(struct net_device *dev);
static struct ethtool_ops vortex_ethtool_ops;
\f
/* This driver uses 'options' to pass the media type, full-duplex flag, etc. */
@@ -1450,6 +1451,9 @@ static int __devinit vortex_probe1(struc
dev->set_multicast_list = set_rx_mode;
dev->tx_timeout = vortex_tx_timeout;
dev->watchdog_timeo = (watchdog * HZ) / 1000;
+#ifdef HAVE_POLL_CONTROLLER
+ dev->poll_controller = &vorboom_poll;
+#endif
if (pdev) {
vp->pm_state_valid = 1;
pci_save_state(VORTEX_PCI(vp), vp->power_state);
@@ -2440,6 +2444,29 @@ handler_exit:
return IRQ_HANDLED;
}
+#ifdef HAVE_POLL_CONTROLLER
+
+/*
+ * Polling 'interrupt' - used by things like netconsole to send skbs
+ * without having to re-enable interrupts. It's not called while
+ * the interrupt routine is executing.
+ */
+
+static void vorboom_poll (struct net_device *dev)
+{
+ struct vortex_private *vp = (struct vortex_private *)dev->priv;
+
+ disable_irq(dev->irq);
+ if (vp->full_bus_master_tx)
+ boomerang_interrupt(dev->irq, dev, 0);
+ else
+ vortex_interrupt(dev->irq, dev, 0);
+ enable_irq(dev->irq);
+}
+
+#endif
+
+
static int vortex_rx(struct net_device *dev)
{
struct vortex_private *vp = (struct vortex_private *)dev->priv;
diff -urNp linux.orig/drivers/net/e100/e100_main.c linux-2.6.0-test9/drivers/net/e100/e100_main.c
--- linux.orig/drivers/net/e100/e100_main.c 2003-11-11 06:14:48.000000000 +0530
+++ linux-2.6.0-test9/drivers/net/e100/e100_main.c 2003-11-11 06:15:54.398935936 +0530
@@ -539,6 +539,22 @@ e100_trigger_SWI(struct e100_private *bd
readw(&(bdp->scb->scb_status)); /* flushes last write, read-safe */
}
+#ifdef HAVE_POLL_CONTROLLER
+
+/*
+ * Polling 'interrupt' - used by things like netconsole to send skbs
+ * without having to re-enable interrupts. It's not called while
+ * the interrupt routine is executing.
+ */
+static void
+e100_poll(struct net_device *dev)
+{
+ disable_irq(dev->irq);
+ e100intr(dev->irq, dev, NULL);
+ enable_irq(dev->irq);
+}
+#endif
+
static int __devinit
e100_found1(struct pci_dev *pcid, const struct pci_device_id *ent)
{
@@ -557,6 +573,9 @@ e100_found1(struct pci_dev *pcid, const
SET_MODULE_OWNER(dev);
+#ifdef HAVE_POLL_CONTROLLER
+ dev->poll_controller = &e100_poll;
+#endif
if (first_time) {
first_time = false;
printk(KERN_NOTICE "%s - version %s\n",
diff -urNp linux.orig/drivers/net/e1000/e1000_main.c linux-2.6.0-test9/drivers/net/e1000/e1000_main.c
--- linux.orig/drivers/net/e1000/e1000_main.c 2003-11-11 06:14:48.000000000 +0530
+++ linux-2.6.0-test9/drivers/net/e1000/e1000_main.c 2003-11-11 06:15:54.439929704 +0530
@@ -165,6 +165,7 @@ static void e1000_leave_82542_rst(struct
static inline void e1000_rx_checksum(struct e1000_adapter *adapter,
struct e1000_rx_desc *rx_desc,
struct sk_buff *skb);
+static void e1000_Poll(struct net_device *dev);
static void e1000_tx_timeout(struct net_device *dev);
static void e1000_tx_timeout_task(struct net_device *dev);
static void e1000_smartspeed(struct e1000_adapter *adapter);
@@ -442,6 +443,9 @@ e1000_probe(struct pci_dev *pdev,
adapter->bd_number = cards_found;
+#ifdef HAVE_POLL_CONTROLLER
+ netdev->poll_controller = &e1000_Poll;
+#endif
/* setup the private structure */
if((err = e1000_sw_init(adapter)))
@@ -2106,6 +2110,15 @@ e1000_intr(int irq, void *data, struct p
mod_timer(&adapter->watchdog_timer, jiffies);
}
+#ifdef HAVE_POLL_CONTROLLER
+static void e1000_Poll(struct net_device *dev)
+{
+ disable_irq(dev->irq);
+ e1000_intr(dev->irq, dev, NULL);
+ enable_irq(dev->irq);
+}
+#endif
+
#ifdef CONFIG_E1000_NAPI
if(netif_rx_schedule_prep(netdev)) {
diff -urNp linux.orig/drivers/net/eepro100.c linux-2.6.0-test9/drivers/net/eepro100.c
--- linux.orig/drivers/net/eepro100.c 2003-11-11 06:14:49.000000000 +0530
+++ linux-2.6.0-test9/drivers/net/eepro100.c 2003-11-11 06:15:54.455927272 +0530
@@ -543,6 +543,7 @@ static void speedo_refill_rx_buffers(str
static int speedo_rx(struct net_device *dev);
static void speedo_tx_buffer_gc(struct net_device *dev);
static irqreturn_t speedo_interrupt(int irq, void *dev_instance, struct pt_regs *regs);
+static void poll_speedo (struct net_device *dev);
static int speedo_close(struct net_device *dev);
static struct net_device_stats *speedo_get_stats(struct net_device *dev);
static int speedo_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
@@ -885,6 +886,9 @@ static int __devinit speedo_found1(struc
dev->get_stats = &speedo_get_stats;
dev->set_multicast_list = &set_rx_mode;
dev->do_ioctl = &speedo_ioctl;
+#ifdef HAVE_POLL_CONTROLLER
+ dev->poll_controller = &poll_speedo;
+#endif
if (register_netdevice(dev))
goto err_free_unlock;
@@ -1675,6 +1679,23 @@ static irqreturn_t speedo_interrupt(int
return IRQ_RETVAL(handled);
}
+#ifdef HAVE_POLL_CONTROLLER
+
+/*
+ * Polling 'interrupt' - used by things like netconsole to send skbs
+ * without having to re-enable interrupts. It's not called while
+ * the interrupt routine is executing.
+ */
+
+static void poll_speedo (struct net_device *dev)
+{
+ disable_irq(dev->irq);
+ speedo_interrupt (dev->irq, dev, NULL);
+ enable_irq(dev->irq);
+}
+
+#endif
+
static inline struct RxFD *speedo_rx_alloc(struct net_device *dev, int entry)
{
struct speedo_private *sp = (struct speedo_private *)dev->priv;
diff -urNp linux.orig/drivers/net/smc-ultra.c linux-2.6.0-test9/drivers/net/smc-ultra.c
--- linux.orig/drivers/net/smc-ultra.c 2003-11-11 06:14:49.000000000 +0530
+++ linux-2.6.0-test9/drivers/net/smc-ultra.c 2003-11-11 06:15:54.466925600 +0530
@@ -122,6 +122,14 @@ MODULE_DEVICE_TABLE(isapnp, ultra_device
#define ULTRA_IO_EXTENT 32
#define EN0_ERWCNT 0x08 /* Early receive warning count. */
\f
+
+static void ultra_poll(struct net_device *dev)
+{
+ disable_irq(dev->irq);
+ ei_interrupt(dev->irq, dev, NULL);
+ enable_irq(dev->irq);
+}
+
/* Probe for the Ultra. This looks like a 8013 with the station
address PROM at I/O ports <base>+8 to <base>+13, with a checksum
following.
@@ -134,6 +142,9 @@ int __init ultra_probe(struct net_device
SET_MODULE_OWNER(dev);
+#ifdef HAVE_POLL_CONTROLLER
+ dev->poll_controller = &ultra_poll;
+#endif
if (base_addr > 0x1ff) /* Check a single specified location. */
return ultra_probe1(dev, base_addr);
else if (base_addr != 0) /* Don't probe at all. */
diff -urNp linux.orig/drivers/net/tlan.c linux-2.6.0-test9/drivers/net/tlan.c
--- linux.orig/drivers/net/tlan.c 2003-11-11 06:14:49.000000000 +0530
+++ linux-2.6.0-test9/drivers/net/tlan.c 2003-11-11 06:15:54.472924688 +0530
@@ -346,6 +346,8 @@ static int TLan_EeSendByte( u16, u8, int
static void TLan_EeReceiveByte( u16, u8 *, int );
static int TLan_EeReadByte( struct net_device *, u8, u8 * );
+static void TLan_Poll(struct net_device *);
+
static void
TLan_StoreSKB( struct tlan_list_tag *tag, struct sk_buff *skb)
@@ -893,6 +895,9 @@ static int TLan_Init( struct net_device
dev->get_stats = &TLan_GetStats;
dev->set_multicast_list = &TLan_SetMulticastList;
dev->do_ioctl = &TLan_ioctl;
+#ifdef HAVE_POLL_CONTROLLER
+ dev->poll_controller = &TLan_Poll;
+#endif
dev->tx_timeout = &TLan_tx_timeout;
dev->watchdog_timeo = TX_TIMEOUT;
@@ -1176,7 +1181,14 @@ static irqreturn_t TLan_HandleInterrupt(
return IRQ_HANDLED;
} /* TLan_HandleInterrupts */
-
+#ifdef HAVE_POLL_CONTROLLER
+static void TLan_Poll(struct net_device *dev)
+{
+ disable_irq(dev->irq);
+ TLan_HandleInterrupt(dev->irq, dev, NULL);
+ enable_irq(dev->irq);
+}
+#endif
/***************************************************************
diff -urNp linux.orig/drivers/net/tulip/tulip_core.c linux-2.6.0-test9/drivers/net/tulip/tulip_core.c
--- linux.orig/drivers/net/tulip/tulip_core.c 2003-11-11 06:14:48.000000000 +0530
+++ linux-2.6.0-test9/drivers/net/tulip/tulip_core.c 2003-11-11 06:15:54.501920280 +0530
@@ -247,6 +247,7 @@ static void tulip_down(struct net_device
static struct net_device_stats *tulip_get_stats(struct net_device *dev);
static int private_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
static void set_rx_mode(struct net_device *dev);
+static void poll_tulip(struct net_device *dev);
@@ -1632,6 +1633,9 @@ static int __devinit tulip_init_one (str
dev->get_stats = tulip_get_stats;
dev->do_ioctl = private_ioctl;
dev->set_multicast_list = set_rx_mode;
+#ifdef HAVE_POLL_CONTROLLER
+ dev->poll_controller = &poll_tulip;
+#endif
if (register_netdev(dev))
goto err_out_free_ring;
@@ -1789,6 +1793,24 @@ static void __devexit tulip_remove_one (
}
+#ifdef HAVE_POLL_CONTROLLER
+
+/*
+ * Polling 'interrupt' - used by things like netconsole to send skbs
+ * without having to re-enable interrupts. It's not called while
+ * the interrupt routine is executing.
+ */
+
+static void poll_tulip (struct net_device *dev)
+{
+ disable_irq(dev->irq);
+ tulip_interrupt (dev->irq, dev, NULL);
+ enable_irq(dev->irq);
+}
+
+#endif
+
+
static struct pci_driver tulip_driver = {
.name = DRV_NAME,
.id_table = tulip_pci_tbl,
diff -urNp linux.orig/include/linux/netdevice.h linux-2.6.0-test9/include/linux/netdevice.h
--- linux.orig/include/linux/netdevice.h 2003-11-11 06:15:18.000000000 +0530
+++ linux-2.6.0-test9/include/linux/netdevice.h 2003-11-11 06:15:54.000000000 +0530
@@ -455,10 +455,10 @@ struct net_device
#ifdef CONFIG_NETPOLL_RX
int netpoll_rx;
#endif
+#define HAVE_POLL_CONTROLLER
#ifdef CONFIG_NET_POLL_CONTROLLER
- void (*poll_controller)(struct net_device *dev);
+ void (*poll_controller)(struct net_device *dev);
#endif
-
/* bridge stuff */
struct net_bridge_port *br_port;
diff -urNp linux.orig/net/core/dev.c linux-2.6.0-test9/net/core/dev.c
--- linux.orig/net/core/dev.c 2003-11-11 06:15:16.000000000 +0530
+++ linux-2.6.0-test9/net/core/dev.c 2003-11-11 06:17:09.000000000 +0530
@@ -1387,8 +1387,6 @@ int netif_rx(struct sk_buff *skb)
}
#endif
- if (!skb->stamp.tv_sec)
- do_gettimeofday(&skb->stamp);
/*
* The code is rearranged so that the path is the most
--
Thanks & Regards
Prasanna S Panchamukhi
Linux Technology Center
India Software Labs, IBM Bangalore
next reply other threads:[~2003-11-10 13:50 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-11-10 13:54 Prasanna S Panchamukhi [this message]
-- strict thread matches above, loose matches on Subject: below --
2003-11-10 14:07 LKCD Network dump over netpoll patch (2.6.0-test9) Prasanna S Panchamukhi
2003-11-11 0:52 ` Matt Mackall
2003-11-14 4:57 ` Prasanna S Panchamukhi
2003-11-14 5:22 ` Prasanna S Panchamukhi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20031110135454.GH1409@in.ibm.com \
--to=prasanna@in.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=lkcd-devel@lists.sourceforge.net \
--cc=mpm@selenic.com \
--cc=suparna@in.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.