lkml.org 
[lkml]   [2010]   [Dec]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v16 08/17]Modify netdev_free_page() to release external buffer
    Date
    From: Xin Xiaohui <xiaohui.xin@intel.com>

    Currently, it can get external buffers from mp device.

    Signed-off-by: Xin Xiaohui <xiaohui.xin@intel.com>
    Signed-off-by: Zhao Yu <yzhao81new@gmail.com>
    Reviewed-by: Jeff Dike <jdike@linux.intel.com>
    ---
    include/linux/skbuff.h | 4 +++-
    net/core/skbuff.c | 24 ++++++++++++++++++++++++
    2 files changed, 27 insertions(+), 1 deletions(-)

    diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
    index 6e1e991..6309ce6 100644
    --- a/include/linux/skbuff.h
    +++ b/include/linux/skbuff.h
    @@ -1586,9 +1586,11 @@ static inline struct page *netdev_alloc_page(struct net_device *dev)
    return __netdev_alloc_page(dev, GFP_ATOMIC);
    }

    +extern void __netdev_free_page(struct net_device *dev, struct page *page);
    +
    static inline void netdev_free_page(struct net_device *dev, struct page *page)
    {
    - __free_page(page);
    + __netdev_free_page(dev, page);
    }

    /**
    diff --git a/net/core/skbuff.c b/net/core/skbuff.c
    index b9858c7..d3ece5c 100644
    --- a/net/core/skbuff.c
    +++ b/net/core/skbuff.c
    @@ -298,6 +298,30 @@ struct page *__netdev_alloc_page(struct net_device *dev, gfp_t gfp_mask)
    }
    EXPORT_SYMBOL(__netdev_alloc_page);

    +void netdev_free_ext_page(struct net_device *dev, struct page *page)
    +{
    + struct skb_ext_page *ext_page = NULL;
    + if (dev_is_mpassthru(dev) && dev->mp_port->hash) {
    + ext_page = dev->mp_port->hash(dev, page);
    + if (ext_page)
    + ext_page->dtor(ext_page);
    + else
    + __free_page(page);
    + }
    +}
    +EXPORT_SYMBOL(netdev_free_ext_page);
    +
    +void __netdev_free_page(struct net_device *dev, struct page *page)
    +{
    + if (dev_is_mpassthru(dev)) {
    + netdev_free_ext_page(dev, page);
    + return;
    + }
    +
    + __free_page(page);
    +}
    +EXPORT_SYMBOL(__netdev_free_page);
    +
    void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page, int off,
    int size)
    {
    --
    1.7.3


    \
     
     \ /
      Last update: 2010-12-01 08:49    [W:0.028 / U:118.948 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site