79 lines
3 KiB
Diff
79 lines
3 KiB
Diff
# UNDF: UNDF-2026-000000206
|
|
--- a/lib/dpif-offload-provider.h
|
|
+++ b/lib/dpif-offload-provider.h
|
|
@@ -41,6 +41,10 @@ struct dpif_offload_provider_collection {
|
|
char *dpif_name; /* Name of the associated dpif. */
|
|
|
|
struct ovs_list list; /* Ordered list of active offload providers. */
|
|
+ struct shash by_type; /* shash<type_string → struct dpif_offload *>
|
|
+ * Mirrors 'list'; enables O(1) type lookup in
|
|
+ * dpif_offload_port_add() and provider_collection_add(). */
|
|
|
|
struct ovs_mutex mutex;
|
|
struct ovs_refcount ref_cnt;
|
|
};
|
|
|
|
--- a/lib/dpif-offload.c
|
|
+++ b/lib/dpif-offload.c
|
|
@@ -265,6 +265,7 @@ dpif_attach_new_offload_provider_collection(struct dpif *dpif)
|
|
collection = xmalloc(sizeof *collection);
|
|
collection->dpif_name = xstrdup(dpif_name(dpif));
|
|
ovs_mutex_init_recursive(&collection->mutex);
|
|
ovs_refcount_init(&collection->ref_cnt);
|
|
ovs_list_init(&collection->list);
|
|
+ shash_init(&collection->by_type);
|
|
shash_add(&dpif_offload_providers, collection->dpif_name, collection);
|
|
|
|
@@ -220,14 +220,14 @@ provider_collection_add(struct dpif_offload_provider_collection *collection,
|
|
struct dpif_offload *offload)
|
|
{
|
|
- struct ovs_list *providers_list = &collection->list;
|
|
- struct dpif_offload *offload_entry;
|
|
-
|
|
ovs_assert(collection);
|
|
|
|
- LIST_FOR_EACH (offload_entry, dpif_list_node, providers_list) {
|
|
- if (offload_entry == offload || !strcmp(offload->name,
|
|
- offload_entry->name)) {
|
|
- return EEXIST;
|
|
- }
|
|
- }
|
|
+ /* O(1) duplicate check via shash instead of O(P) list scan. */
|
|
+ if (shash_find(&collection->by_type, offload->class->type)) {
|
|
+ return EEXIST;
|
|
+ }
|
|
|
|
- ovs_list_push_back(providers_list, &offload->dpif_list_node);
|
|
+ ovs_list_push_back(&collection->list, &offload->dpif_list_node);
|
|
+ shash_add(&collection->by_type, offload->class->type, offload);
|
|
return 0;
|
|
}
|
|
|
|
@@ -580,12 +580,10 @@ dpif_offload_port_add(struct dpif *dpif, struct netdev *netdev,
|
|
for (char *name = strtok_r(tokens, ",", &saveptr);
|
|
name;
|
|
name = strtok_r(NULL, ",", &saveptr)) {
|
|
bool provider_added = false;
|
|
|
|
if (!strcmp("none", name)) {
|
|
break;
|
|
}
|
|
|
|
- LIST_FOR_EACH (offload, dpif_list_node, &collection->list) {
|
|
- if (!strcmp(name, offload->class->type)) {
|
|
- provider_added = dpif_offload_try_port_add(offload, netdev,
|
|
- port_no);
|
|
- break;
|
|
- }
|
|
- }
|
|
+ /* O(1) type lookup via shash. */
|
|
+ offload = shash_find_data(&collection->by_type, name);
|
|
+ if (offload) {
|
|
+ provider_added = dpif_offload_try_port_add(offload, netdev,
|
|
+ port_no);
|
|
+ }
|
|
|
|
if (provider_added) {
|
|
break;
|
|
}
|
|
}
|