On 04/16/2011 11:23 PM, Teck Choon Giam wrote:
> On Sun, Apr 17, 2011 at 9:44 AM, Digimer <linux@xxxxxxxxxxx> wrote:
>> Hi all,
>>
>> As per the request on ##xen, I'm reposting this with patches and
>> diff's inline. Please ignore my earlier post.
>>
>> With a *lot* of help from Pasi yesterday, I was trying to get Olaf's
>> vif MTU patch
>> (http://lists.xensource.com/archives/html/xen-devel/2011-02/msg00352.html)
>> applied against the most recent EL5.6 (RHEL 5.6/CentOS 5.6) kernel
>> version 2.6.18-238.9.
>>
>> The patch as-is didn't apply cleanly, as there seemed to be a line
>> shift issue with common.h and xenbus.c. I manually added the lines and
>> created a new patch, but I screwed something up and it fails to compile.
>> I should note that I am /not/ a C programmer. :)
>>
>> Here is adapted patch:
>>
>> ====
>> --- linux-2.6.18.x86_64/drivers/xen/netback/common.h.orig 2011-04-15
>> 17:46:12.730677042 -0400
>> +++ linux-2.6.18.x86_64/drivers/xen/netback/common.h 2011-04-15
>> 17:57:57.490721792 -0400
>> @@ -76,8 +76,13 @@
>> struct vm_struct *tx_comms_area;
>> struct vm_struct *rx_comms_area;
>>
>> - /* Set of features that can be turned on in dev->features. */
>> - int features;
>> + /* Flags that must not be set in dev->features */
>> + int features_disabled;
>> +
>> + /* Frontend feature information. */
>> + u8 can_sg:1;
>> + u8 gso:1;
>> + u8 csum:1;
>>
>> /* Internal feature information. */
>> int can_queue:1; /* can queue packets for receiver? */
>> @@ -110,6 +115,7 @@
>>
>> void netif_disconnect(netif_t *netif);
>>
>> +void netif_set_features(netif_t *netif);
>> netif_t *netif_alloc(domid_t domid, unsigned int handle);
>> int netif_map(netif_t *netif, unsigned long tx_ring_ref,
>> unsigned long rx_ring_ref, unsigned int evtchn);
>> @@ -142,7 +148,7 @@
>> static inline int netbk_can_sg(struct net_device *dev)
>> {
>> netif_t *netif = netdev_priv(dev);
>> - return netif->features & NETIF_F_SG;
>> + return netif->can_sg;
>> }
>>
>> #endif /* __NETIF__BACKEND__COMMON_H__ */
>> --- linux-2.6.18.x86_64/drivers/xen/netback/interface.c.orig 2011-04-15
>> 17:46:57.205456542 -0400
>> +++ linux-2.6.18.x86_64/drivers/xen/netback/interface.c 2011-04-15
>> 17:50:46.027757042 -0400
>> @@ -90,34 +90,75 @@
>> return 0;
>> }
>>
>> -static int netbk_set_sg(struct net_device *dev, u32 data)
>> +void netif_set_features(netif_t *netif)
>> {
>> + struct net_device *dev = netif->dev;
>> + int features = dev->features;
>> +
>> + if (netif->can_sg)
>> + features |= NETIF_F_SG;
>> + if (netif->gso)
>> + features |= NETIF_F_TSO;
>> + if (netif->csum)
>> + features |= NETIF_F_IP_CSUM;
>> +
>> + features &= ~(netif->features_disabled);
>> +
>> + if (!(features & NETIF_F_SG) && dev->mtu > ETH_DATA_LEN)
>> + dev->mtu = ETH_DATA_LEN;
>> +
>> + dev->features = features;
>> +}
>> +
>> +static int netbk_set_tx_csum(struct net_device *dev, u32 data)
>> +{
>> + netif_t *netif = netdev_priv(dev);
>> if (data) {
>> - netif_t *netif = netdev_priv(dev);
>> + if (!netif->csum)
>> + return -ENOSYS;
>> + netif->features_disabled &= ~NETIF_F_IP_CSUM;
>> + } else {
>> + netif->features_disabled |= NETIF_F_IP_CSUM;
>> + }
>>
>> - if (!(netif->features & NETIF_F_SG))
>> + netif_set_features(netif);
>> + return 0;
>> +}
>> +
>> +static int netbk_set_sg(struct net_device *dev, u32 data)
>> +{
>> + netif_t *netif = netdev_priv(dev);
>> + if (data) {
>> + if (!netif->can_sg)
>> return -ENOSYS;
>> + netif->features_disabled &= ~NETIF_F_SG;
>> + } else {
>> + netif->features_disabled |= NETIF_F_SG;
>> }
>>
>> - return ethtool_op_set_sg(dev, data);
>> + netif_set_features(netif);
>> + return 0;
>> }
>>
>> static int netbk_set_tso(struct net_device *dev, u32 data)
>> {
>> + netif_t *netif = netdev_priv(dev);
>> if (data) {
>> - netif_t *netif = netdev_priv(dev);
>> -
>> - if (!(netif->features & NETIF_F_TSO))
>> + if (!netif->gso)
>> return -ENOSYS;
>> + netif->features_disabled &= ~NETIF_F_TSO;
>> + } else {
>> + netif->features_disabled |= NETIF_F_TSO;
>> }
>>
>> - return ethtool_op_set_tso(dev, data);
>> + netif_set_features(netif);
>> + return 0;
>> }
>>
>> static struct ethtool_ops network_ethtool_ops =
>> {
>> .get_tx_csum = ethtool_op_get_tx_csum,
>> - .set_tx_csum = ethtool_op_set_tx_csum,
>> + .set_tx_csum = netbk_set_tx_csum,
>> .get_sg = ethtool_op_get_sg,
>> .set_sg = netbk_set_sg,
>> .get_tso = ethtool_op_get_tso,
>> @@ -145,6 +186,8 @@
>> memset(netif, 0, sizeof(*netif));
>> netif->domid = domid;
>> netif->handle = handle;
>> + netif->can_sg = 1;
>> + netif->csum = 1;
>> atomic_set(&netif->refcnt, 1);
>> init_waitqueue_head(&netif->waiting_to_free);
>> netif->dev = dev;
>> @@ -162,7 +205,8 @@
>> dev->open = net_open;
>> dev->stop = net_close;
>> dev->change_mtu = netbk_change_mtu;
>> - dev->features = NETIF_F_IP_CSUM;
>> +
>> + netif_set_features(netif);
>>
>> SET_ETHTOOL_OPS(dev, &network_ethtool_ops);
>>
>> --- linux-2.6.18.x86_64/drivers/xen/netback/netback.c.orig 2011-04-15
>> 17:46:58.141515042 -0400
>> +++ linux-2.6.18.x86_64/drivers/xen/netback/netback.c 2011-04-15
>> 17:50:46.027757042 -0400
>> @@ -215,7 +215,7 @@
>>
>> static inline int netbk_max_required_rx_slots(netif_t *netif)
>> {
>> - if (netif->features & (NETIF_F_SG|NETIF_F_TSO))
>> + if (netif->can_sg || netif->gso)
>> return MAX_SKB_FRAGS + 2; /* header + extra_info + frags */
>> return 1; /* all in one */
>> }
>> --- linux-2.6.18.x86_64/drivers/xen/netback/xenbus.c.orig 2011-04-15
>> 17:46:59.217582292 -0400
>> +++ linux-2.6.18.x86_64/drivers/xen/netback/xenbus.c 2011-04-15
>> 18:13:20.700418792 -0400
>> @@ -345,6 +345,7 @@
>>
>> static int connect_rings(struct backend_info *be)
>> {
>> + netif_t *netif = be->netif;
>> struct xenbus_device *dev = be->dev;
>> unsigned long tx_ring_ref, rx_ring_ref;
>> unsigned int evtchn, rx_copy;
>> @@ -375,46 +376,40 @@
>> dev->otherend);
>> return err;
>> }
>> - be->netif->copying_receiver = !!rx_copy;
>> + netif->copying_receiver = !!rx_copy;
>>
>> - if (be->netif->dev->tx_queue_len != 0) {
>> + if (netif->dev->tx_queue_len != 0) {
>> if (xenbus_scanf(XBT_NIL, dev->otherend,
>> "feature-rx-notify", "%d", &val) < 0)
>> val = 0;
>> if (val)
>> - be->netif->can_queue = 1;
>> + netif->can_queue = 1
>
> You need to end semi-colon for the above which I think your compile
> error output is showing I guess.
>
>> else
>> /* Must be non-zero for pfifo_fast to work. */
>> - be->netif->dev->tx_queue_len = 1;
>> + netif->dev->tx_queue_len = 1;
>> }
>>
>> if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-sg", "%d", &val) <
>> 0)
>> val = 0;
>> - if (val) {
>> - be->netif->features |= NETIF_F_SG;
>> - be->netif->dev->features |= NETIF_F_SG;
>> - }
>> + netif->can_sg = !!val;
>>
>> if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-gso-tcpv4", "%d",
>> &val) < 0)
>> val = 0;
>> - if (val) {
>> - be->netif->features |= NETIF_F_TSO;
>> - be->netif->dev->features |= NETIF_F_TSO;
>> - }
>> + netif->gso = !!val;
>>
>> if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-no-csum-offload",
>> "%d", &val) < 0)
>> val = 0;
>> - if (val) {
>> - be->netif->features &= ~NETIF_F_IP_CSUM;
>> - be->netif->dev->features &= ~NETIF_F_IP_CSUM;
>> - }
>> + netif->csum = !val;
>> +
>> + /* Set dev->features */
>> + netif_set_features(netif);
>>
>> netdev_features_change(be->netif->dev);
>>
>> /* Map the shared frame, irq etc. */
>> - err = netif_map(be->netif, tx_ring_ref, rx_ring_ref, evtchn);
>> + err = netif_map(netif, tx_ring_ref, rx_ring_ref, evtchn);
>> if (err) {
>> xenbus_dev_fatal(dev, err,
>> "mapping shared-frames %lu/%lu port %u",
>> ====
>>
>> And here is the compile output with errors:
>>
>> ====
>> drivers/xen/blkfront/blkfront.c: In function 'do_blkif_request':
>> drivers/xen/blkfront/blkfront.c:629: warning: format '%lx' expects type
>> 'long unsigned int', but argument 4 has type 'sector_t'
>> drivers/xen/blktap/blktapmain.c:145: warning: 'set_blkif_reqs' defined
>> but not used
>> drivers/xen/netback/xenbus.c: In function 'connect_rings':
>> drivers/xen/netback/xenbus.c:387: error: expected ';' before 'else'
>
> Is the line 387 the one without the ; above? I guess so :p
>
> Thanks.
>
> Kindest regards,
> Giam Teck Choon
Oh dear, now this is embarrassing!
I'll edit it and re-run the compile. I'll post a follow-up in an hour or
two. :P
Thanks!
--
Digimer
E-Mail: digimer@xxxxxxxxxxx
AN!Whitepapers: http://alteeve.com
Node Assassin: http://nodeassassin.org
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|