[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC 1/4] xen-netback: Factor queue-specific data into queue struct.
On Wed, Jan 15, 2014 at 04:23:21PM +0000, Andrew J. Bennieston wrote: [...] > + > +struct xenvif_queue { /* Per-queue data for xenvif */ > + unsigned int number; /* Queue number, 0-based */ Use "id" instead? > + char name[IFNAMSIZ+4]; /* DEVNAME-qN */ > + struct xenvif *vif; /* Parent VIF */ > > /* Use NAPI for guest TX */ > struct napi_struct napi; > /* When feature-split-event-channels = 0, tx_irq = rx_irq. */ > unsigned int tx_irq; > /* Only used when feature-split-event-channels = 1 */ > - char tx_irq_name[IFNAMSIZ+4]; /* DEVNAME-tx */ > + char tx_irq_name[IFNAMSIZ+7]; /* DEVNAME-qN-tx */ > struct xen_netif_tx_back_ring tx; > struct sk_buff_head tx_queue; > struct page *mmap_pages[MAX_PENDING_REQS]; > @@ -140,7 +142,7 @@ struct xenvif { > /* When feature-split-event-channels = 0, tx_irq = rx_irq. */ > unsigned int rx_irq; > /* Only used when feature-split-event-channels = 1 */ > - char rx_irq_name[IFNAMSIZ+4]; /* DEVNAME-rx */ > + char rx_irq_name[IFNAMSIZ+7]; /* DEVNAME-qN-rx */ > struct xen_netif_rx_back_ring rx; > struct sk_buff_head rx_queue; > > @@ -150,14 +152,27 @@ struct xenvif { > */ > RING_IDX rx_req_cons_peek; > > - /* This array is allocated seperately as it is large */ > - struct gnttab_copy *grant_copy_op; > + struct gnttab_copy grant_copy_op[MAX_GRANT_COPY_OPS]; Any reason to swtich back to array inside structure? This array is really large. > > /* We create one meta structure per ring request we consume, so > * the maximum number is the same as the ring size. > */ > struct xenvif_rx_meta meta[XEN_NETIF_RX_RING_SIZE]; > > + /* Transmit shaping: allow 'credit_bytes' every 'credit_usec'. */ > + unsigned long credit_bytes; > + unsigned long credit_usec; > + unsigned long remaining_credit; > + struct timer_list credit_timeout; > + u64 credit_window_start; > + > +}; > + [...] > > +static u16 select_queue(struct net_device *dev, struct sk_buff *skb) Suggest add xenvif_ prefix. > +{ > + struct xenvif *vif = netdev_priv(dev); > + u32 hash; > + u16 queue_index; > + > + /* First, check if there is only one queue */ > + if (vif->num_queues == 1) { > + queue_index = 0; > + } > + else { Coding style. > + /* Use skb_get_rxhash to obtain an L4 hash if available */ > + hash = skb_get_rxhash(skb); > + queue_index = (u16) (((u64)hash * vif->num_queues) >> 32); > + } Actually why do you special-case num_queues == 1? If it is an optimazation for old frontend then please add some comment. > + > + return queue_index; > +} > + > static int xenvif_start_xmit(struct sk_buff *skb, struct net_device *dev) > { > struct xenvif *vif = netdev_priv(dev); > + u16 queue_index = 0; > + struct xenvif_queue *queue = NULL; > > BUG_ON(skb->dev != dev); > > - /* Drop the packet if vif is not ready */ > - if (vif->task == NULL) > + /* Drop the packet if the queues are not set up */ > + if (vif->num_queues < 1 || vif->queues == NULL) You don't need both, do you? They should be strictly synchronized. > + goto drop; > + > + /* Obtain the queue to be used to transmit this packet */ > + queue_index = skb_get_queue_mapping(skb); > + queue = &vif->queues[queue_index]; > + > + /* Drop the packet if queue is not ready */ > + if (queue->task == NULL) > goto drop; > [...] > static struct net_device_stats *xenvif_get_stats(struct net_device *dev) > @@ -163,20 +209,30 @@ static struct net_device_stats *xenvif_get_stats(struct > net_device *dev) > > static void xenvif_up(struct xenvif *vif) > { > - napi_enable(&vif->napi); > - enable_irq(vif->tx_irq); > - if (vif->tx_irq != vif->rx_irq) > - enable_irq(vif->rx_irq); > - xenvif_check_rx_xenvif(vif); > + struct xenvif_queue *queue = NULL; > + unsigned int queue_index; Better insert empty line here. > + for (queue_index = 0; queue_index < vif->num_queues; ++queue_index) { > + queue = &vif->queues[queue_index]; > + napi_enable(&queue->napi); > + enable_irq(queue->tx_irq); > + if (queue->tx_irq != queue->rx_irq) > + enable_irq(queue->rx_irq); > + xenvif_check_rx_xenvif(queue); > + } > } > > static void xenvif_down(struct xenvif *vif) > { > - napi_disable(&vif->napi); > - disable_irq(vif->tx_irq); > - if (vif->tx_irq != vif->rx_irq) > - disable_irq(vif->rx_irq); > - del_timer_sync(&vif->credit_timeout); > + struct xenvif_queue *queue = NULL; > + unsigned int queue_index; Ditto. > + for (queue_index = 0; queue_index < vif->num_queues; ++queue_index) { > + queue = &vif->queues[queue_index]; > + napi_disable(&queue->napi); > + disable_irq(queue->tx_irq); > + if (queue->tx_irq != queue->rx_irq) > + disable_irq(queue->rx_irq); > + del_timer_sync(&queue->credit_timeout); > + } > } > [...] > @@ -622,20 +672,9 @@ static int connect_rings(struct backend_info *be) > val = 0; > vif->ipv6_csum = !!val; > > - /* Map the shared frame, irq etc. */ > - err = xenvif_connect(vif, tx_ring_ref, rx_ring_ref, > - tx_evtchn, rx_evtchn); > - if (err) { > - xenbus_dev_fatal(dev, err, > - "mapping shared-frames %lu/%lu port tx %u rx > %u", > - tx_ring_ref, rx_ring_ref, > - tx_evtchn, rx_evtchn); > - return err; > - } > return 0; > } > > - Blank line change, not necessary. Wei. > /* ** Driver Registration ** */ > > > -- > 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |