[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 5/8] netback: multi-page ring support
On 15/02/13 16:00, Wei Liu wrote: > [nothing] You need to describe the protocol used to negotiate this. What happens when a frontend without such support connects to a backend with support? And vice-versa? > --- a/drivers/net/xen-netback/common.h > +++ b/drivers/net/xen-netback/common.h > @@ -45,6 +45,12 @@ > #include <xen/grant_table.h> > #include <xen/xenbus.h> > > +#define NETBK_MAX_RING_PAGE_ORDER XENBUS_MAX_RING_PAGE_ORDER > +#define NETBK_MAX_RING_PAGES (1U << NETBK_MAX_RING_PAGE_ORDER) > + > +#define NETBK_MAX_TX_RING_SIZE XEN_NETIF_TX_RING_SIZE(NETBK_MAX_RING_PAGES) > +#define NETBK_MAX_RX_RING_SIZE XEN_NETIF_RX_RING_SIZE(NETBK_MAX_RING_PAGES) See comment below. > @@ -105,15 +113,19 @@ static inline struct xenbus_device > *xenvif_to_xenbus_device(struct xenvif *vif) > return to_xenbus_device(vif->dev->dev.parent); > } > > -#define XEN_NETIF_TX_RING_SIZE __CONST_RING_SIZE(xen_netif_tx, PAGE_SIZE) > -#define XEN_NETIF_RX_RING_SIZE __CONST_RING_SIZE(xen_netif_rx, PAGE_SIZE) > +#define XEN_NETIF_TX_RING_SIZE(_nr_pages) \ > + __CONST_RING_SIZE(xen_netif_tx, PAGE_SIZE * (_nr_pages)) Ring size is no longer const. Would these be better as inline functions with a struct xenvif parameter? Would need to fixup the MAX_XX_RING_SIZE macros above. > index db638e1..fa4d46d 100644 > --- a/drivers/net/xen-netback/interface.c > +++ b/drivers/net/xen-netback/interface.c > @@ -305,10 +305,16 @@ struct xenvif *xenvif_alloc(struct device *parent, > domid_t domid, > return vif; > } > > -int xenvif_connect(struct xenvif *vif, unsigned long tx_ring_ref, > - unsigned long rx_ring_ref, unsigned int evtchn) > +int xenvif_connect(struct xenvif *vif, > + unsigned long *tx_ring_ref, unsigned int tx_ring_ref_count, > + unsigned long *rx_ring_ref, unsigned int rx_ring_ref_count, > + unsigned int evtchn) > { > int err = -ENOMEM; > + void *addr; > + struct xen_netif_tx_sring *txs; > + struct xen_netif_rx_sring *rxs; > + int tmp[NETBK_MAX_RING_PAGES], i; grant_ref_t, and elsewhere probably -- I didn't check. > @@ -382,7 +413,8 @@ void xenvif_disconnect(struct xenvif *vif) > > unregister_netdev(vif->dev); > > - xen_netbk_unmap_frontend_rings(vif); > + xen_netbk_unmap_frontend_rings(vif, (void *)vif->tx.sring); > + xen_netbk_unmap_frontend_rings(vif, (void *)vif->rx.sring); Don't need the casts here. > --- a/drivers/net/xen-netback/netback.c > +++ b/drivers/net/xen-netback/netback.c > @@ -47,6 +47,19 @@ > #include <asm/xen/hypercall.h> > #include <asm/xen/page.h> > > +unsigned int MODPARM_netback_max_rx_ring_page_order = > NETBK_MAX_RING_PAGE_ORDER; > +module_param_named(netback_max_rx_ring_page_order, > + MODPARM_netback_max_rx_ring_page_order, uint, 0); Please don't prefix new module parameters with "netback", "max_rx_ring_page_order" is fine. > +MODULE_PARM_DESC(netback_max_rx_ring_page_order, > + "Maximum supported receiver ring page order"); > + > +unsigned int MODPARM_netback_max_tx_ring_page_order = > NETBK_MAX_RING_PAGE_ORDER; > +module_param_named(netback_max_tx_ring_page_order, > + MODPARM_netback_max_tx_ring_page_order, uint, 0); Ditto. > +MODULE_PARM_DESC(netback_max_tx_ring_page_order, > + "Maximum supported transmitter ring page order"); > + > + [...] > --- a/drivers/net/xen-netback/xenbus.c > +++ b/drivers/net/xen-netback/xenbus.c [...] > + err = xenbus_scanf(XBT_NIL, dev->otherend, "tx-ring-order", "%u", > + &tx_ring_order); > + if (err < 0) { > + tx_ring_order = 0; > + > + err = xenbus_scanf(XBT_NIL, dev->otherend, "tx-ring-ref", "%lu", > + &tx_ring_ref[0]); > + if (err < 0) { > + xenbus_dev_fatal(dev, err, "reading %s/tx-ring-ref", > + dev->otherend); > + return err; > + } > + } else { > + unsigned int i; > + > + if (tx_ring_order > MODPARM_netback_max_tx_ring_page_order) { > + err = -EINVAL; > + xenbus_dev_fatal(dev, err, > + "%s/tx-ring-page-order too big", > + dev->otherend); > + return err; > + } > + > + for (i = 0; i < (1U << tx_ring_order); i++) { > + char ring_ref_name[sizeof("tx-ring-ref") + 2]; > + > + snprintf(ring_ref_name, sizeof(ring_ref_name), > + "tx-ring-ref%u", i); > + > + err = xenbus_scanf(XBT_NIL, dev->otherend, > + ring_ref_name, "%lu", > + &tx_ring_ref[i]); > + if (err < 0) { > + xenbus_dev_fatal(dev, err, > + "reading %s/%s", > + dev->otherend, > + ring_ref_name); > + return err; > + } > + } Refactor this whole if/else block and the similar code below for rx into a common library function? It will be useful for blkback etc. as well. > @@ -454,11 +566,28 @@ static int connect_rings(struct backend_info *be) > vif->csum = !val; > > /* Map the shared frame, irq etc. */ > - err = xenvif_connect(vif, tx_ring_ref, rx_ring_ref, evtchn); > + err = xenvif_connect(vif, tx_ring_ref, (1U << tx_ring_order), > + rx_ring_ref, (1U << rx_ring_order), > + evtchn); > if (err) { > + /* construct 1 2 3 / 4 5 6 */ This comment doesn't make sense to me. David _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |