[v3,1/2] eal: add macro to align value to the nearest multiple

Message ID 20190316190119.6142-1-pbhagavatula@marvell.com (mailing list archive)
State Accepted, archived
Delegated to: Thomas Monjalon
Headers
Series [v3,1/2] eal: add macro to align value to the nearest multiple |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK
ci/mellanox-Performance-Testing success Performance Testing PASS
ci/intel-Performance-Testing success Performance Testing PASS

Commit Message

Pavan Nikhilesh Bhagavatula March 16, 2019, 7:01 p.m. UTC
  From: Pavan Nikhilesh <pbhagavatula@marvell.com>

Add macro to align value to the nearest multiple of the given value,
resultant value might be greater than or less than the first parameter
whichever difference is the lowest.
Update unit test to include the new macro.

Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
---
 v2 Changes:
 - Spilt patch and add unit test for the new macro.
 v3 Changes:
 - Rebase to ToT.
 - Use macro instead of 1E7.

 app/test/test_common.c                     |  4 ++++
 lib/librte_eal/common/include/rte_common.h | 12 ++++++++++++
 2 files changed, 16 insertions(+)

--
2.21.0
  

Patch

diff --git a/app/test/test_common.c b/app/test/test_common.c
index 94d367471..2b856f8ba 100644
--- a/app/test/test_common.c
+++ b/app/test/test_common.c
@@ -199,6 +199,10 @@  test_align(void)
 			val = RTE_ALIGN_MUL_FLOOR(i, p);
 			if (val % p != 0 || val > i)
 				FAIL_ALIGN("RTE_ALIGN_MUL_FLOOR", i, p);
+			val = RTE_ALIGN_MUL_NEAR(i, p);
+			if (val % p != 0 || ((val != RTE_ALIGN_MUL_CEIL(i, p))
+				& (val != RTE_ALIGN_MUL_FLOOR(i, p))))
+				FAIL_ALIGN("RTE_ALIGN_MUL_NEAR", i, p);
 		}
 	}

diff --git a/lib/librte_eal/common/include/rte_common.h b/lib/librte_eal/common/include/rte_common.h
index 7178ba1e9..bcf8afd39 100644
--- a/lib/librte_eal/common/include/rte_common.h
+++ b/lib/librte_eal/common/include/rte_common.h
@@ -248,6 +248,18 @@  static void __attribute__((destructor(RTE_PRIO(prio)), used)) func(void)
 #define RTE_ALIGN_MUL_FLOOR(v, mul) \
 	((v / ((typeof(v))(mul))) * (typeof(v))(mul))

+/**
+ * Macro to align value to the nearest multiple of the given value.
+ * The resultant value might be greater than or less than the first parameter
+ * whichever difference is the lowest.
+ */
+#define RTE_ALIGN_MUL_NEAR(v, mul)				\
+	({							\
+		typeof(v) ceil = RTE_ALIGN_MUL_CEIL(v, mul);	\
+		typeof(v) floor = RTE_ALIGN_MUL_FLOOR(v, mul);	\
+		(ceil - v) > (v - floor) ? floor : ceil;	\
+	})
+
 /**
  * Checks if a pointer is aligned to a given power-of-two value
  *