java-topology/defects/ovs/patch/ovs-0001-dpif-offload-port-add-linear-provider-scan.patch

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;
}
}