WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] Make netback optionally return TX responses out-of-o

To: <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH] Make netback optionally return TX responses out-of-order
From: Steven Smith <steven.smith@xxxxxxxxxxxxx>
Date: Tue, 26 May 2009 16:25:50 +0100
Delivery-date: Tue, 26 May 2009 08:19:32 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
Add a mode to netback in which it tries to return TX responses in a
slightly less predictable order.  This can make some otherwise
hardware-specific frontend bugs reproduce much more easily, which is
obviously rather useful when trying to fix them.  It'd also be quite
useful for making sure they didn't happen in the first place.

Randomisation is only done if a module parameter is set, and defaults
to off.  It certainly isn't something you'd ever want to run with in
production, but it might be useful for other people developing
frontend drivers.  I don't know if that's considered an adequate
reason to apply it, but, if anyone wants it, here it is.

Should apply cleanly to the current linux-2.6.18 tree.

Signed-off-by: Steven Smith <steven.smith@xxxxxxxxxxxxx>


diff -r eba6fe6d8d53 drivers/xen/netback/netback.c
--- a/drivers/xen/netback/netback.c     Tue May 26 11:23:16 2009 +0100
+++ b/drivers/xen/netback/netback.c     Tue May 26 16:08:44 2009 +0100
@@ -142,6 +142,9 @@
 static int MODPARM_copy_skb = 1;
 module_param_named(copy_skb, MODPARM_copy_skb, bool, 0);
 MODULE_PARM_DESC(copy_skb, "Copy data received from netfront without netloop");
+static int MODPARM_permute_returns = 0;
+module_param_named(permute_returns, MODPARM_permute_returns, bool, 
S_IRUSR|S_IWUSR);
+MODULE_PARM_DESC(permute_returns, "Randomly permute the order in which TX 
responses are sent to the frontend");
 
 int netbk_copy_skb_mode;
 
@@ -866,6 +869,25 @@
                                      &mmap_pages[pending_idx]);
 }
 
+static void permute_dealloc_ring(PEND_RING_IDX dc, PEND_RING_IDX dp)
+{
+       static unsigned random_src = 0x12345678;
+       unsigned dst_offset;
+       PEND_RING_IDX dest;
+       u16 tmp;
+
+       while (dc != dp) {
+               dst_offset = (random_src / 256) % (dp - dc);
+               dest = dc + dst_offset;
+               tmp = dealloc_ring[MASK_PEND_IDX(dest)];
+               dealloc_ring[MASK_PEND_IDX(dest)] =
+                       dealloc_ring[MASK_PEND_IDX(dc)];
+               dealloc_ring[MASK_PEND_IDX(dc)] = tmp;
+               dc++;
+               random_src *= 68389;
+       }
+}
+
 inline static void net_tx_action_dealloc(void)
 {
        struct netbk_tx_pending_inuse *inuse, *n;
@@ -887,6 +909,9 @@
 
                /* Ensure we see all indices enqueued by netif_idx_release(). */
                smp_rmb();
+
+               if (MODPARM_permute_returns)
+                       permute_dealloc_ring(dc, dp);
 
                while (dc != dp) {
                        unsigned long pfn;

Attachment: signature.asc
Description: Digital signature

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [PATCH] Make netback optionally return TX responses out-of-order, Steven Smith <=