diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2023-06-04 23:31:42 +0300 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2023-06-04 23:31:42 +0300 |
| commit | 3b8990f17c50e946bc1b9bca5997a25d69d0757c (patch) | |
| tree | 3568e26534c2f2a071736495ea7644d86c726598 | |
| parent | 4c7286ef7cf3da1897085406f85564faac5185bb (diff) | |
| download | kmi-3b8990f17c50e946bc1b9bca5997a25d69d0757c.tar.gz kmi-3b8990f17c50e946bc1b9bca5997a25d69d0757c.zip | |
slight optimization and brainfart fix
| -rw-r--r-- | arch/riscv64/kernel/vmem.c | 24 | ||||
| -rw-r--r-- | common/uapi/proc.c | 2 | ||||
| -rw-r--r-- | include/kmi/uapi.h | 146 |
3 files changed, 82 insertions, 90 deletions
diff --git a/arch/riscv64/kernel/vmem.c b/arch/riscv64/kernel/vmem.c index 89d895f..9edd246 100644 --- a/arch/riscv64/kernel/vmem.c +++ b/arch/riscv64/kernel/vmem.c @@ -398,8 +398,8 @@ static void __use_vmem(struct vmem *branch, enum mm_mode m) else if (m == Sv48) mode = SATP_MODE_Sv48; - flush_tlb_full(); csr_write(CSR_SATP, mode | pn); + flush_tlb_full(); /* Sv57 && Sv64 in the future? */ /** @todo ASID table for maybe faster context switches? */ } @@ -468,33 +468,19 @@ vm_t setup_kernel_io(struct vmem *b, vm_t paddr) void clone_uvmem(struct vmem * restrict r, struct vmem * restrict b) { size_t i = 0; - for (; i < CSTACK_PAGE; i += 8) { + for (; i < CSTACK_PAGE; ++i) { struct vmem *t = r->leaf[i + 0]; if (t == 0) break; - b->leaf[i + 0] = t; - b->leaf[i + 1] = r->leaf[i + 1]; - b->leaf[i + 2] = r->leaf[i + 2]; - b->leaf[i + 3] = r->leaf[i + 3]; - b->leaf[i + 4] = r->leaf[i + 4]; - b->leaf[i + 5] = r->leaf[i + 5]; - b->leaf[i + 6] = r->leaf[i + 6]; - b->leaf[i + 7] = r->leaf[i + 7]; + b->leaf[i] = t; } - for (; i < CSTACK_PAGE; i += 8) { + for (; i < CSTACK_PAGE; ++i) { struct vmem *t = b->leaf[i + 0]; if (t == 0) break; - b->leaf[i + 0] = 0; - b->leaf[i + 1] = 0; - b->leaf[i + 2] = 0; - b->leaf[i + 3] = 0; - b->leaf[i + 4] = 0; - b->leaf[i + 5] = 0; - b->leaf[i + 6] = 0; - b->leaf[i + 7] = 0; + b->leaf[i] = 0; } } diff --git a/common/uapi/proc.c b/common/uapi/proc.c index 2f1a638..81e3305 100644 --- a/common/uapi/proc.c +++ b/common/uapi/proc.c @@ -183,5 +183,5 @@ SYSCALL_DEFINE1(swap)(struct tcb *t, sys_arg_t tid){ set_args(t, SYS_RET1(OK)); /* get register state for new thread */ - return_args(t, get_args(s)); + return_args(s, get_args(s)); } diff --git a/include/kmi/uapi.h b/include/kmi/uapi.h index 1ec69db..ad4369f 100644 --- a/include/kmi/uapi.h +++ b/include/kmi/uapi.h @@ -158,21 +158,27 @@ struct sys_ret { /** * Helper macro for defining syscall with zero arguments. * + * Note the \c __noinline attribute, might seem weird but turned out + * that gcc liked to inline all system calls into handle_syscall(), + * which seems to add quite a bit of moving registers around and spilling + * into memory. Forcing the syscalls to not be inlined removed this + * overhead and sped things up by ~7 %. + * * @param name Name of syscall. */ -#define SYSCALL_DEFINE0(name) \ - static inline void __##name(struct tcb *t); \ - void sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \ - sys_arg_t c, \ - sys_arg_t d, sys_arg_t e) \ - { \ - UNUSED(a); \ - UNUSED(b); \ - UNUSED(c); \ - UNUSED(d); \ - UNUSED(e); \ - __##name(t); \ - } \ +#define SYSCALL_DEFINE0(name) \ + static inline void __##name(struct tcb *t); \ + void __noinline sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \ + sys_arg_t c, \ + sys_arg_t d, sys_arg_t e) \ + { \ + UNUSED(a); \ + UNUSED(b); \ + UNUSED(c); \ + UNUSED(d); \ + UNUSED(e); \ + __##name(t); \ + } \ static inline void __##name /** @@ -180,18 +186,18 @@ struct sys_ret { * * @param name Name of syscall. */ -#define SYSCALL_DEFINE1(name) \ - static inline void __##name(struct tcb *, sys_arg_t); \ - void sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \ - sys_arg_t c, \ - sys_arg_t d, sys_arg_t e) \ - { \ - UNUSED(b); \ - UNUSED(c); \ - UNUSED(d); \ - UNUSED(e); \ - __##name(t, a); \ - } \ +#define SYSCALL_DEFINE1(name) \ + static inline void __##name(struct tcb *, sys_arg_t); \ + void __noinline sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \ + sys_arg_t c, \ + sys_arg_t d, sys_arg_t e) \ + { \ + UNUSED(b); \ + UNUSED(c); \ + UNUSED(d); \ + UNUSED(e); \ + __##name(t, a); \ + } \ static inline void __##name /** @@ -199,18 +205,18 @@ struct sys_ret { * * @param name Name of syscall. */ -#define SYSCALL_DEFINE2(name) \ - static inline void __##name(struct tcb *, sys_arg_t, \ - sys_arg_t); \ - void sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \ - sys_arg_t c, \ - sys_arg_t d, sys_arg_t e) \ - { \ - UNUSED(c); \ - UNUSED(d); \ - UNUSED(e); \ - __##name(t, a, b); \ - } \ +#define SYSCALL_DEFINE2(name) \ + static inline void __##name(struct tcb *, sys_arg_t, \ + sys_arg_t); \ + void __noinline sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \ + sys_arg_t c, \ + sys_arg_t d, sys_arg_t e) \ + { \ + UNUSED(c); \ + UNUSED(d); \ + UNUSED(e); \ + __##name(t, a, b); \ + } \ static inline void __##name /** @@ -218,18 +224,18 @@ struct sys_ret { * * @param name Name of syscall. */ -#define SYSCALL_DEFINE3(name) \ - static inline void __##name(struct tcb *, sys_arg_t, \ - sys_arg_t, \ - sys_arg_t); \ - void sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \ - sys_arg_t c, \ - sys_arg_t d, sys_arg_t e) \ - { \ - UNUSED(d); \ - UNUSED(e); \ - __##name(t, a, b, c); \ - } \ +#define SYSCALL_DEFINE3(name) \ + static inline void __##name(struct tcb *, sys_arg_t, \ + sys_arg_t, \ + sys_arg_t); \ + void __noinline sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \ + sys_arg_t c, \ + sys_arg_t d, sys_arg_t e) \ + { \ + UNUSED(d); \ + UNUSED(e); \ + __##name(t, a, b, c); \ + } \ static inline void __##name /** @@ -237,17 +243,17 @@ struct sys_ret { * * @param name Name of syscall. */ -#define SYSCALL_DEFINE4(name) \ - static inline void __##name(struct tcb *, sys_arg_t, \ - sys_arg_t, sys_arg_t, \ - sys_arg_t); \ - void sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \ - sys_arg_t c, \ - sys_arg_t d, sys_arg_t e) \ - { \ - UNUSED(e); \ - __##name(t, a, b, c, d); \ - } \ +#define SYSCALL_DEFINE4(name) \ + static inline void __##name(struct tcb *, sys_arg_t, \ + sys_arg_t, sys_arg_t, \ + sys_arg_t); \ + void __noinline sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \ + sys_arg_t c, \ + sys_arg_t d, sys_arg_t e) \ + { \ + UNUSED(e); \ + __##name(t, a, b, c, d); \ + } \ static inline void __##name /** @@ -255,16 +261,16 @@ struct sys_ret { * * @param name Name of syscall. */ -#define SYSCALL_DEFINE5(name) \ - static inline void __##name(struct tcb *, sys_arg_t, \ - sys_arg_t, sys_arg_t, \ - sys_arg_t, sys_arg_t); \ - void sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \ - sys_arg_t c, \ - sys_arg_t d, sys_arg_t e) \ - { \ - __##name(t, a, b, c, d, e); \ - } \ +#define SYSCALL_DEFINE5(name) \ + static inline void __##name(struct tcb *, sys_arg_t, \ + sys_arg_t, sys_arg_t, \ + sys_arg_t, sys_arg_t); \ + void __noinline sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \ + sys_arg_t c, \ + sys_arg_t d, sys_arg_t e) \ + { \ + __##name(t, a, b, c, d, e); \ + } \ static void __##name /** @name Misc syscalls. */ |
