All of lore.kernel.org
 help / color / mirror / Atom feed
* GPLPV: Respecting SG capability
@ 2009-04-27 18:32 Russ Blaine
  2009-04-28  0:51 ` James Harper
  0 siblings, 1 reply; 6+ messages in thread
From: Russ Blaine @ 2009-04-27 18:32 UTC (permalink / raw)
  To: James Harper; +Cc: xen-devel

Hi James,

As you may have heard, the latest GPLPV release doesn't work on 
Opensolaris dom0. Our backend net driver doesn't support scatter/gather, 
but it seems that GPLPV now requires it.

I have a fix for this in the frontend which coalesces all NDIS buffers 
into one ring transaction. With the fix, packets flow again.

Once this is addressed I may go and implement SG in our backend anyway, 
but I wanted to get this fix into the GPLPV source first to enable 
networking on older and current dom0s.

The fix as I have it now is around line 229 of xennet_tx.c (see below). 
I think a further and necessary improvement on this would be to avoid 
the construction of the header_buf() altogether in the no-sg case. There 
is also only one tx_sendbuf per driver instance (it just points to 
tx_hb[0]), and I suppose there should be several and that they should be 
managed in the same way you deal with the tx_hb[] instances.

Actually, on second look, there is a per-driver-instance tx_lock which 
must act to serialize all transmits? In which case we only need a single 
tx_sendbuf anyhow. Would Windows benefit from having a reentrant send 
routine?

Here is the prototype of the fix.

  if (xi->config_sg == 0) {
       int i;
       ULONG len;
       ULONG offset = 0;
       PNDIS_BUFFER buf;

       buf = pi.first_buffer;
       while (buf) {
           PUCHAR src_addr;

           NdisQueryBufferSafe(buf, &src_addr, &len, NormalPagePriority);

           memcpy((PUCHAR)xi->tx_sendbuf.virtual + offset, src_addr, len);
           offset += len;

           NdisGetNextBuffer(buf, &buf);
       }

       tx0->gref = (grant_ref_t)xi->tx_sendbuf.logical.QuadPart >> 
PAGE_SHIFT;
       tx0->offset = (USHORT)xi->tx_sendbuf.logical.LowPart & (PAGE_SIZE 
- 1);
       ASSERT(offset == pi.total_length);
       tx0->size = offset;
       tx0->flags &= ~NETTXF_more_data;
       sg_element = sg->NumberOfElements;
   } else if (header_buf)

Cheers,
- Russ

-----------------------------------------------------
Russ Blaine | Solaris Kernel | russell.blaine@sun.com

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2009-06-19 12:45 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-04-27 18:32 GPLPV: Respecting SG capability Russ Blaine
2009-04-28  0:51 ` James Harper
2009-06-18 22:31   ` Russ Blaine
2009-06-19 10:53     ` James Harper
2009-06-19 12:39     ` James Harper
2009-06-19 12:45       ` David Edmondson

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.