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

Re: [Xen-devel] PCI passthrough issue

On Wed, 2011-02-02 at 15:38 +0000, Konrad Rzeszutek Wilk wrote:
> > > Ping tests work whatever can be packet size.
> > > 
> > > If I understood well what you explain to me, it's now clear that the
> > > problem is somewhat Xen related, isn't it ?
> > 
> > It certainly seems that way. I'm not 100% sure that swiotlb=force will
> > have actually made the driver use the swiotlb, it may just have forced
> 
> It should have.
> 
> > the swiotlb to be allocated. Konrad?
> 
> Both. It would allocate it and force all DMA operations to go through
> the bounce buffer.
> 
> Let me take a look at the driver itself. Ah, so I had a similar card: 3c59x
> which hit the same type of failure way back in 2.6.31 time. It had the
> pci_dma_sync_single_for_cpu(.. PCI_DMA_FROMDEVICE) turned around so it would 
> never
> copy properly. But in my tree (2.6.38) the sky driver looks to be doing just
> right.. It has PCI_DMA_FROMDEVICE..
> 
> Well this looks odd:
> 
> 2330         skb = netdev_alloc_skb_ip_align(sky2->netdev, length);
> 2331         if (likely(skb)) {
> 2332                 pci_dma_sync_single_for_cpu(sky2->hw->pdev, 
> re->data_addr,
> 2333                                             length, PCI_DMA_FROMDEVICE); 
> =======>             skb_copy_from_linear_data(re->skb, skb->data, length); 
> <====
> 2335                 skb->ip_summed = re->skb->ip_summed;
> 2336                 skb->csum = re->skb->csum;
> 2337                 pci_dma_sync_single_for_device(sky2->hw->pdev, 
> re->data_addr,
> 2338                                                length, 
> PCI_DMA_FROMDEVICE); 
> 2339                 re->skb->ip_summed = CHECKSUM_NONE;
> 2340                 skb_put(skb, length);
> 2341         }
> 
> It copies from skb->data (just allocated) to re->skb (seems that the 
> re->skb->data
> has been earlier DMA-mapped).
> 
> But there is no data in skb->data as we just allocated it? Shouldn't this
> be the other way around? Like this:

skb_copy_from_linear_data's arguments are the other way round to what
you may be expecting:
static inline void skb_copy_from_linear_data(const struct sk_buff *skb,
                                             void *to,
                                             const unsigned int len)

So the above line is correctly copying from re->skb->data to skb->data
not the other way round.

I stared at that exact line for ages this morning ;-)

Ian.


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

<Prev in Thread] Current Thread [Next in Thread>