On Sat, Aug 02, 2025 at 06:12:56AM -0700, Rob Clark wrote: > On Sat, Aug 2, 2025 at 12:49 AM Dan Carpenter <dan.carpen...@linaro.org> > wrote: > > > > Hello Rob Clark, > > > > Commit 2e6a8a1fe2b2 ("drm/msm: Add VM_BIND ioctl") from Jun 29, 2025 > > (linux-next), leads to the following Smatch static checker warning: > > > > drivers/gpu/drm/msm/msm_gem_vma.c:596 msm_gem_vm_sm_step_remap() > > error: we previously assumed 'vm_bo' could be null (see line 564) > > > > drivers/gpu/drm/msm/msm_gem_vma.c > > 521 static int > > 522 msm_gem_vm_sm_step_remap(struct drm_gpuva_op *op, void *arg) > > 523 { > > 524 struct msm_vm_bind_job *job = ((struct op_arg *)arg)->job; > > 525 struct drm_gpuvm *vm = job->vm; > > 526 struct drm_gpuva *orig_vma = op->remap.unmap->va; > > 527 struct drm_gpuva *prev_vma = NULL, *next_vma = NULL; > > 528 struct drm_gpuvm_bo *vm_bo = orig_vma->vm_bo; > > 529 bool mapped = to_msm_vma(orig_vma)->mapped; > > 530 unsigned flags; > > 531 > > 532 vm_dbg("orig_vma: %p:%p:%p: %016llx %016llx", vm, orig_vma, > > 533 orig_vma->gem.obj, orig_vma->va.addr, > > orig_vma->va.range); > > 534 > > 535 if (mapped) { > > 536 uint64_t unmap_start, unmap_range; > > 537 > > 538 drm_gpuva_op_remap_to_unmap_range(&op->remap, > > &unmap_start, &unmap_range); > > 539 > > 540 vm_op_enqueue(arg, (struct msm_vm_op){ > > 541 .op = MSM_VM_OP_UNMAP, > > 542 .unmap = { > > 543 .iova = unmap_start, > > 544 .range = unmap_range, > > 545 .queue_id = job->queue->id, > > 546 }, > > 547 .obj = orig_vma->gem.obj, > > 548 }); > > 549 > > 550 /* > > 551 * Part of this GEM obj is still mapped, but we're > > going to kill the > > 552 * existing VMA and replace it with one or two new > > ones (ie. two if > > 553 * the unmapped range is in the middle of the > > existing (unmap) VMA). > > 554 * So just set the state to unmapped: > > 555 */ > > 556 to_msm_vma(orig_vma)->mapped = false; > > 557 } > > 558 > > 559 /* > > 560 * Hold a ref to the vm_bo between the msm_gem_vma_close() > > and the > > 561 * creation of the new prev/next vma's, in case the vm_bo > > is tracked > > 562 * in the VM's evict list: > > 563 */ > > 564 if (vm_bo) > > ^^^^^^^^^^ > > NULL check > > > > 565 drm_gpuvm_bo_get(vm_bo); > > 566 > > 567 /* > > 568 * The prev_vma and/or next_vma are replacing the unmapped > > vma, and > > 569 * therefore should preserve it's flags: > > 570 */ > > 571 flags = orig_vma->flags; > > 572 > > 573 msm_gem_vma_close(orig_vma); > > 574 > > 575 if (op->remap.prev) { > > 576 prev_vma = vma_from_op(arg, op->remap.prev); > > 577 if (WARN_ON(IS_ERR(prev_vma))) > > 578 return PTR_ERR(prev_vma); > > 579 > > 580 vm_dbg("prev_vma: %p:%p: %016llx %016llx", vm, > > prev_vma, prev_vma->va.addr, prev_vma->va.range); > > 581 to_msm_vma(prev_vma)->mapped = mapped; > > 582 prev_vma->flags = flags; > > 583 } > > 584 > > 585 if (op->remap.next) { > > 586 next_vma = vma_from_op(arg, op->remap.next); > > 587 if (WARN_ON(IS_ERR(next_vma))) > > 588 return PTR_ERR(next_vma); > > 589 > > 590 vm_dbg("next_vma: %p:%p: %016llx %016llx", vm, > > next_vma, next_vma->va.addr, next_vma->va.range); > > 591 to_msm_vma(next_vma)->mapped = mapped; > > 592 next_vma->flags = flags; > > 593 } > > 594 > > 595 if (!mapped) > > --> 596 drm_gpuvm_bo_evict(vm_bo, true); > > ^^^^^ > > Unchecked dereference. Possibly if we're not mapped then it's non-NULL? > > If so then just ignore this warning. > > Correct, the !mapped case will only happen when the shrinker evicts > BOs. The case where the BO (and therefore vm_bo) is NULL, is MAP_NULL > mappings which are backed by the PRR page, not a BO that can be > evicted. > > Would adding a WARN_ON(!vm_bo) convey to smatch that this case should > not happen unless something somewhere else was rather screwed up?
No. WARN_ON() doesn't mean something can't happen. Just ignore it. Old warnings are always false positives and if people have questions they can find this thread on lore. regards, dan carpenter