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 <[email protected]>
  • Loading branch information
ymanton committed Oct 30, 2023
1 parent c474816 commit 9594633
Showing 1 changed file with 12 additions and 1 deletion.
13 changes: 12 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,17 @@ 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);
}
}

Check warning on line 190 in criu/pipes.c

View workflow job for this annotation

GitHub Actions / build

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 9594633

Please sign in to comment.