FreeBSD supports the CPU_FFS macro as part of the regular cpuset functions. Add this as RTE_CPU_FFS for all OS's.
Signed-off-by: Bruce Richardson <[email protected]> --- lib/eal/freebsd/include/rte_os.h | 2 ++ lib/eal/linux/include/rte_os.h | 10 ++++++++++ lib/eal/windows/include/rte_os.h | 1 + lib/eal/windows/include/sched.h | 10 ++++++++++ 4 files changed, 23 insertions(+) diff --git a/lib/eal/freebsd/include/rte_os.h b/lib/eal/freebsd/include/rte_os.h index 94b9275beb..38fd0e7f05 100644 --- a/lib/eal/freebsd/include/rte_os.h +++ b/lib/eal/freebsd/include/rte_os.h @@ -75,4 +75,6 @@ typedef cpuset_t rte_cpuset_t; #endif /* RTE_EAL_FREEBSD_CPUSET_LEGACY */ +#define RTE_CPU_FFS CPU_FFS + #endif /* _RTE_OS_H_ */ diff --git a/lib/eal/linux/include/rte_os.h b/lib/eal/linux/include/rte_os.h index 20eff0409a..6e299cc7da 100644 --- a/lib/eal/linux/include/rte_os.h +++ b/lib/eal/linux/include/rte_os.h @@ -41,6 +41,16 @@ typedef cpu_set_t rte_cpuset_t; RTE_CPU_FILL(&tmp); \ CPU_XOR(dst, &tmp, src); \ } while (0) + +static inline int +_cpu_ffs(const rte_cpuset_t *s) +{ + for (unsigned int _i = 0; _i < CPU_SETSIZE; _i++) + if (CPU_ISSET(_i, s)) + return (int)(_i + 1); + return 0; +} +#define RTE_CPU_FFS(s) _cpu_ffs(s) #endif #endif /* _RTE_OS_H_ */ diff --git a/lib/eal/windows/include/rte_os.h b/lib/eal/windows/include/rte_os.h index 2a43cb1f9b..25701c7906 100644 --- a/lib/eal/windows/include/rte_os.h +++ b/lib/eal/windows/include/rte_os.h @@ -49,6 +49,7 @@ struct { \ #define RTE_CPU_OR(dst, src1, src2) CPU_OR(dst, src1, src2) #define RTE_CPU_FILL(set) CPU_FILL(set) #define RTE_CPU_NOT(dst, src) CPU_NOT(dst, src) +#define RTE_CPU_FFS(s) CPU_FFS(s) /* This is an exception without "rte_" prefix, because Windows does have * ssize_t, but it's defined in <windows.h> which we avoid to expose. diff --git a/lib/eal/windows/include/sched.h b/lib/eal/windows/include/sched.h index 912fed12c2..230de19c76 100644 --- a/lib/eal/windows/include/sched.h +++ b/lib/eal/windows/include/sched.h @@ -86,6 +86,16 @@ do { \ (dst)->_bits[_i] = (src)->_bits[_i] ^ -1LL; \ } while (0) +static inline int +cpu_ffs(const rte_cpuset_t *s) +{ + for (unsigned int _i = 0; _i < CPU_SETSIZE; _i++) + if (CPU_ISSET(_i, s)) + return (int)(_i + 1); + return 0; +} +#define CPU_FFS(s) cpu_ffs(s) + #ifdef __cplusplus } #endif -- 2.51.0

