{
  "slug": "io-completion-polling",
  "term": "I/O completion polling",
  "aliases": [
    "Completion polling",
    "Poll-mode completion processing"
  ],
  "definition": "I/O completion polling checks for finished I/O requests in software instead of relying on an interrupt to initiate each completion check.",
  "note": "Polling need not mean waiting continuously for one request. SPDK's spdk_nvme_qpair_process_completions() handles ready completions and returns without waiting for outstanding commands to finish; a successful call can report zero completions. Applications can schedule further checks between other work [spdk-api].\n\nThat API requires one thread at a time to use a queue pair. Its max_completions argument limits the number of completions processed per call; zero means no such limit, not a request to wait until every outstanding command completes [spdk-api].\n\nPolling and interrupt-assisted operation are not universally exclusive. SPDK also documents interrupt-capable PCIe and RDMA queue pairs, restricted to its primary process; after wakeup, software must still process completions. Check the transport and configuration rather than assuming every SPDK deployment disables interrupts [spdk-interrupt].\n\nA lower interrupt count is not a complete performance result. Tai et al. compare completion policies using latency, throughput and CPU cost; their calibrated-interrupt prototype emulates device notification on dedicated cores while executing real SSD I/O. Its results do not establish a universal winner for production workloads [calibrated-interrupts].",
  "related": [
    "nvme",
    "nvme-completion-queue",
    "interrupt-coalescing"
  ],
  "citations": [
    {
      "id": "spdk-api",
      "title": "SPDK: spdk_nvme_qpair_process_completions API contract",
      "url": "https://spdk.io/doc/nvme_8h.html",
      "accessed": "2026-10-20"
    },
    {
      "id": "spdk-interrupt",
      "title": "SPDK: NVMe Interrupt Mode, supported transports and operational notes",
      "url": "https://spdk.io/doc/nvme_interrupt_mode.html",
      "accessed": "2026-10-20"
    },
    {
      "id": "calibrated-interrupts",
      "title": "Tai et al., Optimizing Storage Performance with Calibrated Interrupts, OSDI 2021, sections 2, 4.2.1 and 5.1",
      "url": "https://www.usenix.org/system/files/osdi21-tai.pdf",
      "accessed": "2026-10-23"
    }
  ],
  "status": "shipping",
  "advantages": [],
  "limitations": [],
  "supersedes": [],
  "supersededBy": [],
  "firstSeen": null,
  "lastSeen": null,
  "updated": "2026-10-23",
  "provenance": [
    "Definition concerns completion detection, not readiness polling, command submission or device health polling.",
    "SPDK documentation checked on 2026-10-20; support depends on the implementation, transport and configuration.",
    "No device benchmark, CPU-usage comparison or universal performance advantage is claimed."
  ]
}
