Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9b0c290e authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

fib: introduce fib_alias_accessed() helper



Perf tools session at NFWS 2010 pointed out a false sharing on struct
fib_alias that can be avoided pretty easily, if we set FA_S_ACCESSED bit
only if needed (ie : not already set)

Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7b5edbc4
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -335,7 +335,8 @@ void fib_table_select_default(struct fib_table *tb,
			if (!next_fi->fib_nh[0].nh_gw ||
			    next_fi->fib_nh[0].nh_scope != RT_SCOPE_LINK)
				continue;
			fa->fa_state |= FA_S_ACCESSED;

			fib_alias_accessed(fa);

			if (fi == NULL) {
				if (next_fi != res->fi)
+7 −0
Original line number Diff line number Diff line
@@ -17,6 +17,13 @@ struct fib_alias {

#define FA_S_ACCESSED	0x01

/* Dont write on fa_state unless needed, to keep it shared on all cpus */
static inline void fib_alias_accessed(struct fib_alias *fa)
{
	if (!(fa->fa_state & FA_S_ACCESSED))
		fa->fa_state |= FA_S_ACCESSED;
}

/* Exported by fib_semantics.c */
extern int fib_semantic_match(struct list_head *head,
			      const struct flowi *flp,
+1 −1
Original line number Diff line number Diff line
@@ -901,7 +901,7 @@ int fib_semantic_match(struct list_head *head, const struct flowi *flp,
		if (fa->fa_scope < flp->fl4_scope)
			continue;

		fa->fa_state |= FA_S_ACCESSED;
		fib_alias_accessed(fa);

		err = fib_props[fa->fa_type].error;
		if (err == 0) {
+2 −1
Original line number Diff line number Diff line
@@ -1838,7 +1838,8 @@ void fib_table_select_default(struct fib_table *tb,
		if (!next_fi->fib_nh[0].nh_gw ||
		    next_fi->fib_nh[0].nh_scope != RT_SCOPE_LINK)
			continue;
		fa->fa_state |= FA_S_ACCESSED;

		fib_alias_accessed(fa);

		if (fi == NULL) {
			if (next_fi != res->fi)