Have abort_sysc() take a uintptr_t instead of a struct sysc pointer
authorBarret Rhoden <brho@cs.berkeley.edu>
Sat, 2 Mar 2019 00:40:46 +0000 (19:40 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sat, 2 Mar 2019 00:42:51 +0000 (19:42 -0500)
The struct sysc pointer is not dereferenced.  By making it a uintptr_t,
it is more clear that the value is used as a number, not a pointer.
abort_sysc() uses it for a pointer equality check.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/kthread.h
kern/src/kthread.c
kern/src/syscall.c

index 8581d5b..c33e385 100644 (file)
@@ -175,7 +175,7 @@ void cv_broadcast(struct cond_var *cv);
 void cv_signal_irqsave(struct cond_var *cv, int8_t *irq_state);
 void cv_broadcast_irqsave(struct cond_var *cv, int8_t *irq_state);
 
-bool abort_sysc(struct proc *p, struct syscall *sysc);
+bool abort_sysc(struct proc *p, uintptr_t sysc);
 void abort_all_sysc(struct proc *p);
 int abort_all_sysc_fd(struct proc *p, int fd);
 void __reg_abortable_cv(struct cv_lookup_elm *cle, struct cond_var *cv);
index 4a9111b..394a9ba 100644 (file)
@@ -901,7 +901,7 @@ static void __abort_and_release_cle(struct cv_lookup_elm *cle)
  * - if you sleep, you're on the list
  * - if you are on the list or abort_in_progress is set, CV is signallable, and
  *   all the memory for CLE is safe */
-bool abort_sysc(struct proc *p, struct syscall *sysc)
+bool abort_sysc(struct proc *p, uintptr_t sysc)
 {
        ERRSTACK(1);
        struct cv_lookup_elm *cle;
@@ -909,7 +909,7 @@ bool abort_sysc(struct proc *p, struct syscall *sysc)
 
        spin_lock_irqsave(&p->abort_list_lock);
        TAILQ_FOREACH(cle, &p->abortable_sleepers, link) {
-               if (cle->sysc == sysc) {
+               if ((uintptr_t)cle->sysc == sysc) {
                        /* Note: we could have multiple aborters, so we need to use a
                         * numeric refcnt instead of a flag. */
                        atomic_inc(&cle->abort_in_progress);
index 677408a..b75dc66 100644 (file)
@@ -1676,7 +1676,7 @@ out:
 
 static int sys_abort_sysc(struct proc *p, struct syscall *sysc)
 {
-       return abort_sysc(p, sysc);
+       return abort_sysc(p, (uintptr_t)sysc);
 }
 
 static int sys_abort_sysc_fd(struct proc *p, int fd)