lkml.org 
[lkml]   [2010]   [May]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC][PATCH v6 05/19] Add a function make external buffer owner to query capability.
    Date
    From: Xin Xiaohui <xiaohui.xin@intel.com>

    The external buffer owner can use the functions to get
    the capability of the underlying NIC driver.

    Signed-off-by: Xin Xiaohui <xiaohui.xin@intel.com>
    Signed-off-by: Zhao Yu <yzhaonew@gmail.com>
    Reviewed-by: Jeff Dike <jdike@linux.intel.com>
    ---
    include/linux/netdevice.h | 2 +
    net/core/dev.c | 51 +++++++++++++++++++++++++++++++++++++++++++++
    2 files changed, 53 insertions(+), 0 deletions(-)

    diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
    index 183c786..31d9c4a 100644
    --- a/include/linux/netdevice.h
    +++ b/include/linux/netdevice.h
    @@ -1599,6 +1599,8 @@ extern gro_result_t napi_gro_frags(struct napi_struct *napi);
    extern int netdev_mp_port_attach(struct net_device *dev,
    struct mpassthru_port *port);
    extern void netdev_mp_port_detach(struct net_device *dev);
    +extern int netdev_mp_port_prep(struct net_device *dev,
    + struct mpassthru_port *port);

    static inline void napi_free_frags(struct napi_struct *napi)
    {
    diff --git a/net/core/dev.c b/net/core/dev.c
    index ecbb6b1..37b389a 100644
    --- a/net/core/dev.c
    +++ b/net/core/dev.c
    @@ -2497,6 +2497,57 @@ void netdev_mp_port_detach(struct net_device *dev)
    }
    EXPORT_SYMBOL(netdev_mp_port_detach);

    +/* To support meidate passthru(zero-copy) with NIC driver,
    + * we'd better query NIC driver for the capability it can
    + * provide, especially for packet split mode, now we only
    + * query for the header size, and the payload a descriptor
    + * may carry. If a driver does not use the API to export,
    + * then we may try to use a default value, currently,
    + * we use the default value from an IGB driver. Now,
    + * it's only called by mpassthru device.
    + */
    +#if defined(CONFIG_MEDIATE_PASSTHRU) || defined(CONFIG_MEDIATE_PASSTHRU_MODULE)
    +int netdev_mp_port_prep(struct net_device *dev,
    + struct mpassthru_port *port)
    +{
    + int rc;
    + int npages, data_len;
    + const struct net_device_ops *ops = dev->netdev_ops;
    +
    + /* needed by packet split */
    +
    + if (ops->ndo_mp_port_prep) {
    + rc = ops->ndo_mp_port_prep(dev, port);
    + if (rc)
    + return rc;
    + } else {
    + /* If the NIC driver did not report this,
    + * then we try to use default value.
    + */
    + port->hdr_len = 128;
    + port->data_len = 2048;
    + port->npages = 1;
    + }
    +
    + if (port->hdr_len <= 0)
    + goto err;
    +
    + npages = port->npages;
    + data_len = port->data_len;
    + if (npages <= 0 || npages > MAX_SKB_FRAGS ||
    + (data_len < PAGE_SIZE * (npages - 1) ||
    + data_len > PAGE_SIZE * npages))
    + goto err;
    +
    + return 0;
    +err:
    + dev_warn(&dev->dev, "invalid page constructor parameters\n");
    +
    + return -EINVAL;
    +}
    +EXPORT_SYMBOL(netdev_mp_port_prep);
    +#endif
    +
    /**
    * netif_receive_skb - process receive buffer from network
    * @skb: buffer to process
    --
    1.5.4.4


    \
     
     \ /
      Last update: 2010-05-21 11:31    [W:0.025 / U:30.184 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site