lkml.org 
[lkml]   [2011]   [May]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH V5 2/6 net-next] netdevice.h: Add zero-copy flag in netdevice
    On Mon, May 16, 2011 at 08:47:33PM +0100, Ben Hutchings wrote:
    > On Mon, 2011-05-16 at 12:38 -0700, Shirley Ma wrote:
    > > On Mon, 2011-05-16 at 20:35 +0100, Ben Hutchings wrote:
    > > > Sorry, bit 31 is taken. You get the job of turning features into a
    > > > wider bitmap.
    > >
    > > :) will do it.
    >
    > Bear in mind that feature masks are manipulated in many different
    > places. This is not a simple task.
    >
    > See previous discussion at:
    > http://thread.gmane.org/gmane.linux.network/193284
    > and especially:
    > http://thread.gmane.org/gmane.linux.network/193284/focus=193332
    >
    > Ben.


    IIUC, what is suggested above is something like:

    typedef struct net_features {
    } net_features_t;

    and then

    void netdev_set_feature(net_features_t *net_features, int feature);
    void netdev_clear_feature(net_features_t *net_features, int feature);
    bool netdev_test_feature(net_features_t *net_features, int feature);


    I think this might be the easiest way as compiler will catch any direct uses.
    It can then be split up nicely.

    It looks a bit different from what Dave suggested but I think it's
    close enough?

    we could also have wrappers that set/clear/test many features to replace
    uses of A|B|C that are pretty common.

    static inline void netdev_set_features(net_features_t *net_features, int nfeatures, int *features)
    {
    int i;
    for (i = 0; i < nfeatures; ++i)
    netdev_set_feature(net_features, features[i]);
    }
    void netdev_clear_features(net_features_t *net_features, int nfeatures, int *features)
    {
    int i;
    for (i = 0; i < nfeatures; ++i)
    netdev_clear_feature(net_features, features[i]);
    }
    bool netdev_test_features(net_features_t *net_features, int nfeatures, int *features)
    {
    int i;
    for (i = 0; i < nfeatures; ++i)
    if (netdev_test_feature(net_features, features[i]))
    return true;
    return false;
    }

    and possibly macros that get arrays of constants:

    #define NETDEV_SET_FEATURES(net_features, feature_array) do { \
    int __NETDEV_SET_FEATURES_F[] = feature_array;
    netdev_set_feature((net_features), \
    ARRAY_SIZE(__NETDEV_SET_FEATURES_F), __NETDEV_SET_FEATURES_F);
    } while (0)

    etc.

    > --
    > Ben Hutchings, Senior Software Engineer, Solarflare
    > Not speaking for my employer; that's the marketing department's job.
    > They asked us to note that Solarflare product names are trademarked.


    \
     
     \ /
      Last update: 2011-05-16 23:17    [W:0.044 / U:125.220 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site