[v6,4/9] alarm: remove direct access to interrupt handle

Message ID 20211024200449.12024-5-david.marchand@redhat.com (mailing list archive)
State Superseded, archived
Delegated to: David Marchand
Headers
Series make rte_intr_handle internal |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

David Marchand Oct. 24, 2021, 8:04 p.m. UTC
  From: Harman Kalra <hkalra@marvell.com>

Removing direct access to interrupt handle structure fields,
rather use respective get set APIs for the same.
Making changes to all the libraries access the interrupt handle fields.

Implementing alarm cleanup routine, where the memory allocated
for interrupt instance can be freed.

Signed-off-by: Harman Kalra <hkalra@marvell.com>
Signed-off-by: David Marchand <david.marchand@redhat.com>
---
Changes since v5:
- split from patch4,
- merged patch6,
- renamed rte_eal_alarm_fini as rte_eal_alarm_cleanup,

---
 lib/eal/common/eal_private.h | 10 ++++++++
 lib/eal/freebsd/eal.c        |  1 +
 lib/eal/freebsd/eal_alarm.c  | 44 +++++++++++++++++++++++++++++++-----
 lib/eal/linux/eal.c          |  1 +
 lib/eal/linux/eal_alarm.c    | 32 ++++++++++++++++++++------
 5 files changed, 75 insertions(+), 13 deletions(-)
  

Comments

Dmitry Kozlyuk Oct. 25, 2021, 10:49 a.m. UTC | #1
2021-10-24 22:04 (UTC+0200), David Marchand:
> From: Harman Kalra <hkalra@marvell.com>
> 
> Removing direct access to interrupt handle structure fields,
> rather use respective get set APIs for the same.
> Making changes to all the libraries access the interrupt handle fields.
> 
> Implementing alarm cleanup routine, where the memory allocated
> for interrupt instance can be freed.
> 
> Signed-off-by: Harman Kalra <hkalra@marvell.com>
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> ---
> Changes since v5:
> - split from patch4,
> - merged patch6,
> - renamed rte_eal_alarm_fini as rte_eal_alarm_cleanup,
> 
> ---
[...]
> diff --git a/lib/eal/freebsd/eal_alarm.c b/lib/eal/freebsd/eal_alarm.c
> index c38b2e04f8..1a8fcf24c5 100644
> --- a/lib/eal/freebsd/eal_alarm.c
> +++ b/lib/eal/freebsd/eal_alarm.c
> @@ -32,7 +32,7 @@
>  
>  struct alarm_entry {
>  	LIST_ENTRY(alarm_entry) next;
> -	struct rte_intr_handle handle;
> +	struct rte_intr_handle *handle;

This field is never used and can be just removed.

>  	struct timespec time;
>  	rte_eal_alarm_callback cb_fn;
>  	void *cb_arg;
[...]
  
David Marchand Oct. 25, 2021, 11:09 a.m. UTC | #2
On Mon, Oct 25, 2021 at 12:49 PM Dmitry Kozlyuk
<dmitry.kozliuk@gmail.com> wrote:
> > diff --git a/lib/eal/freebsd/eal_alarm.c b/lib/eal/freebsd/eal_alarm.c
> > index c38b2e04f8..1a8fcf24c5 100644
> > --- a/lib/eal/freebsd/eal_alarm.c
> > +++ b/lib/eal/freebsd/eal_alarm.c
> > @@ -32,7 +32,7 @@
> >
> >  struct alarm_entry {
> >       LIST_ENTRY(alarm_entry) next;
> > -     struct rte_intr_handle handle;
> > +     struct rte_intr_handle *handle;
>
> This field is never used and can be just removed.

Indeed, removed.
>
> >       struct timespec time;
> >       rte_eal_alarm_callback cb_fn;
> >       void *cb_arg;
> [...]
>
  

Patch

diff --git a/lib/eal/common/eal_private.h b/lib/eal/common/eal_private.h
index 86dab1f057..36bcc0b5a4 100644
--- a/lib/eal/common/eal_private.h
+++ b/lib/eal/common/eal_private.h
@@ -163,6 +163,16 @@  int rte_eal_intr_init(void);
  */
 int rte_eal_alarm_init(void);
 
+/**
+ * Alarm mechanism cleanup.
+ *
+ * This function is private to EAL.
+ *
+ * @return
+ *  0 on success, negative on error
+ */
+void rte_eal_alarm_cleanup(void);
+
 /**
  * Function is to check if the kernel module(like, vfio, vfio_iommu_type1,
  * etc.) loaded.
diff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c
index 56a60f13e9..9935356ed4 100644
--- a/lib/eal/freebsd/eal.c
+++ b/lib/eal/freebsd/eal.c
@@ -975,6 +975,7 @@  rte_eal_cleanup(void)
 	rte_mp_channel_cleanup();
 	/* after this point, any DPDK pointers will become dangling */
 	rte_eal_memory_detach();
+	rte_eal_alarm_cleanup();
 	rte_trace_save();
 	eal_trace_fini();
 	eal_cleanup_config(internal_conf);
diff --git a/lib/eal/freebsd/eal_alarm.c b/lib/eal/freebsd/eal_alarm.c
index c38b2e04f8..1a8fcf24c5 100644
--- a/lib/eal/freebsd/eal_alarm.c
+++ b/lib/eal/freebsd/eal_alarm.c
@@ -32,7 +32,7 @@ 
 
 struct alarm_entry {
 	LIST_ENTRY(alarm_entry) next;
-	struct rte_intr_handle handle;
+	struct rte_intr_handle *handle;
 	struct timespec time;
 	rte_eal_alarm_callback cb_fn;
 	void *cb_arg;
@@ -43,22 +43,46 @@  struct alarm_entry {
 static LIST_HEAD(alarm_list, alarm_entry) alarm_list = LIST_HEAD_INITIALIZER();
 static rte_spinlock_t alarm_list_lk = RTE_SPINLOCK_INITIALIZER;
 
-static struct rte_intr_handle intr_handle = {.fd = -1 };
+static struct rte_intr_handle *intr_handle;
 static void eal_alarm_callback(void *arg);
 
+void
+rte_eal_alarm_cleanup(void)
+{
+	rte_intr_instance_free(intr_handle);
+}
+
 int
 rte_eal_alarm_init(void)
 {
-	intr_handle.type = RTE_INTR_HANDLE_ALARM;
+	int fd;
+
+	intr_handle = rte_intr_instance_alloc(RTE_INTR_INSTANCE_F_PRIVATE);
+	if (intr_handle == NULL) {
+		RTE_LOG(ERR, EAL, "Fail to allocate intr_handle\n");
+		goto error;
+	}
+
+	if (rte_intr_type_set(intr_handle, RTE_INTR_HANDLE_ALARM))
+		goto error;
+
+	if (rte_intr_fd_set(intr_handle, -1))
+		goto error;
 
 	/* on FreeBSD, timers don't use fd's, and their identifiers are stored
 	 * in separate namespace from fd's, so using any value is OK. however,
 	 * EAL interrupts handler expects fd's to be unique, so use an actual fd
 	 * to guarantee unique timer identifier.
 	 */
-	intr_handle.fd = open("/dev/zero", O_RDONLY);
+	fd = open("/dev/zero", O_RDONLY);
+
+	if (rte_intr_fd_set(intr_handle, fd))
+		goto error;
 
 	return 0;
+error:
+	rte_intr_instance_free(intr_handle);
+	return -1;
 }
 
 static inline int
@@ -118,7 +142,7 @@  unregister_current_callback(void)
 		ap = LIST_FIRST(&alarm_list);
 
 		do {
-			ret = rte_intr_callback_unregister(&intr_handle,
+			ret = rte_intr_callback_unregister(intr_handle,
 				eal_alarm_callback, &ap->time);
 		} while (ret == -EAGAIN);
 	}
@@ -136,7 +160,7 @@  register_first_callback(void)
 		ap = LIST_FIRST(&alarm_list);
 
 		/* register a new callback */
-		ret = rte_intr_callback_register(&intr_handle,
+		ret = rte_intr_callback_register(intr_handle,
 				eal_alarm_callback, &ap->time);
 	}
 	return ret;
@@ -164,6 +188,7 @@  eal_alarm_callback(void *arg __rte_unused)
 		rte_spinlock_lock(&alarm_list_lk);
 
 		LIST_REMOVE(ap, next);
+		rte_intr_instance_free(ap->handle);
 		free(ap);
 
 		ap = LIST_FIRST(&alarm_list);
@@ -202,6 +227,11 @@  rte_eal_alarm_set(uint64_t us, rte_eal_alarm_callback cb_fn, void *cb_arg)
 	new_alarm->time.tv_nsec = (now.tv_nsec + ns) % NS_PER_S;
 	new_alarm->time.tv_sec = now.tv_sec + ((now.tv_nsec + ns) / NS_PER_S);
 
+	new_alarm->handle =
+		rte_intr_instance_alloc(RTE_INTR_INSTANCE_F_PRIVATE);
+	if (new_alarm->handle == NULL)
+		return -ENOMEM;
+
 	rte_spinlock_lock(&alarm_list_lk);
 
 	if (LIST_EMPTY(&alarm_list))
@@ -255,6 +285,7 @@  rte_eal_alarm_cancel(rte_eal_alarm_callback cb_fn, void *cb_arg)
 				break;
 			if (ap->executing == 0) {
 				LIST_REMOVE(ap, next);
+				rte_intr_instance_free(ap->handle);
 				free(ap);
 				count++;
 			} else {
@@ -282,6 +313,7 @@  rte_eal_alarm_cancel(rte_eal_alarm_callback cb_fn, void *cb_arg)
 					 cb_arg == ap->cb_arg)) {
 				if (ap->executing == 0) {
 					LIST_REMOVE(ap, next);
+					rte_intr_instance_free(ap->handle);
 					free(ap);
 					count++;
 					ap = ap_prev;
diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c
index 0d0fc66668..81fdebc6a0 100644
--- a/lib/eal/linux/eal.c
+++ b/lib/eal/linux/eal.c
@@ -1368,6 +1368,7 @@  rte_eal_cleanup(void)
 	rte_mp_channel_cleanup();
 	/* after this point, any DPDK pointers will become dangling */
 	rte_eal_memory_detach();
+	rte_eal_alarm_cleanup();
 	rte_trace_save();
 	eal_trace_fini();
 	eal_cleanup_config(internal_conf);
diff --git a/lib/eal/linux/eal_alarm.c b/lib/eal/linux/eal_alarm.c
index 3252c6fa59..3b5e894595 100644
--- a/lib/eal/linux/eal_alarm.c
+++ b/lib/eal/linux/eal_alarm.c
@@ -54,22 +54,40 @@  struct alarm_entry {
 static LIST_HEAD(alarm_list, alarm_entry) alarm_list = LIST_HEAD_INITIALIZER();
 static rte_spinlock_t alarm_list_lk = RTE_SPINLOCK_INITIALIZER;
 
-static struct rte_intr_handle intr_handle = {.fd = -1 };
+static struct rte_intr_handle *intr_handle;
 static int handler_registered = 0;
 static void eal_alarm_callback(void *arg);
 
+void
+rte_eal_alarm_cleanup(void)
+{
+	rte_intr_instance_free(intr_handle);
+}
+
 int
 rte_eal_alarm_init(void)
 {
-	intr_handle.type = RTE_INTR_HANDLE_ALARM;
+
+	intr_handle = rte_intr_instance_alloc(RTE_INTR_INSTANCE_F_PRIVATE);
+	if (intr_handle == NULL) {
+		RTE_LOG(ERR, EAL, "Fail to allocate intr_handle\n");
+		goto error;
+	}
+
+	if (rte_intr_type_set(intr_handle, RTE_INTR_HANDLE_ALARM))
+		goto error;
+
 	/* create a timerfd file descriptor */
-	intr_handle.fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK);
-	if (intr_handle.fd == -1)
+	if (rte_intr_fd_set(intr_handle,
+			timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK)))
 		goto error;
 
+	if (rte_intr_fd_get(intr_handle) == -1)
+		goto error;
 	return 0;
 
 error:
+	rte_intr_instance_free(intr_handle);
 	rte_errno = errno;
 	return -1;
 }
@@ -109,7 +127,7 @@  eal_alarm_callback(void *arg __rte_unused)
 
 		atime.it_value.tv_sec -= now.tv_sec;
 		atime.it_value.tv_nsec -= now.tv_nsec;
-		timerfd_settime(intr_handle.fd, 0, &atime, NULL);
+		timerfd_settime(rte_intr_fd_get(intr_handle), 0, &atime, NULL);
 	}
 	rte_spinlock_unlock(&alarm_list_lk);
 }
@@ -140,7 +158,7 @@  rte_eal_alarm_set(uint64_t us, rte_eal_alarm_callback cb_fn, void *cb_arg)
 	rte_spinlock_lock(&alarm_list_lk);
 	if (!handler_registered) {
 		/* registration can fail, callback can be registered later */
-		if (rte_intr_callback_register(&intr_handle,
+		if (rte_intr_callback_register(intr_handle,
 				eal_alarm_callback, NULL) == 0)
 			handler_registered = 1;
 	}
@@ -170,7 +188,7 @@  rte_eal_alarm_set(uint64_t us, rte_eal_alarm_callback cb_fn, void *cb_arg)
 				.tv_nsec = (us % US_PER_S) * NS_PER_US,
 			},
 		};
-		ret |= timerfd_settime(intr_handle.fd, 0, &alarm_time, NULL);
+		ret |= timerfd_settime(rte_intr_fd_get(intr_handle), 0, &alarm_time, NULL);
 	}
 	rte_spinlock_unlock(&alarm_list_lk);