Backend net driver acceleration diff -r 6362a643064a linux-2.6-xen-sparse/drivers/xen/netback/common.h --- a/linux-2.6-xen-sparse/drivers/xen/netback/common.h Thu Mar 08 13:45:57 2007 +0000 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/common.h Thu Mar 08 13:46:01 2007 +0000 @@ -114,6 +114,31 @@ typedef struct netif_st { #define netback_carrier_off(netif) ((netif)->carrier = 0) #define netback_carrier_ok(netif) ((netif)->carrier) + +#include +struct netback_accel_hooks { + int (*probe)(struct xenbus_device *dev); +}; + +/* Structure to track the state of a netback accelerator plugin */ +struct netback_accelerator { + int id; + char *frontend; + struct netback_accel_hooks *hooks; + struct netback_accelerator *next; +}; +extern void netback_connect_accelerator(int id, const char *frontend, + struct netback_accel_hooks *hooks); + +struct backend_info { + struct xenbus_device *dev; + netif_t *netif; + enum xenbus_state frontend_state; + void *netback_accel_priv; + struct netback_accelerator *accelerator; +}; + + #define NET_TX_RING_SIZE __RING_SIZE((netif_tx_sring_t *)0, PAGE_SIZE) #define NET_RX_RING_SIZE __RING_SIZE((netif_rx_sring_t *)0, PAGE_SIZE) diff -r 6362a643064a linux-2.6-xen-sparse/drivers/xen/netback/xenbus.c --- a/linux-2.6-xen-sparse/drivers/xen/netback/xenbus.c Thu Mar 08 13:45:57 2007 +0000 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/xenbus.c Thu Mar 08 13:46:01 2007 +0000 @@ -1,6 +1,7 @@ /* Xenbus code for netif backend Copyright (C) 2005 Rusty Russell Copyright (C) 2005 XenSource Ltd + Copyright (c) 2007 Solarflare Communications, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,11 +29,52 @@ printk("netback/xenbus (%s:%d) " fmt ".\n", __FUNCTION__, __LINE__, ##args) #endif -struct backend_info { - struct xenbus_device *dev; - netif_t *netif; - enum xenbus_state frontend_state; -}; +static struct netback_accelerator *accelerators = NULL; + +static int netback_accelerator_tell_backend(struct device *dev, void *arg){ + struct netback_accelerator *accelerator = + (struct netback_accelerator *)arg; + struct xenbus_device *xendev = to_xenbus_device(dev); + + if(!strcmp("vif", xendev->devicetype)){ + struct backend_info *be = xendev->dev.driver_data; + + be->accelerator = accelerator; + be->accelerator->hooks->probe(xendev); + } + return 0; +} + + +static void +netback_accelerator_tell_backends(struct netback_accelerator *accelerator) +{ + xenbus_for_each_backend(accelerator, netback_accelerator_tell_backend); +} + + +void netback_connect_accelerator(int id, const char *frontend, + struct netback_accel_hooks *hooks) +{ + struct netback_accelerator *new_accelerator = + kzalloc(sizeof(struct netback_accelerator), GFP_KERNEL); + + if(new_accelerator){ + new_accelerator->id = id; + new_accelerator->frontend = kzalloc(strlen(frontend), GFP_KERNEL); + strcpy(new_accelerator->frontend, frontend); + new_accelerator->hooks = hooks; + + new_accelerator->next = accelerators; + accelerators = new_accelerator; + + /* tell existing backends about new plugin */ + netback_accelerator_tell_backends(new_accelerator); + } +} +EXPORT_SYMBOL_GPL(netback_connect_accelerator); + static int connect_rings(struct backend_info *); static void connect(struct backend_info *); @@ -119,6 +161,12 @@ static int netback_probe(struct xenbus_d xenbus_dev_fatal(dev, err, "completing transaction"); goto fail; } + + be->accelerator = accelerators; + if(be->accelerator && be->accelerator->hooks + && be->accelerator->hooks->probe){ + be->accelerator->hooks->probe(dev); + } err = xenbus_switch_state(dev, XenbusStateInitWait); if (err)