Lund Linux Conference 2023
Lund Linux Conference (LLC)  is a "half-open" conference located in Lund. It is a conference with with high quality and I appreciate that the athmosphere is more familiar than at the larger conferences. I've been at the conference a couple of times before and the quality on the talks this year was as good as usual. ( The talks are by the way availalble on Youtube .)
We are growing though. Axis generously assists with premisses, but it remains to be seen wether we will get place next year.
Anyway, I took some notes as usual, and this blog post is nothing more than the notes I took during the talk.
The RISC-V Linux port; past/current/next
Björn Töpel talked about the current status of RISC-V architecture in the Linux kernel.
For those who don't know - RISC-V is a open and royalty free Instruction Set Architecture. In practice, this means for example that whenever you want to implement your own CPU core in your FPGA, you are free to do so using the RISC-V ISA. Compare that to ARM that you are strictly not allowed to even think about it without pay royalties and other fees.
RISC-V is a rather new port, the first proposol was sent out to the mailing list in 2016. It makes it a pretty good target to get involved into if you want to get to know the kernel in-depth as the implementation is still quite small in lines of code, which makes it easier to overview.
Björn told us that kernel support for RISC-V has made huge progress in the embedded area, but still lack some important functionality to be useful on the server side. Parts that are missing is e.g. support for ACPI, EUFI, AP-TEE, hotplugs and an advanced interrupt controller.
The architecture gets more support for each kernel release though. Some of the news for RISC-V in linux v6.4 are:
- Support for Kernel Adress Space Layout Randomization (KASLR)
- Relocatable kernel
- HWprobe syscall
Vector support is on its way, but it currently break the ABI, so there are a few things left that needs to be addressed before we can expect any merge.
One giant leap for security: leveraging capabilities in Linux
Kevin Brodsky talked about self aware pointers, which I found interresting. That we can use address bits for other purposes than addresses is nothing new. In a 64bit ARM kernel we do often use only 52bits anyway (4PiB of addressable memory is more than enough for all people(phun intended )).
What Kevin and his team has done is to extend the address to 129bits to even include meta data for boundaries, capabilities and validity tags. The 129bits reservaton has of course a huge impact on the system as it use more than double the size compared to a normal 64-bit system, but it also gives us much in return.
These 129 bits is by the way already a compressed version of the 256 bit variant they started with..
Unfortunately, the implementation is for userpace only, which is a little sad because we already have tons of tools to run application in a protected and constrained environment, but it proves that the concept works and maybe we will see something like this for kernel space in the future.
The implementation requires changes is several parts of the system. The memory allocator and unwind code is most affected, but even the kernel itself and glibc has to be modified. Most of the applications and libraries is not affected at all though.
There is a working meta-layer for Yocto called Morello that can be used to test it out. It contains a usage guide and even a little tutorial on howto build and run Doom :-)
Supporting zoned storage in Ublk
Andreas Hindborg has been working with support for zoned storage  in the ublk driver. Zoned storage is basically about to spit the address space into regions called zones that can only be written sequentially. This leads to higher throughput and increased capacity. It also eliminates the need for a Flash Translation Layer (FTL) for e.g. SSD devices.
ublk make use of io_uring internally, which by the way is a cool feature. The io_uring let you queue system calls into a ring buffer, which makes it possible to do more work every time you enter the kernel space. This has impact on the performance as you do not need to context switch back and forth to userspace between each system call.
It is quite easy to add support for io_uring operations to normal character devices, as the struct file_operation now has a uring_cmd callback function that could be populated. This makes it to a high performance alternative to the IOCTL we are used to.
ublk is used to create a block device driver in userspace. It works as all requests and results to/from the block device is redirected to a userspace daemon. The userspace daemon used for this is called ublk-rs, which is entirely written i Rust (of course..). Unfortunately, the source code is not yet available due to legal reasons, but is on its way.
His work was to add support for zoned storage (basically split the address space into regions called zones)
Then there was a couple of talks about the most hip programming language for now; Rust.
Linus Walleij gave us a history lecture in programming languages in his talk "Rust: Abstraction and Productivity" and his thoughts aout why Rust could be something good for kernel. Andreas Hindborg continued and showed how he implemented a null_blk driver completely in Rust.
But why should we even consider Rust for the kernel? In fact, the language is guaranteed to have a few properties C does not, and we basic Rust support was introduced in Linux v6.1.
We say that Rust is safe, and when we state that, we think of that Rust does have:
- No buffer overflows
- No use after free
- No dereferencing null or invalid pointers
- No double free
- No pointer aliasing
- No type errors
- No data races
- ... and more
What was new to me is that a Rust application does not even compile if you try something of the above.
This together makes Rust both memory safe, type safe and thread safe. Consider that 20-60% of the bug fixes in the kernel are for memory safety bugs. These memory bugs takes a lot of productivity away as it often takes long time to find and fix them. Maybe Rust is not that bad after all.
Many cool projects are going on in Rust, example on those are:
- TLS handshake in the kernel
- Ethernet-SPI drivers
- M1&M3 GPU drivers.
The goal with Andreas null_blk driver is to first write a solid Rust API for the blk-mq implementation and then use it in the null_blk driver to provide a reference implementation for linux kernel developers to get started with.
This was far from all talks, but only those that I had some taken some meaningful notes from.
Hope to see you there next year!