[dpdk-dev] [PATCH 2/3] timer: add symbol versions for ABI compatibility

Bruce Richardson bruce.richardson at intel.com
Wed May 31 11:16:20 CEST 2017


With the change in parameters to the callback function for timers, ABI
compatibility needs to be managed. Do this by adding symbol version
information and adding back in older copies of some functions.

Signed-off-by: Bruce Richardson <bruce.richardson at intel.com>
---
 lib/librte_timer/rte_timer.c           | 79 ++++++++++++++++++++++++++++++----
 lib/librte_timer/rte_timer.h           | 27 ++++++++++--
 lib/librte_timer/rte_timer_version.map |  9 ++++
 3 files changed, 104 insertions(+), 11 deletions(-)

diff --git a/lib/librte_timer/rte_timer.c b/lib/librte_timer/rte_timer.c
index 2c5d5f3..c272643 100644
--- a/lib/librte_timer/rte_timer.c
+++ b/lib/librte_timer/rte_timer.c
@@ -365,7 +365,7 @@ timer_del(struct rte_timer *tim, union rte_timer_status prev_status,
 static int
 __rte_timer_reset(struct rte_timer *tim, uint64_t expire,
 		  uint64_t period, unsigned tim_lcore,
-		  rte_timer_cb_t fct, void *arg,
+		  void *fct, void *arg,
 		  int local_is_locked)
 {
 	union rte_timer_status prev_status, status;
@@ -424,9 +424,9 @@ __rte_timer_reset(struct rte_timer *tim, uint64_t expire,
 
 /* Reset and start the timer associated with the timer handle tim */
 int
-rte_timer_reset(struct rte_timer *tim, uint64_t ticks,
+rte_timer_reset_v20(struct rte_timer *tim, uint64_t ticks,
 		enum rte_timer_type type, unsigned tim_lcore,
-		rte_timer_cb_t fct, void *arg)
+		rte_timer_cb_t_v20 fct, void *arg)
 {
 	uint64_t cur_time = rte_get_timer_cycles();
 	uint64_t period;
@@ -443,17 +443,58 @@ rte_timer_reset(struct rte_timer *tim, uint64_t ticks,
 	return __rte_timer_reset(tim,  cur_time + ticks, period, tim_lcore,
 			  fct, arg, 0);
 }
+VERSION_SYMBOL(rte_timer_reset, _v20, 2.0);
 
 /* loop until rte_timer_reset() succeed */
 void
-rte_timer_reset_sync(struct rte_timer *tim, uint64_t ticks,
+rte_timer_reset_sync_v20(struct rte_timer *tim, uint64_t ticks,
 		     enum rte_timer_type type, unsigned tim_lcore,
-		     rte_timer_cb_t fct, void *arg)
+		     rte_timer_cb_t_v20 fct, void *arg)
+{
+	while (rte_timer_reset_v20(tim, ticks, type, tim_lcore,
+			       fct, arg) != 0)
+		rte_pause();
+}
+VERSION_SYMBOL(rte_timer_reset_sync, _v20, 2.0);
+
+/* Reset and start the timer associated with the timer handle tim */
+int
+rte_timer_reset_v1708(struct rte_timer *tim, uint64_t ticks,
+		enum rte_timer_type type, unsigned int tim_lcore,
+		rte_timer_cb_t fct, void *arg)
+{
+	uint64_t cur_time = rte_get_timer_cycles();
+	uint64_t period;
+
+	if (unlikely((tim_lcore != (unsigned int)LCORE_ID_ANY) &&
+			!rte_lcore_is_enabled(tim_lcore)))
+		return -1;
+
+	if (type == PERIODICAL)
+		period = ticks;
+	else
+		period = 0;
+
+	return __rte_timer_reset(tim,  cur_time + ticks, period, tim_lcore,
+			  fct, arg, 0);
+}
+MAP_STATIC_SYMBOL(int rte_timer_reset(struct rte_timer *tim, uint64_t ticks,
+		    enum rte_timer_type type, unsigned int tim_lcore,
+		    rte_timer_cb_t fct, void *arg), rte_timer_reset_v1708);
+
+/* loop until rte_timer_reset() succeed */
+void
+rte_timer_reset_sync_v1708(struct rte_timer *tim, uint64_t ticks,
+		enum rte_timer_type type, unsigned int tim_lcore,
+		rte_timer_cb_t fct, void *arg)
 {
 	while (rte_timer_reset(tim, ticks, type, tim_lcore,
 			       fct, arg) != 0)
 		rte_pause();
 }
+MAP_STATIC_SYMBOL(void rte_timer_reset_sync(struct rte_timer *tim,
+		uint64_t ticks, enum rte_timer_type type, unsigned int tim_lcore,
+		rte_timer_cb_t fct, void *arg), rte_timer_reset_sync_v1708);
 
 /* Stop the timer associated with the timer handle tim */
 int
@@ -505,8 +546,13 @@ rte_timer_pending(struct rte_timer *tim)
 	return tim->status.state == RTE_TIMER_PENDING;
 }
 
+enum timer_version {
+	TIMER_VERSION_20,
+	TIMER_VERSION_1708,
+};
 /* must be called periodically, run all timer that expired */
-void rte_timer_manage(void)
+static void
+__timer_manage(enum timer_version ver)
 {
 	union rte_timer_status status;
 	struct rte_timer *tim, *next_tim;
@@ -590,9 +636,12 @@ void rte_timer_manage(void)
 		priv_timer[lcore_id].running_tim = tim;
 
 		/* execute callback function with list unlocked */
-		if (tim->period == 0)
+		if (ver == TIMER_VERSION_20) {
+			rte_timer_cb_t_v20 f = (void *)tim->f;
+			f(tim, tim->arg);
+		} else if (tim->period == 0) {
 			tim->f(tim, 1, tim->arg);
-		else {
+		} else {
 			/* for periodic check how many expiries we have */
 			uint64_t over_time = cur_time - tim->expire;
 			unsigned int extra_expiries = over_time / tim->period;
@@ -630,6 +679,20 @@ void rte_timer_manage(void)
 	priv_timer[lcore_id].running_tim = NULL;
 }
 
+void
+rte_timer_manage_v20(void)
+{
+	__timer_manage(TIMER_VERSION_20);
+}
+VERSION_SYMBOL(rte_timer_manage, _v20, 2.0);
+
+void
+rte_timer_manage_v1708(void)
+{
+	__timer_manage(TIMER_VERSION_1708);
+}
+MAP_STATIC_SYMBOL(void rte_timer_manage(void), rte_timer_manage_v1708);
+
 /* dump statistics about timers */
 void rte_timer_dump_stats(FILE *f)
 {
diff --git a/lib/librte_timer/rte_timer.h b/lib/librte_timer/rte_timer.h
index bc434ec..049af72 100644
--- a/lib/librte_timer/rte_timer.h
+++ b/lib/librte_timer/rte_timer.h
@@ -1,7 +1,7 @@
 /*-
  *   BSD LICENSE
  *
- *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2010-2017 Intel Corporation. All rights reserved.
  *   All rights reserved.
  *
  *   Redistribution and use in source and binary forms, with or without
@@ -67,6 +67,7 @@
 #include <stdint.h>
 #include <stddef.h>
 #include <rte_common.h>
+#include <rte_compat.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -224,7 +225,7 @@ void rte_timer_init(struct rte_timer *tim);
 int rte_timer_reset(struct rte_timer *tim, uint64_t ticks,
 		    enum rte_timer_type type, unsigned tim_lcore,
 		    rte_timer_cb_t fct, void *arg);
-
+BIND_DEFAULT_SYMBOL(rte_timer_reset, _v1708, 17.08);
 
 /**
  * Loop until rte_timer_reset() succeeds.
@@ -256,6 +257,7 @@ void
 rte_timer_reset_sync(struct rte_timer *tim, uint64_t ticks,
 		     enum rte_timer_type type, unsigned tim_lcore,
 		     rte_timer_cb_t fct, void *arg);
+BIND_DEFAULT_SYMBOL(rte_timer_reset_sync, _v1708, 17.08);
 
 /**
  * Stop a timer.
@@ -321,7 +323,7 @@ int rte_timer_pending(struct rte_timer *tim);
  * CPU resources it will use.
  */
 void rte_timer_manage(void);
-
+BIND_DEFAULT_SYMBOL(rte_timer_manage, _v1708, 17.08);
 /**
  * Dump statistics about timers.
  *
@@ -330,6 +332,25 @@ void rte_timer_manage(void);
  */
 void rte_timer_dump_stats(FILE *f);
 
+/* legacy definition for ABI compatibility */
+typedef void (*rte_timer_cb_t_v20)(struct rte_timer *, void *);
+
+/* prototypes for versioned functions for ABI compatibility */
+int rte_timer_reset_v20(struct rte_timer *tim, uint64_t ticks,
+		enum rte_timer_type type, unsigned int tim_lcore,
+		rte_timer_cb_t_v20 fct, void *arg);
+void rte_timer_reset_sync_v20(struct rte_timer *tim, uint64_t ticks,
+		enum rte_timer_type type, unsigned int tim_lcore,
+		rte_timer_cb_t_v20 fct, void *arg);
+int rte_timer_reset_v1708(struct rte_timer *tim, uint64_t ticks,
+		enum rte_timer_type type, unsigned int tim_lcore,
+		rte_timer_cb_t fct, void *arg);
+void rte_timer_reset_sync_v1708(struct rte_timer *tim, uint64_t ticks,
+		enum rte_timer_type type, unsigned int tim_lcore,
+		rte_timer_cb_t fct, void *arg);
+void rte_timer_manage_v20(void);
+void rte_timer_manage_v1708(void);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/librte_timer/rte_timer_version.map b/lib/librte_timer/rte_timer_version.map
index 9b2e4b8..06553d1 100644
--- a/lib/librte_timer/rte_timer_version.map
+++ b/lib/librte_timer/rte_timer_version.map
@@ -13,3 +13,12 @@ DPDK_2.0 {
 
 	local: *;
 };
+
+DPDK_17.08 {
+	global:
+
+	rte_timer_reset;
+	rte_timer_reset_sync;
+	rte_timer_manage;
+
+} DPDK_2.0;
-- 
2.9.4



More information about the dev mailing list