eal: add macros to align value to multiple
authorPavan Nikhilesh <pbhagavatula@caviumnetworks.com>
Tue, 20 Mar 2018 13:24:34 +0000 (18:54 +0530)
committerThomas Monjalon <thomas@monjalon.net>
Wed, 4 Apr 2018 11:43:34 +0000 (13:43 +0200)
Add macros to align given value to the multiple of the supplied
integer.

Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
lib/librte_eal/common/include/rte_common.h
test/test/test_common.c

index c7803e4..4469aff 100644 (file)
@@ -190,6 +190,22 @@ static void __attribute__((constructor(prio), used)) func(void)
  */
 #define RTE_ALIGN(val, align) RTE_ALIGN_CEIL(val, align)
 
+/**
+ * Macro to align a value to the multiple of given value. The resultant
+ * value will be of the same type as the first parameter and will be no lower
+ * than the first parameter.
+ */
+#define RTE_ALIGN_MUL_CEIL(v, mul) \
+       (((v + (typeof(v))(mul) - 1) / ((typeof(v))(mul))) * (typeof(v))(mul))
+
+/**
+ * Macro to align a value to the multiple of given value. The resultant
+ * value will be of the same type as the first parameter and will be no higher
+ * than the first parameter.
+ */
+#define RTE_ALIGN_MUL_FLOOR(v, mul) \
+       ((v / ((typeof(v))(mul))) * (typeof(v))(mul))
+
 /**
  * Checks if a pointer is aligned to a given power-of-two value
  *
index d034243..e43cba4 100644 (file)
@@ -128,6 +128,18 @@ test_align(void)
                                FAIL("rte_is_aligned");
                }
        }
+
+       for (p = 1; p <= MAX_NUM / 2; p++) {
+               for (i = 1; i <= MAX_NUM / 2; i++) {
+                       val = RTE_ALIGN_MUL_CEIL(i, p);
+                       if (val % p != 0 || val < i)
+                               FAIL_ALIGN("RTE_ALIGN_MUL_CEIL", i, p);
+                       val = RTE_ALIGN_MUL_FLOOR(i, p);
+                       if (val % p != 0 || val > i)
+                               FAIL_ALIGN("RTE_ALIGN_MUL_FLOOR", i, p);
+               }
+       }
+
        return 0;
 }