diff options
author | Thomas Haller <thaller@redhat.com> | 2017-06-26 17:30:32 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2017-07-05 18:37:38 +0200 |
commit | 6324b779b21edea016f337bd7dc93401353598d6 (patch) | |
tree | 45b3a7ff0526ce5e93613a7817c4cf970e45435e | |
parent | 9440eefb6dc4939752bf049d1669a0a4d37213c2 (diff) | |
download | NetworkManager-6324b779b21edea016f337bd7dc93401353598d6.tar.gz |
platform: merge NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_*_DEFAULT indexes
Maintaining an index is expensive. We can merge indexes that
are strictly distinct, because one index can just partition the
objects into distinct sets.
-rw-r--r-- | src/platform/nmp-object.c | 94 | ||||
-rw-r--r-- | src/platform/nmp-object.h | 12 |
2 files changed, 27 insertions, 79 deletions
diff --git a/src/platform/nmp-object.c b/src/platform/nmp-object.c index c63d3f2c51..5e3a9bf68e 100644 --- a/src/platform/nmp-object.c +++ b/src/platform/nmp-object.c @@ -190,38 +190,20 @@ _idx_obj_part (const DedupMultiIdxType *idx_type, } return 1; - case NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_NO_DEFAULT: + case NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_DEFAULT: if ( !NM_IN_SET (NMP_OBJECT_GET_TYPE (obj_a), NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE) - || NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_a->ip_route) || !nmp_object_is_visible (obj_a)) return 0; if (obj_b) { return NMP_OBJECT_GET_TYPE (obj_a) == NMP_OBJECT_GET_TYPE (obj_b) - && !NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_b->ip_route) - && nmp_object_is_visible (obj_b); - } - if (request_hash) { - h = (guint) idx_type->cache_id_type; - h = NM_HASH_COMBINE (h, NMP_OBJECT_GET_TYPE (obj_a)); - return _HASH_NON_ZERO (h); - } - return 1; - - case NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_ONLY_DEFAULT: - if ( !NM_IN_SET (NMP_OBJECT_GET_TYPE (obj_a), NMP_OBJECT_TYPE_IP4_ROUTE, - NMP_OBJECT_TYPE_IP6_ROUTE) - || !NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_a->ip_route) - || !nmp_object_is_visible (obj_a)) - return 0; - if (obj_b) { - return NMP_OBJECT_GET_TYPE (obj_a) == NMP_OBJECT_GET_TYPE (obj_b) - && NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_b->ip_route) + && NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_a->ip_route) == NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_b->ip_route) && nmp_object_is_visible (obj_b); } if (request_hash) { h = (guint) idx_type->cache_id_type; h = NM_HASH_COMBINE (h, NMP_OBJECT_GET_TYPE (obj_a)); + h = NM_HASH_COMBINE (h, NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_a->ip_route)); return _HASH_NON_ZERO (h); } return 1; @@ -247,41 +229,21 @@ _idx_obj_part (const DedupMultiIdxType *idx_type, } return 1; - case NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_NO_DEFAULT: + case NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_WITH_DEFAULT: if ( !NM_IN_SET (NMP_OBJECT_GET_TYPE (obj_a), NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE) - || NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_a->ip_route) || obj_a->object.ifindex <= 0 || !nmp_object_is_visible (obj_a)) return 0; if (obj_b) { return NMP_OBJECT_GET_TYPE (obj_a) == NMP_OBJECT_GET_TYPE (obj_b) - && !NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_b->ip_route) - && obj_a->object.ifindex == obj_b->object.ifindex - && nmp_object_is_visible (obj_b); - } - if (request_hash) { - h = (guint) idx_type->cache_id_type; - h = NM_HASH_COMBINE (h, NMP_OBJECT_GET_TYPE (obj_a)); - h = NM_HASH_COMBINE (h, obj_a->object.ifindex); - return _HASH_NON_ZERO (h); - } - return 1; - - case NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_ONLY_DEFAULT: - if ( !NM_IN_SET (NMP_OBJECT_GET_TYPE (obj_a), NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE) - || !NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_a->ip_route) - || obj_a->object.ifindex <= 0 - || !nmp_object_is_visible (obj_a)) - return 0; - if (obj_b) { - return NMP_OBJECT_GET_TYPE (obj_a) == NMP_OBJECT_GET_TYPE (obj_b) - && NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_b->ip_route) && obj_a->object.ifindex == obj_b->object.ifindex + && NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_a->ip_route) == NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_b->ip_route) && nmp_object_is_visible (obj_b); } if (request_hash) { h = (guint) idx_type->cache_id_type; h = NM_HASH_COMBINE (h, NMP_OBJECT_GET_TYPE (obj_a)); + h = NM_HASH_COMBINE (h, NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_a->ip_route)); h = NM_HASH_COMBINE (h, obj_a->object.ifindex); return _HASH_NON_ZERO (h); } @@ -1360,10 +1322,8 @@ static const guint8 _supported_cache_ids_ip4_route[] = { NMP_CACHE_ID_TYPE_OBJECT_TYPE, NMP_CACHE_ID_TYPE_OBJECT_TYPE_VISIBLE_ONLY, NMP_CACHE_ID_TYPE_ADDRROUTE_VISIBLE_BY_IFINDEX, - NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_NO_DEFAULT, - NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_ONLY_DEFAULT, - NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_NO_DEFAULT, - NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_ONLY_DEFAULT, + NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_DEFAULT, + NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_WITH_DEFAULT, NMP_CACHE_ID_TYPE_ROUTES_BY_DESTINATION_IP4, 0, }; @@ -1372,10 +1332,8 @@ static const guint8 _supported_cache_ids_ip6_route[] = { NMP_CACHE_ID_TYPE_OBJECT_TYPE, NMP_CACHE_ID_TYPE_OBJECT_TYPE_VISIBLE_ONLY, NMP_CACHE_ID_TYPE_ADDRROUTE_VISIBLE_BY_IFINDEX, - NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_NO_DEFAULT, - NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_ONLY_DEFAULT, - NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_NO_DEFAULT, - NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_ONLY_DEFAULT, + NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_DEFAULT, + NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_WITH_DEFAULT, NMP_CACHE_ID_TYPE_ROUTES_BY_DESTINATION_IP6, 0, }; @@ -1736,28 +1694,18 @@ nmp_lookup_init_route_visible (NMPLookup *lookup, ifindex, TRUE); } - o = _nmp_object_stackinit_from_type (&lookup->selector_obj, obj_type); - if (ifindex <= 0) { - o->object.ifindex = 1; - lookup->cache_id_type = NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_ONLY_DEFAULT; - } else { - o->object.ifindex = ifindex; - lookup->cache_id_type = NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_ONLY_DEFAULT; - } - return _L (lookup); - } else if (with_non_default) { - o = _nmp_object_stackinit_from_type (&lookup->selector_obj, obj_type); - o->ip_route.plen = 1; - if (ifindex <= 0) { - o->object.ifindex = 1; - lookup->cache_id_type = NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_NO_DEFAULT; - } else { - o->object.ifindex = ifindex; - lookup->cache_id_type = NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_NO_DEFAULT; - } - return _L (lookup); - } else + } else if (!with_non_default) g_return_val_if_reached (NULL); + o = _nmp_object_stackinit_from_type (&lookup->selector_obj, obj_type); + o->ip_route.plen = with_default ? 0 : 1; + if (ifindex <= 0) { + o->object.ifindex = 1; + lookup->cache_id_type = NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_DEFAULT; + } else { + o->object.ifindex = ifindex; + lookup->cache_id_type = NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_WITH_DEFAULT; + } + return _L (lookup); } const NMPLookup * diff --git a/src/platform/nmp-object.h b/src/platform/nmp-object.h index b63a96e043..efdc7781af 100644 --- a/src/platform/nmp-object.h +++ b/src/platform/nmp-object.h @@ -75,16 +75,16 @@ typedef enum { /*< skip >*/ /* all the visible objects of a certain type */ NMP_CACHE_ID_TYPE_OBJECT_TYPE_VISIBLE_ONLY, - /* indeces for the visible routes, ignoring ifindex. */ - NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_NO_DEFAULT, - NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_ONLY_DEFAULT, + /* indeces for the visible routes, ignoring ifindex. + * The index separates default routes from non-default routes. */ + NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_DEFAULT, /* all the visible addresses/routes (by object-type) for an ifindex. */ NMP_CACHE_ID_TYPE_ADDRROUTE_VISIBLE_BY_IFINDEX, - /* indeces for the visible routes, per ifindex. */ - NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_NO_DEFAULT, - NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_ONLY_DEFAULT, + /* indeces for the visible routes, per ifindex. + * The index separates default routes from non-default routes. */ + NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_WITH_DEFAULT, /* Consider all the destination fields of a route, that is, the ID without the ifindex * and gateway (meaning: network/plen,metric). |