Skip to content

Commit

Permalink
pipe: Fall back to write() on vmsplice() EPERM
Browse files Browse the repository at this point in the history
vmsplice can be blocked via seccomp and currently is in Podman
containers.

Signed-off-by: Younes Manton <ymanton@ca.ibm.com>
  • Loading branch information
ymanton committed Oct 30, 2023
1 parent c474816 commit 25fe68a
Showing 1 changed file with 11 additions and 1 deletion.
12 changes: 11 additions & 1 deletion criu/pipes.c
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ int restore_pipe_data(int img_type, int pfd, u32 id, struct pipe_data_rst **hash
int ret;
struct pipe_data_rst *pd;
struct iovec iov;
bool try_vmsplice = true;

for (pd = hash[id & PIPE_DATA_HASH_MASK]; pd != NULL; pd = pd->next)
if (pd->pde->pipe_id == id)
Expand Down Expand Up @@ -179,7 +180,16 @@ int restore_pipe_data(int img_type, int pfd, u32 id, struct pipe_data_rst **hash
iov.iov_len = pd->pde->bytes;

while (iov.iov_len > 0) {
ret = vmsplice(pfd, &iov, 1, SPLICE_F_GIFT | SPLICE_F_NONBLOCK);
if (try_vmsplice) {
ret = vmsplice(pfd, &iov, 1, SPLICE_F_GIFT | SPLICE_F_NONBLOCK);
if (ret < 0 && errno == EPERM) {
pr_info("%#x: vmsplice() returned EPERM, falling back to write()\n", id);
try_vmsplice = false;
ret = write(pfd, iov.iov_base, iov.iov_len);
}
} else
ret = write(pfd, iov.iov_base, iov.iov_len);

if (ret < 0) {
pr_perror("%#x: Error splicing data", id);
return -1;
Expand Down

0 comments on commit 25fe68a

Please sign in to comment.