{"record":{"id":"76b2e8bee876cdbd","repo":"jax-ml/jax","slug":"dma-start-priority-must-be-non-negative-priority","errorCode":null,"errorMessage":"DMA start priority must be non-negative: {priority}","messagePattern":"DMA start priority must be non-negative: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"jax/_src/pallas/mosaic/primitives.py","lineNumber":348,"sourceCode":"    if jax_core.typeof(_get_ref(src_sem)).is_high:\n      raise NotImplementedError(\"dma_start not implemented in LoJAX yet.\")\n  src_ref_aval.inner_aval.dma_start(\n      src_ref,\n      dst_ref,\n      src_sem,\n      dst_sem,\n      device_id=device_id,\n      priority=priority,\n      device_id_type=device_id_type,\n      add=add,\n  )\n  return []\ndma_start_p.to_lojax = _dma_start_to_lojax\n\n@dma_start_p.def_effectful_abstract_eval\ndef _dma_start_abstract_eval(*args, tree, device_id_type, priority, add):\n  if priority < 0:\n    raise ValueError(f\"DMA start priority must be non-negative: {priority}\")\n  src_ref_aval, dst_ref_aval, dst_sem_aval, src_sem_aval, device_id_aval = (\n      _dma_unflatten(tree, args)\n  )\n  if not all(\n      isinstance(x, (state.AbstractRef, state.TransformedRef))\n      for x in [src_ref_aval, dst_ref_aval, dst_sem_aval]\n  ):\n    raise ValueError(\n        \"DMA source/destination/semaphore arguments must be Refs.\")\n  dst_sem_shape = dst_sem_aval.shape\n  if dst_sem_shape:\n    raise ValueError(\n        f\"Cannot signal on a non-()-shaped semaphore: {dst_sem_shape}\"\n    )\n  if src_sem_aval is not None:\n    if not isinstance(src_sem_aval, (state.AbstractRef, state.TransformedRef)):\n      raise ValueError(\"DMA source semaphore must be a Ref.\")\n    src_sem_shape = src_sem_aval.shape","sourceCodeStart":330,"sourceCodeEnd":366,"githubUrl":"https://github.com/jax-ml/jax/blob/1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb/jax/_src/pallas/mosaic/primitives.py#L330-L366","documentation":"dma_start accepts a priority used to order concurrent DMA operations on TPU hardware; the abstract eval validates that priority is a non-negative integer since negative priorities have no hardware meaning and would corrupt queue ordering.","triggerScenarios":"dma_start(..., priority=k) with k < 0 — e.g. priority derived from a subtraction, a config default of -1, or an inverted priority convention.","commonSituations":"Porting code where lower number meant higher priority (so 0, -1, -2 were used); exposing priority as a user knob without clamping; default sentinel -1 leaking into the call.","solutions":["Use non-negative priorities, remapping 'highest priority' to 0 and increasing numbers for lower priority","Clamp/validate priority >= 0 before the call","Replace -1 sentinel defaults with 0 or None"],"exampleFix":"# before\ndma_start(src, dst, sem, priority=-1)\n\n# after\n# invert convention: most urgent = 0\ndma_start(src, dst, sem, priority=max(0, -priority))","handlingStrategy":"validation","validationCode":"priority = max(0, priority)\nassert priority >= 0, f\"DMA priority must be >= 0, got {priority}\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Remap 'most urgent' to 0, never negative","Validate exposed priority knobs before they reach dma_start"],"tags":["jax","pallas","mosaic","dma","priority","argument-validation"],"backgroundTag":"negative-priority-not-allowed","analyzedSha":"1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb","analyzedAt":"2026-08-27T09:53:25.647Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}