patches and low-level development discussion
 help / color / mirror / code / Atom feed
From: Alyssa Ross <hi@alyssa.is>
To: Demi Marie Obenour <demiobenour@gmail.com>
Cc: Spectrum OS Development <devel@spectrum-os.org>
Subject: Re: [PATCH v5 02/19] tools: Add control group manager
Date: Wed, 5 Aug 2026 18:39:48 +0200	[thread overview]
Message-ID: <anNkZdAsEDka2Fua@fw12.qyliss.net> (raw)
In-Reply-To: <2ce7b61d-faad-49b1-9f15-019140e2dca1@gmail.com>

[-- Attachment #1: Type: text/plain, Size: 9423 bytes --]

On Tue, Aug 04, 2026 at 09:36:00PM -0400, Demi Marie Obenour wrote:
> On 8/3/26 08:47, Alyssa Ross wrote:
> > Demi Marie Obenour <demiobenour@gmail.com> writes:
> >
> >> +    // The rustix source code shows that Dir::new() never fails.
> >> +    let child_fd = Rc::new(RefCell::new(Dir::new(fd).unwrap()));
> >> +    while let Some(element) = child_fd.borrow_mut().next() {
> >> +        let element = element.expect("Iterating through a cgroup directory failed?");
> >> +        if element.file_type() != rustix::fs::FileType::Directory {
> >> +            continue;
> >> +        }
> >> +        match element.file_name().to_bytes() {
> >> +            b"." | b".." => {}
> >> +            other => {
> >> +                let other = Path::new(OsStr::from_bytes(other)).to_owned();
> >> +                assert_single_component(&other);
> >> +                fds.push((child_fd.clone(), other));
> >
> > The data structures used here are still very confusing.  Why are we
> > storing a reference to the same file descriptor in every entry in the
> > Vec?
>
> Consider the recursive implementation (in pseudo-Rust):
>
> fn recursive_remove(fd) {
>     for entry in get_entries(&fd) {
>         if entry.is_dir_and_not_dot_or_dotdot() {
>             let directory = open_dir(&fd, &entry.path())?;
>             recursive_remove(directory)?;
>             remove_dir(&fd, entry.path())?;
>         }
>     }
> }
>
> The compiler knows that fd will stay open through recursive calls,
> so this doesn't need any unsafe code.  Using an explicit stack takes
> away this information from the compiler, so unsafe code is required.
> Using Rc<RefCell<Dir>> avoids the need for unsafe code at a cost
> in performance.

Hmm, but isn't it exactly child_fd that we're storing in the stack every
time?  Why store it in the stack at all rather than just using the
child_fd binding that exists for the whole life

> For what it is worth, the standard library implementation of
> fs::remove_dir_all() is recursive.  Standard library security hole?

Depends on their security model.  Doesn't seem ideal though, unless they
can use unstable features to do tail recursion or something, if that
would even be possible in this case.

> >> +            }
> >> +        }
> >> +    }
> >> +}
> >> +
> >> +// Remove all subdirectories of the given directory recursively,
> >> +// but not the directory itself.  The directory file descriptor
> >> +// is closed.
> >> +//
> >> +// This isn't the most efficient possible algorithm, but
> >> +// simplicity is more important than performance in this
> >> +// case.  Also, it keeps open more file descriptors than
> >> +// strictly necessary, but Spectrum runs with a very high
> >> +// limit for the number of open file descriptors, and it
> >> +// uses shallow control group hierarchies.
> >> +fn remove_child_directories(dirfd: OwnedFd) -> Result<(), Errno> {
> >> +    let mut fds = Vec::new();
> >> +    // Push the children of this directory onto the stack.
> >> +    push_child_fds(&mut fds, dirfd);
> >> +    while let Some((d, path)) = fds.pop() {
> >
> > Couldn't we call push_child_fds() once here, rather than twice as is
> > currently done?  (And then consider inlining it, depending on how
> > complex it's looking at the time.)
>
> Can you provide an example?  I don't see how to make this change
> while preserving semantics.  Only directories meant for deletion
> can appear on the stack, and the root of the traversal must not
> be deleted (yet).

Again I think I probably misunderstood, sorry.

> >> +            let sub_fd = cgroup
> >> +                .open_beneath(Path::new(component), OFlags::RDONLY | OFlags::DIRECTORY)
> >> +                .map_err(|e| format!("Cannot open sub-cgroup {component:?}: {e}"))?;
> >> +            // Take a shared lock on the *previous* file descriptor.
> >> +            rustix::fs::flock(&cgroup, FlockOperation::LockShared)
> >> +                .map_err(|e| format!("Cannot lock sub-cgroup {component:?}: {e}"))?;
> >> +            cgroup.fd.push(sub_fd);
> >> +        }
> >> +        // Take an exclusive lock on the final file descriptor.
> >> +        rustix::fs::flock(&cgroup, FlockOperation::LockExclusive)
> >> +            .map_err(|e| format!("Cannot lock {path:?}: {e}"))?;
> >> +        Ok(cgroup)
> >> +    }
> >> +
> >> +    pub fn wait_for_empty(fd: &dyn AsFd) -> std::io::Result<()> {
> >> +        let wait_file = openat2_simple(fd, Path::new("cgroup.events"), OFlags::RDONLY)?;
> >> +        let poll_fd = wait_file.as_raw_fd();
> >> +        let mut wait_fd = File::from(wait_file);
> >> +        let mut fds = libc::pollfd {
> >> +            fd: poll_fd,
> >
> > I would inline poll_fd here.  RawFd is easy to misuse, so I like to
> > avoid having them hang around.
>
> I will move `fds` into the inner loop.

I'd still like to see fd: wait_file.as_raw_fd() as well.

> >> +    pub fn purge_child(&mut self, path: &Path) -> Result<(), String> {
> >> +        assert_single_component(path);
> >> +        // See if we can just delete the child directly.
> >> +        match rustix::fs::unlinkat(&self, Path::new(path), AtFlags::REMOVEDIR) {
> >> +            // If the cgroup was successfully deleted, or if it
> >> +            // has already been deleted, we are done.
> >> +            Ok(()) | Err(Errno::NOENT) => return Ok(()),
> >> +            // If this cgroup is in use, keep going.
> >> +            Err(Errno::BUSY) => {}
> >> +            Err(e) => return Err(format!("Cannot purge {path:?}: {e}")),
> >> +        }
> >> +
> >> +        let sub_fd = match self.open_beneath(path, OFlags::RDONLY | OFlags::DIRECTORY) {
> >> +            Ok(sub_fd) => sub_fd,
> >> +            Err(Errno::NOENT) => return Ok(()),
> >> +            Err(e) => {
> >> +                return Err(format!("Cannot open sub-cgroup {path:?}: {e}",));
> >> +            }
> >> +        };
> >> +
> >> +        // Take an exclusive lock on the cgroup that is about to be
> >> +        // removed.  This avoids concurrent executions of this program
> >> +        // operating on deleted sub-cgroups.
> >> +        rustix::fs::flock(&sub_fd, FlockOperation::LockExclusive)
> >> +            .map_err(|e| format!("Cannot lock sub-cgroup: {e}"))?;
> >> +
> >> +        // Drop the exclusive lock on the original cgroup,
> >> +        // This avoids blocking concurrent operations on other
> >> +        // child cgroups while the cgroup is being purged,
> >> +        // or while waiting for programs to exit.
> >> +        rustix::fs::flock(&self, FlockOperation::LockShared)
> >> +            .map_err(|e| format!("Cannot relock: {e}"))?;
> >
> > Could you add some extra explanation here of why it's okay for the
> > exclusive lock to be temporarily dropped here?
> >
> > I'm wondering whether taking a lock, then dropping it temporarily is a
> > sign that we're taking the lock too early in the first place, and should
> > scope it better to where it's actually needed.
>
> Indeed so.  Programs that are modifying a cgroup need an exclusive
> lock on it.  Adding or removing to the cgroup does *not* count as
> modification: both operations are idempotent, removing an in-use
> cgroup fails with -EBUSY, and operating on a deleted cgroup fails
> with -ENODEV or -ENOENT depending on what one is doing.  Operations on
> control files *do* require an exclusive lock.

Good, let's have that written down somehow.  Preferably it'd be encoded
in the type system but I don't know if that's easily achievable.

> >> +
> >> +fn enable_subtree_control(fd: &dyn AsFd) -> Result<(), String> {
> >
> > Would it not make sense for this to be an instance method on Cgroup,
> > since it's a Cgroup-specific operation?
>
> We don't create a Cgroup struct for the child cgroup
> FD on which this function is called.

But we could!

> >> +    let mut subtree = vec![];
> >> +    for controller in buf.split(|&b| b == b' ').filter(|e| !e.is_empty()) {
> >
> > Are there ever likely to be empty works in this file?
>
> No, there will not be unless there is a kernel bug.

Right, so then we don't need the filter?

> > So looking at this I still see several different modes and am wondering
> > whether we could simplify this further.
> >
> >  • Why do we need a separate leaf mode?  Why not just still use a
> >    $inner.service in that case?
>
> $inner.service is just wasteful and makes it harder to inspect the cgroup
> tree by hand.

It can't be that wasteful, can it?  Surely cgroups are designed to
scale.  I'd rather have the consistency.

> >  • What would the consequences be if we took the systemd_compat branch
> >    for a non-cgroup-aware Spectrum program?
>
> Non-cgroup-aware programs would be fine, but nested calls to cgroup-setup
> would break because they need the enable_subtree_control() call.  However,
> in the future, I would like to check the user.delegate xattr to determine
> if one can safely write to the control files of the cgroup or if the cgroup
> is owned by another program.

And it wouldn't be correct to write to cgroup.subtree_control in all
cases?  Programs that expect cgroup delegation expect it to start empty,
and so won't disable controllers that they need to be disabled?  Or
would that be fine?

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

  reply	other threads:[~2026-08-05 16:39 UTC|newest]

Thread overview: 132+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-20 14:23 [PATCH] Set up control groups for most services Demi Marie Obenour
2026-06-20 17:27 ` [PATCH v2] " Demi Marie Obenour
2026-06-24 12:13   ` Alyssa Ross
2026-06-24 12:36     ` Alyssa Ross
2026-06-25  2:03     ` Demi Marie Obenour
2026-06-25  3:03       ` Demi Marie Obenour
2026-06-25  9:55         ` Alyssa Ross
2026-06-25  9:49       ` Alyssa Ross
2026-07-11 20:12   ` [PATCH v3 00/22] Control group support Demi Marie Obenour
2026-07-11 20:12     ` [PATCH v3 01/22] host/rootfs: Mount filesystems before s6-rc-init Demi Marie Obenour
2026-07-13  9:39       ` Alyssa Ross
2026-07-13 17:27         ` Demi Marie Obenour
2026-07-15 18:28           ` Alyssa Ross
2026-07-22  1:59       ` [PATCH v4 00/20] Control group support Demi Marie Obenour
2026-07-22  1:59         ` [PATCH v4 01/20] host/rootfs: Mount filesystems before s6-rc-init Demi Marie Obenour
2026-07-22  1:59         ` [PATCH v4 02/20] tools: Add control group manager Demi Marie Obenour
2026-07-22 16:01           ` Alyssa Ross
2026-07-23 23:07             ` Demi Marie Obenour
2026-07-27 12:10               ` Alyssa Ross
2026-07-30  0:40                 ` Demi Marie Obenour
2026-07-30 14:53                   ` Alyssa Ross
2026-07-22  1:59         ` [PATCH v4 03/20] Documentation: Mention control groups Demi Marie Obenour
2026-07-27 11:22           ` Alyssa Ross
2026-07-28 10:41           ` Valentin Gagarin
2026-07-22  1:59         ` [PATCH v4 04/20] Mount cgroup2 filesystem at /sys/fs/cgroup Demi Marie Obenour
2026-07-27 11:23           ` Alyssa Ross
2026-07-22  1:59         ` [PATCH v4 05/20] host/rootfs: Add helper program for per-VM services Demi Marie Obenour
2026-07-27 11:27           ` Alyssa Ross
2026-07-22  1:59         ` [PATCH v4 06/20] host/rootfs: Enable controllers in sub-cgroups Demi Marie Obenour
2026-07-27 12:11           ` Alyssa Ross
2026-07-28  2:19             ` Demi Marie Obenour
2026-07-29 14:13               ` Alyssa Ross
2026-07-22  1:59         ` [PATCH v4 07/20] host/rootfs: Add comments where cgroups are intentionally not used Demi Marie Obenour
2026-07-27 12:12           ` Alyssa Ross
2026-07-22  1:59         ` [PATCH v4 08/20] host/rootfs: serial-getty-generator: Use cgroups Demi Marie Obenour
2026-07-27 12:14           ` Alyssa Ross
2026-07-22  1:59         ` [PATCH v4 09/20] host/rootfs: Set up parent cgroup for all per-VM services Demi Marie Obenour
2026-07-27 12:16           ` Alyssa Ross
2026-07-28  3:01             ` Demi Marie Obenour
2026-07-29 14:29               ` Alyssa Ross
2026-07-29 20:20                 ` Demi Marie Obenour
2026-07-22  1:59         ` [PATCH v4 10/20] host/rootfs: Create per-VM cgroup for all of the VM's services Demi Marie Obenour
2026-07-22  1:59         ` [PATCH v4 11/20] host/rootfs: run-vmm: Create per-VM cgroup Demi Marie Obenour
2026-07-22  1:59         ` [PATCH v4 12/20] host/rootfs: run-appimage: Purge the " Demi Marie Obenour
2026-07-27 12:18           ` Alyssa Ross
2026-07-22  1:59         ` [PATCH v4 13/20] host/rootfs: run-flatpak: " Demi Marie Obenour
2026-07-27 12:19           ` Alyssa Ross
2026-07-22  1:59         ` [PATCH v4 14/20] host/rootfs: dbus: Run in cgroup Demi Marie Obenour
2026-07-22  1:59         ` [PATCH v4 15/20] host/rootfs: vhost-user-fs: " Demi Marie Obenour
2026-07-22  1:59         ` [PATCH v4 16/20] host/rootfs: vhost-user-gpu: " Demi Marie Obenour
2026-07-22  1:59         ` [PATCH v4 17/20] host/rootfs: xdg-desktop-portal-spectrum-host: " Demi Marie Obenour
2026-07-22  1:59         ` [PATCH v4 18/20] host/rootfs: systemd-udevd: " Demi Marie Obenour
2026-07-27 12:20           ` Alyssa Ross
2026-07-28  3:11             ` Demi Marie Obenour
2026-07-29 14:15               ` Alyssa Ross
2026-07-29 20:39                 ` Demi Marie Obenour
2026-07-30 14:55                   ` Alyssa Ross
2026-07-22  1:59         ` [PATCH v4 19/20] host/rootfs: weston: " Demi Marie Obenour
2026-07-27 12:23           ` Alyssa Ross
2026-07-28  3:14             ` Demi Marie Obenour
2026-07-22  1:59         ` [PATCH v4 20/20] host/rootfs: spectrum-router: " Demi Marie Obenour
2026-07-31 21:54         ` [PATCH v5 00/19] Control group support Demi Marie Obenour
2026-07-31 21:54           ` [PATCH v5 01/19] host/rootfs: Mount filesystems before s6-rc-init Demi Marie Obenour
2026-07-31 21:54           ` [PATCH v5 02/19] tools: Add control group manager Demi Marie Obenour
2026-08-03 12:47             ` Alyssa Ross
2026-08-05  1:36               ` Demi Marie Obenour
2026-08-05 16:39                 ` Alyssa Ross [this message]
2026-07-31 21:54           ` [PATCH v5 03/19] Documentation: Mention control groups Demi Marie Obenour
2026-08-03 13:22             ` Alyssa Ross
2026-07-31 21:54           ` [PATCH v5 04/19] Mount cgroup2 filesystem at /sys/fs/cgroup Demi Marie Obenour
2026-07-31 21:54           ` [PATCH v5 05/19] host/rootfs: Enable controllers in non-root cgroups Demi Marie Obenour
2026-07-31 21:54           ` [PATCH v5 06/19] host/rootfs: Add comments where cgroups are intentionally not used Demi Marie Obenour
2026-07-31 21:54           ` [PATCH v5 07/19] host/rootfs: serial-getty-generator: Use cgroups Demi Marie Obenour
2026-07-31 21:54           ` [PATCH v5 08/19] host/rootfs: systemd-udevd: Run in cgroup Demi Marie Obenour
2026-07-31 21:54           ` [PATCH v5 09/19] host/rootfs: weston: " Demi Marie Obenour
2026-07-31 21:54           ` [PATCH v5 10/19] host/rootfs: Set up parent cgroup for all per-VM services Demi Marie Obenour
2026-07-31 21:54           ` [PATCH v5 11/19] host/rootfs: Create per-VM cgroup for all of the VM's services Demi Marie Obenour
2026-07-31 21:54           ` [PATCH v5 12/19] host/rootfs: run-vmm: Create per-VM cgroup Demi Marie Obenour
2026-07-31 21:54           ` [PATCH v5 13/19] host/rootfs: run-appimage: Purge the " Demi Marie Obenour
2026-07-31 21:54           ` [PATCH v5 14/19] host/rootfs: run-flatpak: " Demi Marie Obenour
2026-07-31 21:54           ` [PATCH v5 15/19] host/rootfs: dbus: Run in cgroup Demi Marie Obenour
2026-07-31 21:54           ` [PATCH v5 16/19] host/rootfs: vhost-user-fs: " Demi Marie Obenour
2026-07-31 21:54           ` [PATCH v5 17/19] host/rootfs: vhost-user-gpu: " Demi Marie Obenour
2026-07-31 21:54           ` [PATCH v5 18/19] host/rootfs: xdg-desktop-portal-spectrum-host: " Demi Marie Obenour
2026-07-31 21:54           ` [PATCH v5 19/19] host/rootfs: spectrum-router: " Demi Marie Obenour
2026-08-06  1:16           ` [PATCH v6 00/19] Control group support Demi Marie Obenour
2026-08-06  1:16             ` [PATCH v6 01/19] host/rootfs: Mount filesystems before s6-rc-init Demi Marie Obenour
2026-08-06  1:16             ` [PATCH v6 02/19] tools: Add control group manager Demi Marie Obenour
2026-08-06  6:58               ` Demi Marie Obenour
2026-08-12 21:10               ` Alyssa Ross
2026-08-06  1:16             ` [PATCH v6 03/19] Documentation: Mention control groups Demi Marie Obenour
2026-08-06  1:16             ` [PATCH v6 04/19] Mount cgroup2 filesystem at /sys/fs/cgroup Demi Marie Obenour
2026-08-06  1:16             ` [PATCH v6 05/19] host/rootfs: Enable controllers in non-root cgroups Demi Marie Obenour
2026-08-06  1:16             ` [PATCH v6 06/19] host/rootfs: Add comments where cgroups are intentionally not used Demi Marie Obenour
2026-08-06  1:16             ` [PATCH v6 07/19] host/rootfs: serial-getty-generator: Use cgroups Demi Marie Obenour
2026-08-06  1:16             ` [PATCH v6 08/19] host/rootfs: systemd-udevd: Run in cgroup Demi Marie Obenour
2026-08-06  1:16             ` [PATCH v6 09/19] host/rootfs: weston: " Demi Marie Obenour
2026-08-06  1:16             ` [PATCH v6 10/19] host/rootfs: Set up parent cgroup for all per-VM services Demi Marie Obenour
2026-08-06  1:16             ` [PATCH v6 11/19] host/rootfs: Create per-VM cgroup for all of the VM's services Demi Marie Obenour
2026-08-06  1:16             ` [PATCH v6 12/19] host/rootfs: run-vmm: Create per-VM cgroup Demi Marie Obenour
2026-08-06  1:16             ` [PATCH v6 13/19] host/rootfs: run-appimage: Purge the " Demi Marie Obenour
2026-08-06  1:16             ` [PATCH v6 14/19] host/rootfs: run-flatpak: " Demi Marie Obenour
2026-08-06  1:16             ` [PATCH v6 15/19] host/rootfs: dbus: Run in cgroup Demi Marie Obenour
2026-08-06  1:16             ` [PATCH v6 16/19] host/rootfs: vhost-user-fs: " Demi Marie Obenour
2026-08-06  1:16             ` [PATCH v6 17/19] host/rootfs: vhost-user-gpu: " Demi Marie Obenour
2026-08-06  1:16             ` [PATCH v6 18/19] host/rootfs: xdg-desktop-portal-spectrum-host: " Demi Marie Obenour
2026-08-06  1:16             ` [PATCH v6 19/19] host/rootfs: spectrum-router: " Demi Marie Obenour
2026-08-12 21:06             ` [PATCH v6 00/19] Control group support Alyssa Ross
2026-07-11 20:12     ` [PATCH v3 02/22] scripts: Support symlinks in s6-rc-compile inputs Demi Marie Obenour
2026-07-13  9:42       ` Alyssa Ross
2026-07-13 14:19         ` Demi Marie Obenour
2026-07-15 18:30           ` Alyssa Ross
2026-07-11 20:12     ` [PATCH v3 03/22] tools: Add control group manager Demi Marie Obenour
2026-07-11 20:12     ` [PATCH v3 04/22] Documentation: Mention control groups Demi Marie Obenour
2026-07-11 20:12     ` [PATCH v3 05/22] Mount cgroup2 filesystem at /sys/fs/cgroup Demi Marie Obenour
2026-07-11 20:12     ` [PATCH v3 06/22] host/rootfs: Add helper program for per-VM services Demi Marie Obenour
2026-07-11 20:12     ` [PATCH v3 07/22] host/rootfs: Enable controllers in sub-cgroups Demi Marie Obenour
2026-07-11 20:12     ` [PATCH v3 08/22] host/rootfs: Add comments where cgroups are intentionally not used Demi Marie Obenour
2026-07-11 20:12     ` [PATCH v3 09/22] host/rootfs: serial-getty-generator: Use cgroups Demi Marie Obenour
2026-07-11 20:12     ` [PATCH v3 10/22] host/rootfs: Set up parent cgroup for all per-VM services Demi Marie Obenour
2026-07-11 20:12     ` [PATCH v3 11/22] host/rootfs: Create per-VM cgroup for all of the VM's services Demi Marie Obenour
2026-07-11 20:12     ` [PATCH v3 12/22] host/rootfs: run-vmm: Create per-VM cgroup Demi Marie Obenour
2026-07-11 20:12     ` [PATCH v3 13/22] host/rootfs: run-appimage: Purge the " Demi Marie Obenour
2026-07-11 20:12     ` [PATCH v3 14/22] host/rootfs: run-flatpak: " Demi Marie Obenour
2026-07-11 20:12     ` [PATCH v3 15/22] host/rootfs: dbus: Run in cgroup Demi Marie Obenour
2026-07-11 20:12     ` [PATCH v3 16/22] host/rootfs: vhost-user-fs: " Demi Marie Obenour
2026-07-11 20:12     ` [PATCH v3 17/22] host/rootfs: vhost-user-gpu: " Demi Marie Obenour
2026-07-11 20:12     ` [PATCH v3 18/22] host/rootfs: xdg-desktop-portal-spectrum-host: " Demi Marie Obenour
2026-07-11 20:12     ` [PATCH v3 19/22] host/rootfs: systemd-udevd: " Demi Marie Obenour
2026-07-11 20:12     ` [PATCH v3 20/22] host/rootfs: weston: " Demi Marie Obenour
2026-07-11 20:12     ` [PATCH v3 21/22] host/rootfs: spectrum-router: " Demi Marie Obenour
2026-07-11 20:12     ` [PATCH v3 22/22] host/rootfs: vm-import: Use elglob -w Demi Marie Obenour

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=anNkZdAsEDka2Fua@fw12.qyliss.net \
    --to=hi@alyssa.is \
    --cc=demiobenour@gmail.com \
    --cc=devel@spectrum-os.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://spectrum-os.org/git/doc
	https://spectrum-os.org/git/mktuntap
	https://spectrum-os.org/git/spectrum
	https://spectrum-os.org/git/ucspi-vsock

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).