Re: [PATCH V5 2/6 net-next] netdevice.h: Add zero-copy flag in netdevice
From: Shirley Ma <hidden>
Date: 2011-05-18 16:47:19
Also in:
kvm, lkml
On Wed, 2011-05-18 at 19:36 +0300, Michael S. Tsirkin wrote:
On Wed, May 18, 2011 at 09:07:37AM -0700, Shirley Ma wrote:quoted
On Wed, 2011-05-18 at 18:47 +0300, Michael S. Tsirkin wrote:quoted
On Wed, May 18, 2011 at 07:38:27AM -0700, Shirley Ma wrote:quoted
On Wed, 2011-05-18 at 13:40 +0200, Michał Mirosław wrote:quoted
quoted
quoted
quoted
quoted
Not more other restrictions, skb clone is OK.pskb_expand_head()quoted
quoted
looksquoted
quoted
quoted
quoted
OK to me from code review.Hmm. pskb_expand_head calls skb_release_data whilekeepingquoted
quoted
quoted
quoted
quoted
quoted
quoted
references to pages. How is that ok? What do I miss?It's making copy of the skb_shinfo earlier, so the pagesrefcountquoted
quoted
quoted
quoted
stays the same.Exactly. But the callback is invoked so the guest thinksit's okquoted
quoted
toquoted
quoted
quoted
change this memory. If it does a corrupted packet will besentquoted
quoted
out.quoted
quoted
Hmm. I tool a quick look at skb_clone(), and it looks likethisquoted
quoted
quoted
quoted
sequence will break this scheme: skb2 = skb_clone(skb...); kfree_skb(skb) or pskb_expand_head(skb); /* callback called*/quoted
quoted
quoted
quoted
[use skb2, pages still referenced] kfree_skb(skb); /* callback called again */ This sequence is common in bridge, might be in other places. Maybe this ubuf thing should just track clones? This will makeitquoted
quoted
workquoted
quoted
on all devices then.The callback was only invoked when last reference of skb wasgone.quoted
quoted
quoted
skb_clone does increase skb refcnt. I tested tcpdump on lowerdevice, itquoted
worked.Right, it will normally work, but two issues I think you miss: 1. malicious guest can change the memory between when it is sentoutquoted
quoted
by device and consumed by tcpdump, so you will see differentthingsquoted
quoted
(not sure how important this is). 2. if tcpdump stops consuming stuff from the packet socket (it's userspace, can't be trusted) then we won't get a callback for page potentially forever, guest networking will get blockedetc.quoted
quoted
quoted
For the sequence of: skb_clone -> last refcnt + 1 kfree_skb() or pskb_expand_head -> callback not called kfree_skb() -> callback called I will check page refcount to see whether it's balanced. Thanks shirleypskb_expand_head is a problem anyway I think as it can hang on to pages after it calls release_data. Then guest will modify these pages and you get trash there.This can be avoid by allowing pskb_expand_head in fastpath only, I think. But not sure whether tcpdump can still work with this. Thanks ShirleyYes, I agree. I think for tcpdump, we really need to copy the data anyway, to avoid guest changing it in between. So we do that and then use the copy everywhere, release the old one. Hmm?
Yes. Old one use zerocopy, new one use copy data. Thanks Shirley