Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Concurrency Testing using Custom Linux Schedule...

Concurrency Testing using Custom Linux Schedulers (p99conf)

New features of the Linux kernel allow us to develop our own Linux schedulers. This talk shows how anyone can write a basic Linux scheduler and use it, for example, to fuzz for concurrency bugs or optimize for specific workloads.

Avatar for Johannes Bechberger

Johannes Bechberger

November 13, 2025
Tweet

More Decks by Johannes Bechberger

Other Decks in Programming

Transcript

  1. A ScyllaDB Community Jake Hillion Software Engineer Johannes Bechberger Software

    Engineer Concurrency Testing using Custom Linux Schedulers
  2. eBPF is a crazy technology, it’s like putting JavaScript into

    the Linux kernel Brendan Gregg “ https://www.facesofopensource.com/brendan-gregg/
  3. T0 CPU 1 Local Queue CPU 2 Local Queue Global

    Queue Scheduler ... ... Scheduler dance T1
  4. @BPF(license = "GPL") public abstract class SampleScheduler extends BPFProgram implements

    Scheduler { static final long SHARED_DSQ_ID = 0; @Override public int init() { return scx_bpf_create_dsq(SHARED_DSQ_ID, -1); } }
  5. @BPF(license = "GPL") public abstract class SampleScheduler { @Override public

    void enqueue(Ptr<task_struct> p, long enq_flags) { scx_bpf_dispatch(p, SHARED_DSQ_ID, 5_000_000, enq_flags); } }
  6. @BPF(license = "GPL") public abstract class SampleScheduler { @Override public

    void dispatch(int cpu, Ptr<task_struct> prev) { scx_bpf_consume(SHARED_DSQ_ID); } }
  7. int hsmp_send_message(struct hsmp_message *msg) { take_per_socket_lock(); msg_socket->send_request(msg); while (!timed_out) {

    resp = msg_socket->gather_response(); if (resp.ready) break; usleep_range(100, 2000); // sleep for 100-2000 micros } release_per_socket_lock(); }
  8. int hsmp_send_message(struct hsmp_message *msg) { take_per_socket_lock(); msg_socket->send_request(msg); while (!timed_out) {

    resp = msg_socket->gather_response(); if (resp.ready) break; usleep_range(100, 2000); // sleep for 100-2000 micros } release_per_socket_lock(); } Defensive code gone wrong
  9. int hsmp_send_message(struct hsmp_message *msg) { take_per_socket_lock(); msg_socket->send_request(msg); while (true) {

    resp = msg_socket->gather_response(); if (resp.ready) break; if (timed_out) break; usleep_range(100, 2000); // sleep for 100-2000 micros } release_per_socket_lock(); }
  10. Thank you! Let’s connect. Jake Hillion @jakehillion.me on Bluesky https://matrix.to/#/@jake:hillion.co.uk

    blog.hillion.co.uk Johannes Bechberger @mostlynerdless.de on Bluesky https://mastodon.social/@parttimenerd mostlynerdless.de