[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 5/6] xen-netback: coalesce slots before copying
On Mon, Mar 25, 2013 at 3:13 PM, David Vrabel <david.vrabel@xxxxxxxxxx> wrote: > On 25/03/13 11:08, Wei Liu wrote: >> This patch tries to coalesce tx requests when constructing grant copy >> structures. It enables netback to deal with situation when frontend's >> MAX_SKB_FRAGS is larger than backend's MAX_SKB_FRAGS. >> >> It defines max_skb_slots, which is a estimation of the maximum number of >> slots >> a guest can send, anything bigger than that is considered malicious. Now it >> is >> set to 20, which should be enough to accommodate Linux (16 to 19). > > This maximum needs to be defined as part of the protocol and added to > the interface header. > No, this is not part of the protocol and not a hard limit. It is configurable by system administrator. >> Also change variable name from "frags" to "slots" in netbk_count_requests. > > I think this renaming should have been done as a separate patch. > The frag -> slot thing only make sense after this patch. If I do this, I will need to partially reverted what I've done in a previous patch (like the frag -> slot in comment below you pointed out). :-( >> --- a/drivers/net/xen-netback/netback.c >> +++ b/drivers/net/xen-netback/netback.c >> @@ -47,11 +47,26 @@ >> #include <asm/xen/hypercall.h> >> #include <asm/xen/page.h> >> >> +/* >> + * This is an estimation of the maximum possible frags a SKB might >> + * have, anything larger than this is considered malicious. Typically >> + * Linux has 16 to 19. >> + */ > > Do you mean "max possible /slots/" a packet might have? > Yes. >> @@ -968,48 +987,114 @@ static struct gnttab_copy >> *xen_netbk_get_requests(struct xen_netbk *netbk, > [...] >> + /* Poison these fields, corresponding >> + * fields for head tx req will be set >> + * to correct values after the loop. >> + */ >> + netbk->mmap_pages[pending_idx] = (void >> *)(~0UL); >> + pending_tx_info[pending_idx].head = >> + INVALID_PENDING_RING_IDX; > > Do you need to poison both values? > Just for safety. I have BUG_ON in the release path to check for possible error. >> + >> + if (unlikely(!first)) { > > This isn't unlikely is it? > For big packet the chance is 1 in max_skb_slots, so 5% (1/20) in default case. >> + first = &pending_tx_info[pending_idx]; >> + start_idx = index; >> + head_idx = pending_idx; >> + } > > Instead of setting first here why not move the code below here? > Because first->req.size needs to be set to dst_offset, it has to be here anyway. So I put other fields here as well. >> + first->req.offset = 0; >> + first->req.size = dst_offset; >> + first->head = start_idx; >> + set_page_ext(page, netbk, head_idx); >> + netbk->mmap_pages[head_idx] = page; >> + frag_set_pending_idx(&frags[shinfo->nr_frags], head_idx); > >> @@ -1548,13 +1649,34 @@ static void xen_netbk_idx_release(struct xen_netbk >> *netbk, u16 pending_idx, > [...] >> + /* Setting any number other than >> + * INVALID_PENDING_RING_IDX indicates this slot is >> + * starting a new packet / ending a previous packet. >> + */ >> + pending_tx_info->head = 0; > > This doesn't look needed. It will be initialized again when reusing t > his pending_tx_info again, right? > Yes, it is needed. Otherwise netback responses to invalid tx_info and cause netfront to crash before coming into the re-initialization path. Wei. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |