X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;ds=sidebyside;f=lib%2Flibrte_eal%2Fcommon%2Feal_common_devargs.c;h=2123773ef8403187ddb5baefd0d7107b49f3b21f;hb=909dd291f07713998c77681aa653e41b13d06121;hp=b7b9cb69e439d49b934bc28647d99cfee6c5dd2a;hpb=b74fd6b842b7e41e4ee6a037dd37735aeedd8095;p=dpdk.git diff --git a/lib/librte_eal/common/eal_common_devargs.c b/lib/librte_eal/common/eal_common_devargs.c index b7b9cb69e4..2123773ef8 100644 --- a/lib/librte_eal/common/eal_common_devargs.c +++ b/lib/librte_eal/common/eal_common_devargs.c @@ -174,7 +174,6 @@ bus_name_cmp(const struct rte_bus *bus, const void *name) return strncmp(bus->name, name, strlen(bus->name)); } -__rte_experimental int rte_devargs_parse(struct rte_devargs *da, const char *dev) { @@ -230,7 +229,6 @@ rte_devargs_parse(struct rte_devargs *da, const char *dev) return 0; } -__rte_experimental int rte_devargs_parsef(struct rte_devargs *da, const char *format, ...) { @@ -262,20 +260,43 @@ rte_devargs_parsef(struct rte_devargs *da, const char *format, ...) return ret; } -int __rte_experimental -rte_devargs_insert(struct rte_devargs *da) +int +rte_devargs_insert(struct rte_devargs **da) { - int ret; + struct rte_devargs *listed_da; + void *tmp; + + if (*da == NULL || (*da)->bus == NULL) + return -1; - ret = rte_devargs_remove(da); - if (ret < 0) - return ret; - TAILQ_INSERT_TAIL(&devargs_list, da, next); + TAILQ_FOREACH_SAFE(listed_da, &devargs_list, next, tmp) { + if (listed_da == *da) + /* devargs already in the list */ + return 0; + if (strcmp(listed_da->bus->name, (*da)->bus->name) == 0 && + strcmp(listed_da->name, (*da)->name) == 0) { + /* device already in devargs list, must be updated */ + listed_da->type = (*da)->type; + listed_da->policy = (*da)->policy; + free(listed_da->args); + listed_da->args = (*da)->args; + listed_da->bus = (*da)->bus; + listed_da->cls = (*da)->cls; + listed_da->bus_str = (*da)->bus_str; + listed_da->cls_str = (*da)->cls_str; + listed_da->data = (*da)->data; + /* replace provided devargs with found one */ + free(*da); + *da = listed_da; + return 0; + } + } + /* new device in the list */ + TAILQ_INSERT_TAIL(&devargs_list, *da, next); return 0; } /* store a whitelist parameter for later parsing */ -__rte_experimental int rte_devargs_add(enum rte_devtype devtype, const char *devargs_str) { @@ -312,7 +333,7 @@ fail: return -1; } -int __rte_experimental +int rte_devargs_remove(struct rte_devargs *devargs) { struct rte_devargs *d; @@ -334,7 +355,6 @@ rte_devargs_remove(struct rte_devargs *devargs) } /* count the number of devices of a specified type */ -__rte_experimental unsigned int rte_devargs_type_count(enum rte_devtype devtype) { @@ -350,7 +370,6 @@ rte_devargs_type_count(enum rte_devtype devtype) } /* dump the user devices on the console */ -__rte_experimental void rte_devargs_dump(FILE *f) { @@ -365,7 +384,6 @@ rte_devargs_dump(FILE *f) } /* bus-aware rte_devargs iterator. */ -__rte_experimental struct rte_devargs * rte_devargs_next(const char *busname, const struct rte_devargs *start) {