[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] Re: [3/11] [NET] front: Stop using rx->id



On Thu, Jul 27, 2006 at 01:49:51PM +0100, Keir Fraser wrote:
> 
> Some comments (inline) on this patch. I checked in the trivial first 
> two patches.

Thanks Keir.

> On 7 Jul 2006, at 15:18, Herbert Xu wrote:
> 
> >     /* Step 2: Rebuild the RX buffer freelist and the RX ring itself. */
> >-    for (requeue_idx = 0, i = 1; i <= NET_RX_RING_SIZE; i++) {
> >-            if ((unsigned long)np->rx_skbs[i] < PAGE_OFFSET)
> >-                    continue;
> >+    for (i = 0; i < NET_RX_RING_SIZE; i++) {
> >+            if (!np->rx_skbs[i])
> >+                    break;
> >             gnttab_grant_foreign_transfer_ref(
> >                     np->grant_rx_ref[i], np->xbdev->otherend_id,
> >                     __pa(np->rx_skbs[i]->data) >> PAGE_SHIFT);
> >-            RING_GET_REQUEST(&np->rx, requeue_idx)->gref =
> >-                    np->grant_rx_ref[i];
> >-            RING_GET_REQUEST(&np->rx, requeue_idx)->id = i;
> >+            RING_GET_REQUEST(&np->rx, i)->gref = np->grant_rx_ref[i];
> >+            RING_GET_REQUEST(&np->rx, i)->id = i;
> >+    }
> >+    for (requeue_idx = i++; i < NET_RX_RING_SIZE; i++) {
> >+            if (!np->rx_skbs[i])
> >+                    continue;
> >+            skb = np->rx_skbs[requeue_idx] = xennet_get_rx_skb(np, i);
> >+            ref = np->grant_rx_ref[requeue_idx] = xennet_get_rx_ref(np, 
> >i);
> >+            gnttab_grant_foreign_transfer_ref(
> >+                    ref, np->xbdev->otherend_id,
> >+                    __pa(skb->data) >> PAGE_SHIFT);
> >+            RING_GET_REQUEST(&np->rx, requeue_idx)->gref = ref;
> >+            RING_GET_REQUEST(&np->rx, requeue_idx)->id = requeue_idx;
> >             requeue_idx++;
> >     }
> 
> Why two loops to fill the receive ring? The header of the second loop 
> with the body of the first loop would seem more correct (use of 

The first loop deals with the initial segment of np where rx_skbs isn't
NULL.  The reason it's dealt with separately from the rest is because
unlike the second loop we don't relocate the entry in np->rx_skbs and
np->grant_rx_ref.

Had we used the body of the second loop for the initial segment we would
end up wiping out the values of rx_skbs and grant_rx_ref when we do the
assignments

                skb = np->rx_skbs[requeue_idx] = xennet_get_rx_skb(np, i);
                ref = np->grant_rx_ref[requeue_idx] = xennet_get_rx_ref(np, i);

because for the initial segment requeue_idx is always the same as i.

> destructive xennet_get_* functions to read skb/ref info looks 
> incorrect).

We're relocating entries from the back of rx_skbs/grant_rx_ref to the
front.  After relocating it we need to clear the original position as
otherwise we may use the entry incorrectly if the backend gives us a
bogus response.  By clearing it we ensure that it is caught by the warning
"Bad rx response id %d.\n".  This is also needed for the sanity checks
on rx_skbs before we store a new skb into it.

Cheers,
-- 
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <herbert@xxxxxxxxxxxxxxxxxxx>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.