All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stephen Hemminger <shemminger@vyatta.com>
To: David Miller <davem@davemloft.net>
Cc: jarkao2@gmail.com, mikem@ring3k.org, flyboy@gmail.com,
	rjw@sisk.pl, netdev@vger.kernel.org, mbreuer@majjas.com
Subject: [PATCH] sky2: safer transmit ring cleaning
Date: Tue, 12 Jan 2010 08:15:13 -0800	[thread overview]
Message-ID: <20100112081513.0175d579@nehalam> (raw)
In-Reply-To: <20100112.025620.210305029.davem@davemloft.net>

This code makes transmit path and transmit reset safer by:
  * adding memory barrier before checking available ring slots
  * reseting state of tx ring elements after free
  * seperate cleanup function from ring done function
  * removing mostly unused tx_next element

Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>

---
Please apply this instead of the various bits and pieces flying
around labeled as sky2 panic under load


--- a/drivers/net/sky2.c	2010-01-11 10:49:50.907113126 -0800
+++ b/drivers/net/sky2.c	2010-01-11 17:36:22.027429875 -0800
@@ -1596,6 +1596,9 @@ static inline int tx_inuse(const struct 
 /* Number of list elements available for next tx */
 static inline int tx_avail(const struct sky2_port *sky2)
 {
+	/* Makes sure update of tx_prod from start_xmit and
+	   tx_cons from tx_done are seen. */
+	smp_mb();
 	return sky2->tx_pending - tx_inuse(sky2);
 }
 
@@ -1618,8 +1621,7 @@ static unsigned tx_le_req(const struct s
 	return count;
 }
 
-static void sky2_tx_unmap(struct pci_dev *pdev,
-			  const struct tx_ring_info *re)
+static void sky2_tx_unmap(struct pci_dev *pdev, struct tx_ring_info *re)
 {
 	if (re->flags & TX_MAP_SINGLE)
 		pci_unmap_single(pdev, pci_unmap_addr(re, mapaddr),
@@ -1629,6 +1631,7 @@ static void sky2_tx_unmap(struct pci_dev
 		pci_unmap_page(pdev, pci_unmap_addr(re, mapaddr),
 			       pci_unmap_len(re, maplen),
 			       PCI_DMA_TODEVICE);
+	re->flags = 0;
 }
 
 /*
@@ -1804,7 +1807,8 @@ mapping_error:
 }
 
 /*
- * Free ring elements from starting at tx_cons until "done"
+ * Transmit complete processing
+ * Free ring elements from starting at tx_cons until done index
  *
  * NB:
  *  1. The hardware will tell us about partial completion of multi-part
@@ -1813,9 +1817,9 @@ mapping_error:
  *     looks at the tail of the queue of FIFO (tx_cons), not
  *     the head (tx_prod)
  */
-static void sky2_tx_complete(struct sky2_port *sky2, u16 done)
+static void sky2_tx_done(struct net_device *dev, u16 done)
 {
-	struct net_device *dev = sky2->netdev;
+	struct sky2_port *sky2 = netdev_priv(dev);
 	unsigned idx;
 
 	BUG_ON(done >= sky2->tx_ring_size);
@@ -1828,6 +1832,8 @@ static void sky2_tx_complete(struct sky2
 		sky2_tx_unmap(sky2->hw->pdev, re);
 
 		if (skb) {
+			re->skb = NULL;
+
 			if (unlikely(netif_msg_tx_done(sky2)))
 				printk(KERN_DEBUG "%s: tx done %u\n",
 				       dev->name, idx);
@@ -1836,13 +1842,10 @@ static void sky2_tx_complete(struct sky2
 			dev->stats.tx_bytes += skb->len;
 
 			dev_kfree_skb_any(skb);
-
-			sky2->tx_next = RING_NEXT(idx, sky2->tx_ring_size);
 		}
 	}
 
 	sky2->tx_cons = idx;
-	smp_mb();
 
 	if (tx_avail(sky2) > MAX_SKB_TX_LE + 4)
 		netif_wake_queue(dev);
@@ -1870,6 +1873,21 @@ static void sky2_tx_reset(struct sky2_hw
 	sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_RST_SET);
 }
 
+static void sky2_tx_clean(struct sky2_port *sky2)
+{
+	u16 idx;
+
+	for (idx = 0; idx < sky2->tx_ring_size; idx++) {
+		struct tx_ring_info *re = sky2->tx_ring + idx;
+
+		sky2_tx_unmap(sky2->hw->pdev, re);
+		if (re->skb) {
+			dev_kfree_skb_any(re->skb);
+			re->skb = NULL;
+		}
+	}
+}
+
 /* Network shutdown */
 static int sky2_down(struct net_device *dev)
 {
@@ -1933,8 +1951,7 @@ static int sky2_down(struct net_device *
 	sky2_tx_reset(hw, port);
 
 	/* Free any pending frames stuck in HW queue */
-	sky2_tx_complete(sky2, sky2->tx_prod);
-
+	sky2_tx_clean(sky2);
 	sky2_rx_clean(sky2);
 
 	sky2_free_buffers(sky2);
@@ -2411,15 +2428,6 @@ error:
 	goto resubmit;
 }
 
-/* Transmit complete */
-static inline void sky2_tx_done(struct net_device *dev, u16 last)
-{
-	struct sky2_port *sky2 = netdev_priv(dev);
-
-	if (netif_running(dev))
-		sky2_tx_complete(sky2, last);
-}
-
 static inline void sky2_skb_rx(const struct sky2_port *sky2,
 			       u32 status, struct sk_buff *skb)
 {
@@ -4201,7 +4209,7 @@ static int sky2_debug_show(struct seq_fi
 
 	/* Dump contents of tx ring */
 	sop = 1;
-	for (idx = sky2->tx_next; idx != sky2->tx_prod && idx < sky2->tx_ring_size;
+	for (idx = sky2->tx_cons; idx != sky2->tx_prod && idx < sky2->tx_ring_size;
 	     idx = RING_NEXT(idx, sky2->tx_ring_size)) {
 		const struct sky2_tx_le *le = sky2->tx_le + idx;
 		u32 a = le32_to_cpu(le->addr);
--- a/drivers/net/sky2.h	2010-01-11 17:29:22.817088617 -0800
+++ b/drivers/net/sky2.h	2010-01-11 17:29:28.197120484 -0800
@@ -2187,7 +2187,6 @@ struct sky2_port {
 	u16		     tx_ring_size;
 	u16		     tx_cons;		/* next le to check */
 	u16		     tx_prod;		/* next le to use */
-	u16		     tx_next;		/* debug only */
 
 	u16		     tx_pending;
 	u16		     tx_last_mss;

  parent reply	other threads:[~2010-01-12 16:15 UTC|newest]

Thread overview: 241+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-01-10 22:27 2.6.33-rc3-git3: Reported regressions from 2.6.32 Rafael J. Wysocki
2010-01-10 22:27 ` Rafael J. Wysocki
2010-01-10 22:27 ` [Bug #14791] Something has been broken in the network stack this week Rafael J. Wysocki
2010-01-10 22:27   ` Rafael J. Wysocki
2010-01-10 22:46   ` Ben Hutchings
2010-01-10 22:58     ` Rafael J. Wysocki
2010-01-10 22:58       ` Rafael J. Wysocki
2010-01-28 23:18   ` [PATCH net-2.6] cdc_ether: Partially revert "usbnet: Set link down initially ..." Ben Hutchings
2010-01-29  5:37     ` David Miller
2010-01-10 22:32 ` [Bug #14792] Misdetection of the TV output Rafael J. Wysocki
2010-01-10 22:32   ` Rafael J. Wysocki
2010-01-10 22:32 ` [Bug #14860] No DP-DVI output when laptop is docked Rafael J. Wysocki
2010-01-10 22:32   ` Rafael J. Wysocki
2010-01-12 16:14   ` Pär Andersson
2010-01-12 16:14     ` Pär Andersson
2010-01-12 22:03     ` Rafael J. Wysocki
2010-01-12 22:03       ` Rafael J. Wysocki
2010-01-10 22:32 ` [Bug #14874] Ath5k regression with commit 8bf3d79bc401ca417ccf9fc076d3295d1a71dbf5 Rafael J. Wysocki
2010-01-11 15:05   ` Luis R. Rodriguez
2010-01-11 15:05     ` Luis R. Rodriguez
2010-01-11 20:01     ` Rafael J. Wysocki
2010-01-11 20:01       ` Rafael J. Wysocki
2010-01-11 20:05       ` Luis R. Rodriguez
2010-01-11 20:05         ` Luis R. Rodriguez
2010-01-10 22:32 ` [Bug #14899] reiserfs: inconsistent lock state Rafael J. Wysocki
2010-01-10 22:49   ` Frederic Weisbecker
2010-01-10 22:49     ` Frederic Weisbecker
2010-01-10 23:02     ` Rafael J. Wysocki
2010-01-10 23:02       ` Rafael J. Wysocki
2010-01-10 23:16     ` Alexander Beregalov
2010-01-10 23:16       ` Alexander Beregalov
2010-01-10 22:32 ` [Bug #14859] System timer firing too much without cause Rafael J. Wysocki
2010-01-10 22:32   ` Rafael J. Wysocki
2010-01-11  3:22   ` Shawn Starr
     [not found]     ` <201001102222.19700.shawn.starr-bJEeYj9oJeDQT0dZR+AlfA@public.gmane.org>
2010-01-11 19:59       ` Rafael J. Wysocki
2010-01-11  3:28   ` Shawn Starr
2010-01-10 22:32 ` [Bug #14924] Weird hard hangs when rendering 'some' web-sites in Firefox Rafael J. Wysocki
2010-01-10 22:32   ` Rafael J. Wysocki
2010-01-10 22:32 ` [Bug #14907] Commit "kbuild: fix bzImage build for x86" breaks build Rafael J. Wysocki
2010-01-11  1:36   ` Jonathan Nieder
2010-01-11  1:36     ` Jonathan Nieder
2010-01-11 20:02     ` Rafael J. Wysocki
2010-01-11 20:02       ` Rafael J. Wysocki
2010-01-12  9:01       ` Oliver Hartkopp
2010-01-13 12:33     ` Michal Marek
2010-01-13 12:33       ` Michal Marek
2010-01-14 11:05       ` Michal Marek
2010-01-14 11:05         ` Michal Marek
2010-01-14 20:35         ` Rafael J. Wysocki
2010-01-14 20:35           ` Rafael J. Wysocki
2010-01-10 22:32 ` [Bug #14934] kernel crash during boot Rafael J. Wysocki
2010-01-10 22:32 ` [Bug #14937] WARNING: at kernel/lockdep.c:2830 Rafael J. Wysocki
2010-01-10 22:32 ` [Bug #14925] sky2 panic under load Rafael J. Wysocki
2010-01-11  0:36   ` Berck E. Nash
2010-01-11 13:26     ` Jarek Poplawski
2010-01-11 19:32       ` Rafael J. Wysocki
2010-01-11 20:31         ` Jarek Poplawski
2010-01-11 20:50           ` Rafael J. Wysocki
2010-01-11 21:02           ` Berck E. Nash
2010-01-11 21:47             ` Jarek Poplawski
2010-01-11 14:03     ` Mike McCormack
2010-01-11 16:45       ` Stephen Hemminger
2010-01-11 22:07         ` Jarek Poplawski
2010-01-12  0:14           ` David Miller
2010-01-12  7:50             ` Jarek Poplawski
2010-01-12  8:08               ` David Miller
2010-01-12  8:56                 ` Jarek Poplawski
2010-01-12  9:42                   ` David Miller
2010-01-12 10:31                     ` Jarek Poplawski
2010-01-12 10:56                     ` David Miller
2010-01-12 11:04                       ` Jarek Poplawski
2010-01-12 15:39                       ` Stephen Hemminger
2010-01-12 16:15                       ` Stephen Hemminger [this message]
2010-01-12 16:32                         ` [PATCH] sky2: safer transmit ring cleaning Michael Breuer
2010-01-12 17:02                           ` Stephen Hemminger
2010-01-12 18:04                         ` Jarek Poplawski
2010-01-12 18:13                           ` Stephen Hemminger
2010-01-12 18:24                             ` Jarek Poplawski
2010-01-12 18:49                               ` [PATCH] sky2: safer transmit ring cleaning (v2) Stephen Hemminger
2010-01-12 19:16                                 ` Jarek Poplawski
2010-01-12 19:23                                   ` Stephen Hemminger
2010-01-12 19:50                                     ` Jarek Poplawski
2010-01-13  1:23                                       ` Stephen Hemminger
2010-01-12 19:34                                 ` Michael Breuer
2010-01-12 18:35                         ` [PATCH] sky2: safer transmit ring cleaning Michael Breuer
2010-01-12 18:42                           ` Michael Breuer
2010-01-12 20:31                             ` Michael Breuer
2010-01-13  4:10                               ` [PATCH] sky2: safer transmit ring cleaning (v3) Stephen Hemminger
2010-01-13  4:31                                 ` Michael Breuer
2010-01-13  7:35                                 ` Jarek Poplawski
2010-01-13 16:04                                 ` Michael Breuer
2010-01-14  3:41                                   ` [PATCH] sky2: safer transmit ring cleaning (v4) Stephen Hemminger
2010-01-14 10:14                                     ` Jarek Poplawski
2010-01-14 11:16                                       ` Jarek Poplawski
2010-01-14 11:20                                         ` David Miller
2010-01-14 11:26                                           ` Jarek Poplawski
2010-01-14 13:19                                             ` Mike McCormack
2010-01-14 15:43                                               ` Michael Breuer
2010-01-14 16:46                                               ` Michael Breuer
2010-01-14 17:51                                               ` Stephen Hemminger
2010-01-14 17:52                                       ` Stephen Hemminger
2010-01-14 23:51                                         ` Michael Breuer
2010-01-16 18:35                                           ` sky2 DHCPOFFER packet loss under load (Was Re: [PATCH] sky2: safer transmit ring cleaning (v4)) Michael Breuer
2010-01-14 15:46                                     ` [PATCH] sky2: safer transmit ring cleaning (v4) Michael Breuer
2010-01-11 22:31         ` [Bug #14925] sky2 panic under load Jarek Poplawski
2010-01-10 22:32 ` [Bug #14946] All kernels after 2.6.32-git10 show only 1 CPU Rafael J. Wysocki
2010-01-11  3:39   ` Sid Boyce
2010-01-11  3:39     ` Sid Boyce
2010-01-11 20:04     ` Rafael J. Wysocki
2010-01-15  1:24     ` HDA Intel Audio hang on boot Sid Boyce
2010-01-15  1:24       ` Sid Boyce
2010-01-15 16:01       ` Sid Boyce
2010-01-16 16:44         ` Sid Boyce
2010-01-16 16:44           ` Sid Boyce
2010-01-25  1:48       ` Sid Boyce
2010-01-25  1:48         ` Sid Boyce
2010-01-25 21:39         ` Rafael J. Wysocki
2010-01-25 21:39           ` Rafael J. Wysocki
2010-01-25 21:54           ` Takashi Iwai
2010-01-25 21:54             ` Takashi Iwai
2010-01-25 21:55             ` Takashi Iwai
2010-01-26  0:59               ` Sid Boyce
2010-01-26  0:59                 ` Sid Boyce
2010-01-26  6:40                 ` Takashi Iwai
2010-01-26  6:58                   ` Takashi Iwai
2010-01-26  6:58                     ` Takashi Iwai
2010-01-26 12:02                     ` Sid Boyce
2010-01-26 12:02                       ` Sid Boyce
2010-01-26 12:51                       ` Rafael J. Wysocki
2010-01-26 13:18                         ` Sid Boyce
2010-01-26 12:55                       ` Takashi Iwai
2010-01-26 12:55                         ` Takashi Iwai
2010-01-26 13:44                         ` Sid Boyce
2010-01-26 13:44                           ` Sid Boyce
2010-01-26 13:48                           ` Takashi Iwai
2010-01-26 13:48                             ` Takashi Iwai
2010-01-26 18:22                           ` Rafael J. Wysocki
2010-01-26 18:22                             ` Rafael J. Wysocki
2010-01-26 20:25                             ` Takashi Iwai
2010-01-26 20:25                               ` Takashi Iwai
2010-01-26 20:56                               ` Sid Boyce
2010-01-26 20:56                                 ` Sid Boyce
2010-01-26 20:58                             ` Sid Boyce
2010-01-26 20:58                               ` Sid Boyce
2010-01-27  0:56                               ` Rafael J. Wysocki
2010-01-27  2:40                                 ` Sid Boyce
2010-01-27  2:40                                   ` Sid Boyce
2010-01-27  6:42                                   ` Takashi Iwai
2010-01-27 17:17                                     ` Sid Boyce
2010-01-27 19:29                                       ` Takashi Iwai
2010-01-27 19:29                                         ` Takashi Iwai
2010-01-27 22:14                                         ` Sid Boyce
2010-01-10 22:32 ` [Bug #14948] EHCI resume sysfs duplicates Rafael J. Wysocki
2010-01-11  6:05   ` Borislav Petkov
2010-01-11  6:05     ` Borislav Petkov
2010-01-11 20:06     ` Rafael J. Wysocki
2010-01-11 20:06       ` Rafael J. Wysocki
2010-01-11 22:41       ` Borislav Petkov
2010-01-11 22:41         ` Borislav Petkov
2010-01-11 23:08         ` Rafael J. Wysocki
2010-01-11 23:08           ` Rafael J. Wysocki
2010-01-10 22:32 ` [Bug #14942] gkrellm no longer shows all the temperatures on thinkpad x60 Rafael J. Wysocki
2010-01-11  9:40   ` Henrique de Moraes Holschuh
2010-01-11 20:02     ` Rafael J. Wysocki
2010-01-11 20:02       ` Rafael J. Wysocki
2010-02-01 10:48     ` Pavel Machek
2010-02-01 10:48       ` Pavel Machek
2010-02-02 21:06       ` Rafael J. Wysocki
2010-02-02 21:06         ` Rafael J. Wysocki
2010-01-10 22:32 ` [Bug #14944] 2.6.32.2 SATA link detect failed, 2.6.32.1 works fine Rafael J. Wysocki
2010-01-10 22:32   ` Rafael J. Wysocki
2010-01-10 22:32 ` [Bug #14949] drm_vm.c:drm_mmap: possible circular locking dependency detected Rafael J. Wysocki
2010-01-11  6:11   ` Borislav Petkov
2010-01-11  6:11     ` Borislav Petkov
2010-01-11 20:06     ` Rafael J. Wysocki
2010-01-11 20:06       ` Rafael J. Wysocki
2010-01-10 22:32 ` [Bug #14957] Blank screen with KMS enabled Rafael J. Wysocki
2010-01-10 22:32 ` [Bug #14954] warning from alloc_pages_nodemask on boot -- caused by commit 78f1699659963fff97975df44db6d5dbe7218e55 Rafael J. Wysocki
2010-01-10 22:32   ` Rafael J. Wysocki
2010-01-10 22:32 ` [Bug #14950] tbench regression with 2.6.33-rc1 Rafael J. Wysocki
2010-01-10 22:32 ` [Bug #14974] tg3 does not resume from hibernation properly on BCM5787M Rafael J. Wysocki
2010-01-10 22:32   ` Rafael J. Wysocki
2010-01-10 22:32 ` [Bug #15031] bug in fs/btrfs/ordered-data.c:672 Rafael J. Wysocki
2010-01-11  0:38   ` Carlos R. Mafra
2010-01-11  0:38     ` Carlos R. Mafra
2010-01-11 20:11     ` Rafael J. Wysocki
2010-01-11 20:11       ` Rafael J. Wysocki
2010-01-10 22:32 ` [Bug #14976] No sound on snd_hda_codec_via in 2.6.33-rc2 Rafael J. Wysocki
2010-01-10 22:32   ` Rafael J. Wysocki
2010-01-10 22:32 ` [Bug #15032] Oops in uart_resume_port() on resume Rafael J. Wysocki
2010-01-10 22:32   ` Rafael J. Wysocki
2010-01-10 22:32 ` [Bug #15026] i915: Resume regression on MSI Wind U100 w/o KMS Rafael J. Wysocki
2010-01-10 22:32   ` Rafael J. Wysocki
2010-01-10 22:32 ` [Bug #15035] BUG: unable to handle kernel paging request in rs600_gart_set_page() Rafael J. Wysocki
2010-01-10 22:32 ` [Bug #15033] drm: gem_object_free without struct_mutex Rafael J. Wysocki
2010-01-10 22:32   ` Rafael J. Wysocki
2010-01-11 23:15   ` Hugh Dickins
2010-01-11 23:15     ` Hugh Dickins
2010-01-11 23:50     ` Rafael J. Wysocki
2010-01-11 23:50       ` Rafael J. Wysocki
2010-01-10 22:32 ` [Bug #15034] volano ~30% regression Rafael J. Wysocki
2010-01-11  6:52   ` Mike Galbraith
2010-01-11  6:52     ` Mike Galbraith
2010-01-11 20:08     ` Rafael J. Wysocki
2010-01-12  2:28       ` Mike Galbraith
2010-01-12  2:28         ` Mike Galbraith
2010-01-12 22:06         ` Rafael J. Wysocki
2010-01-12 22:06           ` Rafael J. Wysocki
2010-01-10 22:32 ` [Bug #15037] BUG during shutdown - bisected to commit e2912009 Rafael J. Wysocki
2010-01-11 13:12   ` Marc Dionne
2010-01-11 13:12     ` Marc Dionne
2010-01-11 20:10     ` Rafael J. Wysocki
2010-01-11 20:10       ` Rafael J. Wysocki
2010-01-10 22:32 ` [Bug #15036] soft lockup in dmesg after suspend/resume Rafael J. Wysocki
2010-01-10 22:32   ` Rafael J. Wysocki
2010-01-10 22:32 ` [Bug #15043] Display goes off with i915.powersave=1 Rafael J. Wysocki
2010-01-10 22:32   ` Rafael J. Wysocki
2010-01-12 22:31   ` Soeren Sonnenburg
2010-01-12 22:31     ` Soeren Sonnenburg
2010-01-10 22:32 ` [Bug #15041] Pagemap endless read loop with LTP Rafael J. Wysocki
2010-01-13  3:04   ` Américo Wang
2010-01-13  3:04     ` Américo Wang
2010-01-13 21:57     ` Rafael J. Wysocki
2010-01-13 21:57       ` Rafael J. Wysocki
2010-01-13 22:24       ` Matt Mackall
2010-01-13 22:24         ` Matt Mackall
2010-01-13 23:50       ` Andi Kleen
2010-01-14  0:15         ` Matt Mackall
2010-01-14  0:15           ` Matt Mackall
2010-01-14 20:38           ` Rafael J. Wysocki
2010-01-14 20:38             ` Rafael J. Wysocki
2010-01-10 22:32 ` [Bug #15039] leds_alix2: can't allocate I/O for GPIO Rafael J. Wysocki
2010-01-10 22:32 ` [Bug #15038] drm/ksm: fbdev blanking regression Rafael J. Wysocki
2010-01-10 22:32   ` Rafael J. Wysocki
2010-01-11 16:00 ` 2.6.33-rc3-git3: Reported regressions from 2.6.32 Luis R. Rodriguez
2010-01-11 16:00 ` Luis R. Rodriguez
2010-01-11 16:00   ` Luis R. Rodriguez
2010-01-11 21:47 ` Nick Bowler
2010-01-11 22:10   ` Rafael J. Wysocki
2010-01-11 22:10   ` Rafael J. Wysocki
2010-01-11 21:47 ` Nick Bowler

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=20100112081513.0175d579@nehalam \
    --to=shemminger@vyatta.com \
    --cc=davem@davemloft.net \
    --cc=flyboy@gmail.com \
    --cc=jarkao2@gmail.com \
    --cc=mbreuer@majjas.com \
    --cc=mikem@ring3k.org \
    --cc=netdev@vger.kernel.org \
    --cc=rjw@sisk.pl \
    /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.