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.073 / U:0.252 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site