{"record":{"id":"69da0d563d207315","repo":"sgl-project/sglang","slug":"mapping-offset-offset-size-is-outside-res","errorCode":null,"errorMessage":"mapping [{offset}, {offset + size}) is outside reservation [0, {self.size})","messagePattern":"mapping \\[(.+?), (.+?)\\) is outside reservation \\[0, (.+?)\\)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/utils/cuda_vmm_utils.py","lineNumber":542,"sourceCode":"                \"cuMemAddressReserve(local)\",\n            )\n        )\n        self._mappings = []\n        self._closed = False\n\n    def map(\n        self,\n        offset: int,\n        size: int,\n        *,\n        retain_handle: bool,\n    ):\n        \"\"\"Create and map local memory at ``base + offset``.\"\"\"\n        if self._closed:\n            raise RuntimeError(\"VmmReservation.map after close\")\n        offset, size = int(offset), int(size)\n        if offset < 0 or size <= 0 or offset + size > self.size:\n            raise ValueError(\n                f\"mapping [{offset}, {offset + size}) is outside reservation \"\n                f\"[0, {self.size})\"\n            )\n\n        drv = _get_cuda_driver()\n        address = self.base + offset\n        handle = check_drv(drv.cuMemCreate(size, self._prop, 0), \"cuMemCreate(local)\")\n        mapped = False\n        try:\n            check_drv(\n                drv.cuMemMap(address, size, 0, handle, 0),\n                \"cuMemMap(local)\",\n            )\n            mapped = True\n            check_drv(\n                drv.cuMemSetAccess(\n                    address,\n                    size,","sourceCodeStart":524,"sourceCodeEnd":560,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/utils/cuda_vmm_utils.py#L524-L560","documentation":"VmmReservation.map validates that [offset, offset+size) lies fully inside the reserved virtual range [0, self.size); any out-of-range mapping request is rejected because the CUDA driver can only map physical pages into an existing VA reservation.","triggerScenarios":"Calling VmmReservation.map(offset, size) with negative offset, size <= 0, or offset + size > self.size (the reservation's total byte size).","commonSituations":"Size math bugs when computing chunk offsets (e.g. using element count instead of bytes), assuming a bigger reservation than was created, or off-by-one page rounding when aligning offsets to 2MB granularity.","solutions":["Verify the reservation size at creation and assert offset + size <= reservation.size before mapping.","Check unit consistency: ensure offsets/sizes are bytes, not elements/pages.","Round sizes up to the mapping granularity and re-check against reservation size."],"exampleFix":"// before\nres.map(offset=chunk_idx * chunk_elems, size=chunk_elems)\n\n// after\noff = chunk_idx * chunk_bytes\nassert off + chunk_bytes <= res.size, f\"{off}+{chunk_bytes} > {res.size}\"\nres.map(offset=off, size=chunk_bytes)","handlingStrategy":"validation","validationCode":"def check_map(res, offset, size):\n    assert 0 <= offset and size > 0 and offset + size <= res.size, \\\n        f\"map [{offset},{offset+size}) outside [0,{res.size})\"","typeGuard":null,"tryCatchPattern":"try:\n    res.map(offset, size)\nexcept ValueError:\n    # recompute offsets from res.size and retry once\n    raise","preventionTips":["Derive all offsets from reservation.size, never from an assumed constant","Keep byte-vs-element units explicit in variable names"],"tags":["cuda","vmm","offset-out-of-range","validation"],"backgroundTag":"index-out-of-bounds","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}