{
  "slug": "vmsplice",
  "term": "vmsplice",
  "aliases": [],
  "definition": "vmsplice is a Linux system call that transfers data between a pipe and user-memory ranges described by an iovec array.",
  "note": "Direction matters: the documented pipe-to-user path copies bytes, while the user-to-pipe path can retain references to user pages. The absent SPLICE_F_GIFT flag is not a promise that initial enqueue creates an independent byte snapshot. [vmsplice]\n\nIn the reviewed upstream v6.8 code, iter_to_pipe collects pages with or without GIFT; the donation check instead governs the page-stealing helper. The syscall imports the range description before dispatching to the selected direction. The v6.17 source has the same distinction; this is a source comparison, not measurement on that second kernel. [linux68] [linux617]\n\nHesela's ordered experiment on Linux 6.8.0-147-generic used flags=0: overwriting a source after enqueue changed the subsequent read, and partial consumption assembled half A and half B. Rebinding iovec did not redirect the queued bytes. Reverse vmsplice preserved the version copied at its read point. Forty-eight retained executions represent eight scenarios, three repetitions and two compiler settings on one kernel, not independent reliability samples. No GIFT case or performance test was run. [hesela-vmsplice]",
  "status": "shipping",
  "advantages": [],
  "limitations": [
    {
      "text": "SPLICE_F_GIFT imposes a no-modification obligation on donated pages and requires page-aligned memory and lengths; it is not a general buffer-reuse notification.",
      "citationIds": [
        "vmsplice"
      ]
    }
  ],
  "related": [
    "splice",
    "zero-copy",
    "tee-system-call",
    "sendfile"
  ],
  "supersedes": [],
  "supersededBy": [],
  "firstSeen": null,
  "lastSeen": null,
  "citations": [
    {
      "id": "vmsplice",
      "title": "Linux man-pages 6.19: vmsplice(2), directions, GIFT and NOTES",
      "url": "https://man7.org/linux/man-pages/man2/vmsplice.2.html",
      "accessed": "2026-11-10"
    },
    {
      "id": "linux68",
      "title": "Linux v6.8: iter_to_pipe, pipe_to_user and user_page_pipe_buf_try_steal",
      "url": "https://github.com/torvalds/linux/blob/e8f897f4afef0031fe618a8e94127a0934896aba/fs/splice.c",
      "accessed": "2026-11-10"
    },
    {
      "id": "linux617",
      "title": "Linux v6.17: vmsplice source-path comparison",
      "url": "https://github.com/torvalds/linux/blob/e5f0a698b34ed76002dc5cff3804a61c80233a7a/fs/splice.c",
      "accessed": "2026-11-10"
    },
    {
      "id": "hesela-vmsplice",
      "title": "Hesela: vmsplice direction and source ownership",
      "url": "https://hesela.com/analyses/zero-copy-source-lifetime/#vmsplice-direction",
      "accessed": "2026-11-10"
    }
  ],
  "updated": "2026-11-10",
  "provenance": [
    "Linux documentation and two pinned upstream implementations distinguish copying, page lifetime and donation. The native observation is scoped to one Ubuntu kernel, not a trace or rebuild of those upstream revisions.",
    "The retained experiment uses private anonymous mappings and pipes. No race, GIFT, hardware fault, persistence test or IO-Lite reproduction is claimed."
  ]
}
