aboutsummaryrefslogtreecommitdiff
path: root/common/uapi/ipc.c
AgeCommit message (Collapse)Author
2023-10-09move rpc stack handling to arch-specific codeKimplul
+ Fairly considerable speedup, as we don't have to look up the rpc pte every time separately, instead cacheing them. Adds an architecture specific limitation to total rpc stack size, though.
2023-07-27use nifty variable argument count trickKimplul
+ Found it in newlib. This allows the compiler to more effectively optimize away unnecessary register operations. Applied to both kernel and init.c for a slight speed increase. I really should move init.c to some other repository though, the binary files are starting to get annoying
2023-07-27add ipc_kickKimplul
+ Tests will have to come later
2023-06-14move rpc check to ipc_respoKimplul
2023-06-11add some clarifications to rpc stack stuffKimplul
2023-06-08add fast userspace return to do_ipcKimplul
2023-06-07add unlikely hint to leave_rpcKimplul
2023-06-05add check against calling ipc_resp erroneouslyKimplul
2023-06-05give compiler more room to optimize rpc invocationKimplul
+ Try to write arguments to memory as fast as possible to free up some registers that the compiler can then play with. Qemu runs ~1 700 000 rpc's per second, visionfive2 @1GHz (I think) ~800 000.
2023-05-01update license stuffKimplul
2023-04-30rename to kmiKimplul
2022-12-01start looking into memory handlingKimplul
+ Now 10M alloc/frees succeed, which totals more memory than the virtual machine has, so no too obvious leaks are occuring. For future debugging speed, changed 10M to 1M. + Also quick fix to rpcs, stacks are now assigned. Not entirely sure why they worked before this, but good that I found it.
2022-11-21make syscall handlers voidKimplul
2022-11-21fix formattingKimplul
2022-11-21possible optimisationsKimplul
2022-11-13outline rpc stack handlingKimplul
2022-11-13improve documentation on new featuresKimplul
2022-11-13~1.3M ipc requestsKimplul
+ The secret is using gravestones. I'll have to write up full documentation for the feature but essentially riscv lets us encode whatever we want into page table entries, as long as they're not active. We use this to encode highest user address that is not a zero, in that all entries in the top level are either active or gravestones. When an active entry is removed, it is either a gravestone (if there are other active entries above it) or it starts a cascade of removing entries that have been previously removed Slight runtime overhead to page mapping, pretty major advantage in rpc calls. Feature will need to be tested more thorougly, and the init program is sort of a best scenario with just one top level userspace page table entry active at a time, leading to incredibly fast context switches. Current implementation limits a process' max virtual memory to 248 GiB (in Sv39), but I don't think the missing 8 GiB is that big of a deal.
2022-11-13write init more sensiblyKimplul
+ Both easier to look at and now the userspace doesn't play as big of a role in the 'benchmarking' with optimizations turned on.
2022-11-12initial rpc implementationsKimplul
2022-11-09add basic IPI structureKimplul
2022-10-29rewrite pmemKimplul
2022-10-22start outlining ipcKimplul
2022-10-21beautificationKimplul
2022-09-23add notify_state to tcbKimplul
2022-09-23remove user data from sys_ipc_notifyKimplul
+ Multiple notify signals at the same time, or queued ones waiting for ipc_req/fwd to finish would require a notify stack of some kind, which is maybe too complex for my liking. Not impossible by any means, but I want to keep things simple. Let's say a client wants the server to do some async operation. First, the client calls ipc_req to inform the server that it would like the operation to be done. The server sets this task in some work queue or whatever, and returns to the client as quickly as possible. Later on, when the task is finished, the server does a ipc_req to the client, with data about what was just finished. The client is responsible for noting this data down somewhere, either reacting to the operation directly in the callback, or calling ipc_notify to the thread that requested the operation. Other possible notifications at the same time should be handled at the same time, whichever way the client wants to handle them. Note that ipc_notify triggers only when the thread it targets is in its base state, i.e. not doing an ipc_req. This makes things a bit easier.
2022-09-20add notify syscall skeletonKimplul
+ Now to actually start implementing shit. :)
2022-09-15change syscalls to take 5 params and return 6Kimplul
+ In total, a syscall is built up of 6 values, with the first being the syscall number. Symmetrically, the first value is now a status and the following five values return "values". This allows us to cram in more info into the ipc_* functions. The performance difference is absolutely minimal, at least from my testing in qemu.
2022-06-12doxygen shows no warningsKimplul
+ Does not mean documentation is done, but it's a nice little achievement nonetheless.
2022-06-12add license textsKimplul
2022-06-09use doxygen todoKimplul
2022-06-09continue documentationKimplul
2022-05-28continue documenting sourceKimplul
2022-05-28add sys_fwd and remove sys_req_*Kimplul
2022-05-22add @file info to all filesKimplul
+ Next step, start documenting contents of each file.
2022-05-22improved tcb handling in preparation for processesKimplul
2022-05-21add status info to memory mappingsKimplul
+ next up would probably be to start working on process/thread relationships, largely as documented. Still not entirely sure about how I want to handle fork, but I suppose I might figure it out at some point.
2022-05-21implement timers betterKimplul
2022-05-09improve uapiKimplul
2022-04-21start working on timer subsysKimplul
2022-04-10add clang format and run itKimplul
2021-12-27Started work on syscallsKimplul