[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Minios-devel] [UNIKRAFT/LIBLWIP PATCH] Adopt to latest libuklock, libukmpi changes



lwip's semaphores are implemented based on semphores provided by
libuklock and lwip's mailboxes are implemented based on mailboxes
provided by libukmpi. The API of both have changed recently;
originally with commit a48d634 ("lib/uklock: Use timeout equal to 0
for trying down a semaphore"): A passed timeout of `0` is now
immediately returning instead of blocking the current thread until the
according event happened.

This patch also depends on the Unikraft patch 734930 ("lib/ukmpi:
Provide blocking uk_mbox_recv()"):
  https://patchwork.unikraft.org/patch/734930/

Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
---
 mailbox.c   | 15 +++++++++++----
 semaphore.c | 18 +++++++++++++-----
 2 files changed, 24 insertions(+), 9 deletions(-)

diff --git a/mailbox.c b/mailbox.c
index 6fb5fda..9bc34d8 100644
--- a/mailbox.c
+++ b/mailbox.c
@@ -130,10 +130,17 @@ u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, 
u32_t timeout)
 
        UK_ASSERT(sys_mbox_valid(mbox));
 
-       nsret = uk_mbox_recv_to(mbox->mbox, msg,
-                               ukarch_time_msec_to_nsec((__nsec) timeout));
-       if (unlikely(nsret == __NSEC_MAX))
-               return SYS_ARCH_TIMEOUT;
+       if (timeout == 0) {
+               nsret = ukplat_monotonic_clock();
+               uk_mbox_recv(mbox->mbox, msg);
+               nsret = ukplat_monotonic_clock() - nsret;
+       } else {
+               nsret = uk_mbox_recv_to(mbox->mbox, msg,
+                                       ukarch_time_msec_to_nsec((__nsec)
+                                                                timeout));
+               if (unlikely(nsret == __NSEC_MAX))
+                       return SYS_ARCH_TIMEOUT;
+       }
        return (u32_t) ukarch_time_nsec_to_msec(nsret);
 }
 
diff --git a/semaphore.c b/semaphore.c
index 16da316..e962d4b 100644
--- a/semaphore.c
+++ b/semaphore.c
@@ -85,10 +85,18 @@ u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
 {
        __nsec nsret;
 
-       nsret = uk_semaphore_down_to(&sem->sem,
-                                    ukarch_time_msec_to_nsec((__nsec)
-                                                             timeout));
-       if (unlikely(nsret == __NSEC_MAX))
-               return SYS_ARCH_TIMEOUT;
+       uk_pr_debug("sys_arch_sem_wait(%p, %"PRIu32")\n", sem, timeout);
+       if (timeout == 0) {
+               nsret = ukplat_monotonic_clock();
+               uk_semaphore_down(&sem->sem);
+               nsret = ukplat_monotonic_clock() - nsret;
+       } else {
+               nsret = uk_semaphore_down_to(&sem->sem,
+                                            ukarch_time_msec_to_nsec((__nsec)
+                                                                     timeout));
+               if (unlikely(nsret == __NSEC_MAX))
+                       return SYS_ARCH_TIMEOUT;
+       }
+
        return (u32_t) ukarch_time_nsec_to_msec(nsret);
 }
-- 
2.20.1


_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.