[Intel-gfx] [bug report] drm/i915/gvt: vGPU graphics memory virtualization

Dan Carpenter dan.carpenter at oracle.com
Thu Oct 20 13:01:12 UTC 2016


Hello Zhi Wang,

The patch 2707e4446688: "drm/i915/gvt: vGPU graphics memory
virtualization" from Mar 28, 2016, leads to the following static
checker warnings:

	drivers/gpu/drm/i915/gvt/gtt.c:1675 intel_vgpu_pin_mm()
	warn: 'mm->pincount.counter' not decremented on lines: 1670,1675.

	drivers/gpu/drm/i915/gvt/gtt.c:1932 intel_gvt_create_scratch_page()
	warn: signedness bug returning '(-12)'

drivers/gpu/drm/i915/gvt/gtt.c
  1647  /**
  1648   * intel_vgpu_pin_mm - increase the pin count of a vGPU mm object
  1649   * @vgpu: a vGPU
  1650   *
  1651   * This function is called when user wants to use a vGPU mm object. If this
  1652   * mm object hasn't been shadowed yet, the shadow will be populated at this
  1653   * time.
  1654   *
  1655   * Returns:
  1656   * Zero on success, negative error code if failed.
  1657   */
  1658  int intel_vgpu_pin_mm(struct intel_vgpu_mm *mm)
  1659  {
  1660          int ret;
  1661  
  1662          if (WARN_ON(mm->type != INTEL_GVT_MM_PPGTT))
  1663                  return 0;

Should this be "return -EINVAL;"?

  1664  
  1665          atomic_inc(&mm->pincount);
  1666  
  1667          if (!mm->shadowed) {
  1668                  ret = shadow_mm(mm);
  1669                  if (ret)
  1670                          return ret;

Should we decrement ->pincount before we return?  Or perhaps in
invalidate_mm()?

  1671          }
  1672  
  1673          list_del_init(&mm->lru_list);
  1674          list_add_tail(&mm->lru_list, &mm->vgpu->gvt->gtt.mm_lru_list_head);
  1675          return 0;
  1676  }

	[ snip ]

  1922  bool intel_gvt_create_scratch_page(struct intel_vgpu *vgpu)
        ^^^^
  1923  {
  1924          struct intel_vgpu_gtt *gtt = &vgpu->gtt;
  1925          void *p;
  1926          void *vaddr;
  1927          unsigned long mfn;
  1928  
  1929          gtt->scratch_page = alloc_page(GFP_KERNEL);
  1930          if (!gtt->scratch_page) {
  1931                  gvt_err("Failed to allocate scratch page.\n");
  1932                  return -ENOMEM;
                        ^^^^^^^^^^^^^^^
This means return true.

  1933          }
  1934  
  1935          /* set to zero */
  1936          p = kmap_atomic(gtt->scratch_page);
  1937          memset(p, 0, PAGE_SIZE);
  1938          kunmap_atomic(p);
  1939  
  1940          /* translate page to mfn */
  1941          vaddr = page_address(gtt->scratch_page);
  1942          mfn = intel_gvt_hypervisor_virt_to_mfn(vaddr);
  1943  
  1944          if (mfn == INTEL_GVT_INVALID_ADDR) {
  1945                  gvt_err("fail to translate vaddr:0x%llx\n", (u64)vaddr);
  1946                  __free_page(gtt->scratch_page);
  1947                  gtt->scratch_page = NULL;
  1948                  return -ENXIO;
                        ^^^^^^^^^^^^^
Same.  The caller doesn't care.  Maybe make this a void function?

  1949          }
  1950  
  1951          gtt->scratch_page_mfn = mfn;
  1952          gvt_dbg_core("vgpu%d create scratch page: mfn=0x%lx\n", vgpu->id, mfn);
  1953          return 0;
  1954  }

regards,
dan carpenter


More information about the Intel-gfx mailing list