3 ms·
The problem is that the calls are related. The first gives you the file handle, the second reads it, the third closes it. You need the handle in advance to queu
by koolba 7y ago
The problem is that the calls are related. The first gives you the file handle, the second reads it, the third closes it. You need the handle in advance to queue the second and third.
This idea reminds me of pipelined Redis commands. It does work to boost total throughout, but it’s significantly more complicated to use in practice.
- correct_horse 7y ago> You need the handle in advance to queue the second and third whoops. I probably should have thought of that.
- jzwinck 7y agoImagine a method like this: 1. Enqueue A = openat(...) 2. Enqueue B = read(A, buf, sz) 3. Enqueue close(A) 4. Commit, return B to userspace A and B are placeholders, and A is never known to userspace, it is simply chained within the enqueued commands.
- danobi 7y agoWhat if openat() or read() fails? More generally, what if there's a chain of syscalls and you _want_ one of them to fail?
- JoshTriplett 7y agoWith the "specific fd" approach, if openat fails, then read and close will harmlessly fail with EBADF ("Bad file descriptor"). Once you process the failure of openat, you'll just ignore the failure of read and close.
- yxhuvud 7y agoWhat will happen though, if the fd is already used by some other area of userspace? Like what if some lib you link to also happen to hardcore the use of the same fd. Sounds like unfunny problems to debug. In the case of uring I suppose it is possible to link the calls to fail at the first failure.
- JoshTriplett 7y ago> What will happen though, if the fd is already used by some other area of userspace? That's what the min_fd patch is for, and potentially other systems for reserving blocks of fds. Much like memory, you'll ask the kernel for a block of it and then do your own allocations out of that.
- yxhuvud 7y agoAh, it will be possible to allocate multiple blocks of file descriptors? Ok, then things start to make sense.
- riffraff 7y agoThis seems exactly the io_uring approach with magic fd described in the article.
- naasking 7y ago> You need the handle in advance to queue the second and third. Think about how pipelined commands work in a command shell if you want to understand how to construct a program that can define a sequence of operations on objects before they're defined.