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

[Minios-devel] [UNIKRAFT PATCH 3/3] lib/posix-process: Implement getpriority() and setpriority()



We allow getting and setting priority only for the calling process (or its
process group or its real user ID), meaning that 0 is the only accepted value
for the 'who' parameter. This patch also introduces the default value for the
Unikraft "process" priority. This is also the only value that can be set using
setpriority() (i.e. basically it doesn't change anything).

Signed-off-by: Costin Lupu <costin.lupu@xxxxxxxxx>
---
 lib/posix-process/include/uk/process.h |  1 +
 lib/posix-process/process.c            | 54 ++++++++++++++++++++++++--
 2 files changed, 52 insertions(+), 3 deletions(-)

diff --git a/lib/posix-process/include/uk/process.h 
b/lib/posix-process/include/uk/process.h
index 67208e3d..b5eeb90a 100644
--- a/lib/posix-process/include/uk/process.h
+++ b/lib/posix-process/include/uk/process.h
@@ -39,5 +39,6 @@
 #define UNIKRAFT_PPID     0
 #define UNIKRAFT_SID      0
 #define UNIKRAFT_PGID     0
+#define UNIKRAFT_PROCESS_PRIO 0
 
 #endif /* __UK_PROCESS_H__ */
diff --git a/lib/posix-process/process.c b/lib/posix-process/process.c
index 74961db8..b2ace4c6 100644
--- a/lib/posix-process/process.c
+++ b/lib/posix-process/process.c
@@ -298,10 +298,58 @@ int nice(int inc __unused)
        return -1;
 }
 
-int setpriority(int which __unused, id_t who __unused, int prio __unused)
+int getpriority(int which, id_t who)
 {
-       WARN_STUBBED();
-       return 0;
+       int rc = 0;
+
+       switch (which) {
+       case PRIO_PROCESS:
+       case PRIO_PGRP:
+       case PRIO_USER:
+               if (who == 0)
+                       /* Allow only for the calling "process" */
+                       rc = UNIKRAFT_PROCESS_PRIO;
+               else {
+                       errno = ESRCH;
+                       rc = -1;
+               }
+               break;
+       default:
+               errno = EINVAL;
+               rc = -1;
+               break;
+       }
+
+       return rc;
+}
+
+int setpriority(int which, id_t who, int prio)
+{
+       int rc = 0;
+
+       switch (which) {
+       case PRIO_PROCESS:
+       case PRIO_PGRP:
+       case PRIO_USER:
+               if (who == 0) {
+                       /* Allow only for the calling "process" */
+                       if (prio != UNIKRAFT_PROCESS_PRIO) {
+                               /* Allow setting only the default prio */
+                               errno = EACCES;
+                               rc = -1;
+                       }
+               } else {
+                       errno = ESRCH;
+                       rc = -1;
+               }
+               break;
+       default:
+               errno = EINVAL;
+               rc = -1;
+               break;
+       }
+
+       return rc;
 }
 
 int prctl(int option __unused, ...)
-- 
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®.