Re: GSoC 2026 Draft Proposal (Checkpointing of POSIX Message Queues)
Ojo Boluwatife Fiyinfoluwa <[email protected]> Thu, 19 Mar 2026 00:39:13 +0100
| Newsgroups | dev.linux.lists.criu |
|---|---|
| Message-ID | <[email protected]> |
Hi Radostin and Pavel, I wanted to follow up on the draft proposal I sent on Sunday. I have submitted it on the GSoC portal and wanted to check if you had any feedback regarding any parts of my proposal before the March 31 deadline. I am happy to adjust any part of the proposal based on your guidance. Thank you for your time. Ojo Boluwatife Fiyinfoluwa GitHub: https://github.com/fiyinfoluwa001 On 3/15/26 07:47, Ojo Boluwatife Fiyinfoluwa wrote: > Hello Radostin and Pavel, > > I hope you are doing well. Following our earlier exchange, I have > completed my draft proposal for the POSIX message queues project and > would be grateful for your feedback before I submit it on the GSoC > portal tomorrow. > > Since we last spoke, I have: > - Studied August Fu's implementation in full and identified the gap: > intrusive_mq_peek_all() is a temporary read-resend hack with no kernel > interface behind it > - Traced the dump failure to criu/files-reg.c:1710 > - Read commit 8ce9e947051e (SO_PEEK_OFF) as the reference pattern for > the kernel interface > - Had PR #2963 merged (CodeQL actions v3 → v4 upgrade) > > My proposal covers my full technical approach (a new ioctl in ipc/ > mqueue.c, CRIU dump/restore integration building on Fu's scaffolding, > and extended ZDTM tests for priority ordering and edge cases.) > > I have attached the proposal as a plain text document. Any feedback on > the technical approach or timeline would be very welcome. > > Thank you for your time. > > Ojo Boluwatife Fiyinfoluwa > GitHub: https://github.com/fiyinfoluwa001 > Gitter: @fiyinfoluwa:gitter.im > > > > > > > PROJECT TITLE: Checkpointing of POSIX message queues > > > > > MENTORS: Radostin Stoyanov <[email protected]> > Pavel Tikhomirov <[email protected]> > > > > > PERSONAL INFORMATION: > > > Name: Ojo Boluwatife Fiyinfoluwa > Email: [email protected] > Github: https://github.com/fiyinfoluwa001 > Gitter: @fiyinfoluwa:gitter.im > Location: Lagos, Nigeria > Timezone: GMT + 1 > > > > > > > > > > > > > PROBLEM STATEMENT > > > The problem > The main issue is how the system handles messages. In the present linux > code, specifically a file called mqueue.c there is currently only one > way to read a message: pick it up and then take it out. > Just like a physical email box where the moment you view a letter, it > just disappears or vaporizes, this phenomenon is what is called a > destructive read. There is no function where you could quickly take a > look at the message while it’s left safely on the queue. > CRIU (Checkpoint/Restore In Userspace) acts as a button for running > programs. > It freezes a program => Saves its state to a file => Lets you restart it > later on. > To achieve the above process, CRIU needs to see what messages would be > waiting in the inbox, but due to the destructive read or the self > destruct rule: > CRIU reads the messages to save them → but reading removes them from the > queue → so the saved state is now broken because the original queue is > empty. > When CRIU encounters a POSIX message queue file descriptor today, it > fails at line 1710 in criu/files-reg.c with the error: Can't lookup > mount for fd path=/mq0. > In other parts of Linux like the Unix domain sockets, there is a command > called the MSG_PEEK, this command lets you peek at a message without > removing it. POSIX message queues don’t have that command. Yet. > > > > > Why CRIU currently fails > When trying to use CRIU to save a program that uses this message queues, > it gets confused. > The path problem : CRIU looks for the queue (like /mq0) and can’t find > where it lives on the system, it hits a dead end in its code and simply > gives up. > The safety problem: Even if it found the queue it would not know how to > peek at the messages without deleting them. > A prior contributor (August Fu) tried solving this problem by building a > temporary framework (scaffolding). Fu created the fd detection logic, a > new criu/mqueue.c, a protobuf schema in images/mqueue.proto, and a ZDTM > test — everything except the kernel interface itself. > > To save messages, this contributor had to do something risky: > * Read the message (which then deletes it from the queue) > * Save the data to a file > * Re-send the message back into the queue immediately > As the contributor himself noted in the code that the ‘read-re-send ’ > hack was temporary, this is dangerous because: > * It changes the timing of the message > * If the system crashes halfway through the process, the message is lost > forever > The only real way to fix this issue is to go into the linux kernel > itself and then add a peek feature ( a way for CRIU to look at the > messages through a window without touching them). > > https://raw.githubusercontent.com/fiyinfoluwa001/criu/criu-dev/diagrams/ > criu-img-proposal.png > > > > > > > > The solution: Using sockets as a map > > > This problem was solved by CRIU for UNIX sockets. Sockets originally had > the same ‘read => delete’ issue, but this issue was resolved by adding a > feature called SO_PEEK_OFF > This acts like a digital bookmarker: > * It lets CRIU read data from a socket without consuming it, this > preserves the original state. This same principle (read without > destroying), is what POSIX message queues need. > > https://raw.githubusercontent.com/fiyinfoluwa001/criu/criu-dev/diagrams/ > criu-img-solution.png > > > TECHNICAL APPROACH > > > The Kernel Patch > We would be focusing on a file called ipc/mqueue.c. > My first approach would be to add a new command (an ioctl) that would > help us look at the messages without taking anything out. This is how it > would function: > * Find the inbox (It would take the file descriptor of the message queue > as input). > * Walkthrough(Inside the kernel, messages are stored in an rb-tree, this > new command would walk through this tree, starting with the most > important messages). > * As it is moving through this tree, it copies the content and the > priority level of every message into a safe buffer for the user, and > then it tells the user exactly how many messages it found and copied. > * The most important action here is that the command leaves the original > tree exactly as it found it, nothing is deleted or removed. > > > By adding this feature, we provide a safer way to back up the queue > without destroying data.The data structure that holds each message would > look like this > > > struct mq_peek_msg { > unsigned int priority; > size_t msg_len; > char msg_ptr[MQ_MSGSIZE_MAX]; > }; > > > The CRIU Userspace (Dump) > The Detection > When CRIU starts the process of saving a program, it checks or looks at > every open file, for this I would be adding a check specifically the > dump_one_file() in criu/files.c to recognize the POSIX_MQUEUE_MAGIC ID. > This process tells CRIU that it is not a normal file but a message queue. > The Retrieval > Once CRIU is informed that it’s not a normal file but a queue, it will > call a new function. Instead of using the old way of deleting and re- > sending messages, it would use the new kernel command (ioctl) to safely > copy all messages at once without touching the original queue. > Saving to Image > All the data is taken and then packaged: > * The body and priority of every message are saved using the > mqueue.proto schema, the one Fu defined that captures both the message > body and the priority integer.. > * The queue’s rules (maxmsg, msgsize, curmsgs)are also recorded using > mq_getattr() > Cleaning Up Code > The helpful part of August Fu’s work would be kept and the band-aid fix > would be cut out. I’ll be replacing the temporary read-resend function > with the clean kernel call. > > > > > > > The CRIU Userspace (Restore) > Rebuilding the inbox > It starts by creating a brand new message queue using the settings saved > earlier, using mq_open() with O_CREAT and the saved maxmsg and msgsize > attributes to ensure the new inbox has the same limits, like the > maximum number of messages and the allowed message size as the original > one. > > > Replaying the messages > CRIU goes through the saved list of messages one after the other, > looking at each message’s body and its priority level. It would then > send them into the new queue mq_send, because each message's priority > integer was saved individually, the kernel's priority queue > automatically places them back in the correct order, no manual sorting > necessary. > > > Fixing the ID > Every open file or queue in a program has a specific file descriptor. > To ensure the restored program does not get confused, using dup2 , > following the same pattern used in criu/pidfd.c to give the new queue > the exact same ID number the old one had. > > > Keeping it clean > All this would be built off of the ground work of the previous developer > for this part, since the save method is now non-destructive, the restore > is much more reliable. > > > Tests > Improving Existing Tests (test/zdtm/static/pmsgque.c) > * Priority Order: I’ll send messages with different importance levels to > make sure they come out in the right order after a restore. > * Full Queues: I’ll test a scenario where the inbox is completely full > to ensure that no data is dropped. > * Empty queue: verify CRIU handles a queue with zero messages > gracefully, no crash, clean restore. > * Multiple Connections: I’ll test scenarios where even if a program has > several different handles open on the same queue. > Kernel Safety Tests (kselftest, tools/testing/selftests/ipc/) > * Ensure the new ‘peek’ command (ioctl) returns the exact right data > * The command is truly non-destructive and doesn’t change a single bit > of the original queue > > > TIMELINE > Community Bonding (May 1 - June 1) > * Research kernel’s internal message systems with mentors guidance > * Confirm the best technical interface with mentors. > * Set up specialized virtual machine for deep-level kernel debugging > * Review open CI and workflow issues on criu-dev branch and contribute > where possible > > > Week 1 - 2 (June 2 - 15) : Kernel (Design and scaffolding) > * Create data format and command ID in the kernel header files > * Write initial command handler in ipc/mqueue.c that compiles but > doesn’t perform actions yet > * Send a short RFC email to mentors documenting design decisions and > confirming interface approach > > > Week 3 - 4 (June 16 - 29) : Kernel (Implementation) > * Write the code that scans through the message tree while keeping the > data safely locked. > * Ensure the system correctly handles empty queues, full queues and very > large messages. > * Create a simple program to verify that the new command retrieves data > correctly from the kernel. > > > Week 5 – 6 (June 30 – July 13) : Kernel (Test and Review) > * Create kselftest suite to prove the new command works correctly > * Update kernel patch based on my mentor’s technical feedback > * Prepare the final code for the official Linux Kernel mailing list > > > Week 7(July 14 - July 20) : Buffer > * Finish any leftover kernel work or documentation > * Research how CRIU handles other special files to prepare for the > ‘Save’ feature. > * Read criu/pidfd.c and criu/unixsk.c in depth to understand the fd > handling patterns you'll follow in Week 8-9 > > > Week 8 – 9 (July 21 - August 3) : CRIU (Dump) > * Update CRIU to automatically recognize POSIX message queues during a scan > * Write the code to pull message data from the kernel and save it to the > file > * Double check that the saved image files contain the correct message > bodies and priorities > Week 10 - 11 (August 4 - 17) : CRIU (Restore and Test) > * Create the ‘restore’ logic to rebuild the queue and reload messages > in their original order. > * Update the pmsgque.c test to check for complex scenarios like priority > sorting and full queues > * Run the entire suite of CRIU tests to ensure the new features don’t > break existing ones. > > > Week 12 (August 18 - 24) : CRIU (Buffer and Polish) > * Update my work based on mentors feedback > * Add instruction for POSIX message queue support to the CRIU wiki page. > * Perform a complete cleanup to ensure all tests pass on the automated > system > > > Final Evaluation(August 25) > * Confirm kernel patch is under review on the Linux kernel mailing list > * Open the official PR to add message queue support to CRIU > * Verify that every single test case passes successfully. > > > Post Contribution > * Address any remaining review feedback on the kernel patch from the > linux kernel mailing list > * Remain available to help future contributors building on this work > * Continue contributing to CRIU beyond the scope of this project. > > > PRIOR CONTRIBUTIONS AND ENGAGEMENT > Codebase Study > * Built CRIU v4.2 from source on Ubuntu 24.04 (kernel 6.8) and then ran > a successful checkpoint/restore cycle > * Wrote and ran a C demo program demonstrating the exact problem: > mq_receive() is destructive, messages are lost on read > * Read August Fu's implementation at github.com/yuntongf/criu (branch: > posix-mqueue) in full, identifying the gap: intrusive_mq_peek_all() is > acknowledged by Fu himself as temporary. > * Traced the dump failure to criu/files-reg.c:1710 and understood why it > happens > * Read commit 8ce9e947051e (SO_PEEK_OFF socket support) as the reference > pattern for this project > * Merged PR #2963 , upgraded CodeQL actions from v3 to v4 ahead of > Node.js 20 end-of-life (April 30, 2026) > > > > > > > CI Investigation (Issue #2911) > * Investigated two failing CI runs (Run #42 and #43) identifying a > consistent network bridge teardown race condition in the compat-test > job. Issue was subsequently resolved in PRs #2950 and #2948 > > > ABOUT ME > > > I am a software developer (backend heavy) in Lagos, Nigeria, with a > background in C, Linux systems programming, Bash, Javascript and > Typescript, I am also a penultimate year student at Obafemi Awolowo > University, Ile-Ife, Osun state,Nigeria, studying Computer Engineering. > I have been working on Ubuntu 24.04 (kernel 6.8) and have spent the > past month studying and building genuine familiarity with the CRIU > codebase, not just reading documentation but also by building the > project from source, running checkpoint/restore cycles and writing C > programs to demonstrate the exact problem that my proposal solves. > I chose this project because the problem is specific and the solution > path is clear. After studying August Fu’s prior implementation, I > identified that the missing piece is not userspace code but a kernel > interface that does not exist yet. That gap is what I intend to fill. > I have no competing commitments during the summer and I am available to > work full time on this project for the full 350 hrs.