Re: [PATCH] gpu: drm: omapdrm: Adding new typedef vm_fault_t

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Souptick,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on drm/drm-next]
[also build test WARNING on v4.17-rc6 next-20180517]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Souptick-Joarder/gpu-drm-omapdrm-Adding-new-typedef-vm_fault_t/20180522-135920
base:   git://people.freedesktop.org/~airlied/linux.git drm-next
config: arm-omap2plus_defconfig (attached as .config)
compiler: arm-linux-gnueabi-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=arm 

Note: it may well be a FALSE warning. FWIW you are at least aware of it now.
http://gcc.gnu.org/wiki/Better_Uninitialized_Warnings

All warnings (new ones prefixed by >>):

   drivers/gpu//drm/omapdrm/omap_gem.c: In function 'fault_2d':
   drivers/gpu//drm/omapdrm/omap_gem.c:480:9: error: implicit declaration of function 'vmf_error'; did you mean '__pmd_error'? [-Werror=implicit-function-declaration]
      ret = vmf_error(err);
            ^~~~~~~~~
            __pmd_error
>> drivers/gpu//drm/omapdrm/omap_gem.c:503:9: warning: 'ret' may be used uninitialized in this function [-Wmaybe-uninitialized]
     return ret;
            ^~~
   cc1: some warnings being treated as errors

vim +/ret +503 drivers/gpu//drm/omapdrm/omap_gem.c

   398	
   399	/* Special handling for the case of faulting in 2d tiled buffers */
   400	static vm_fault_t fault_2d(struct drm_gem_object *obj,
   401			struct vm_area_struct *vma, struct vm_fault *vmf)
   402	{
   403		struct omap_gem_object *omap_obj = to_omap_bo(obj);
   404		struct omap_drm_private *priv = obj->dev->dev_private;
   405		struct omap_drm_usergart_entry *entry;
   406		enum tiler_fmt fmt = gem2fmt(omap_obj->flags);
   407		struct page *pages[64];  /* XXX is this too much to have on stack? */
   408		unsigned long pfn;
   409		pgoff_t pgoff, base_pgoff;
   410		unsigned long vaddr;
   411		int i, err, slots;
   412		vm_fault_t ret;
   413	
   414		/*
   415		 * Note the height of the slot is also equal to the number of pages
   416		 * that need to be mapped in to fill 4kb wide CPU page.  If the slot
   417		 * height is 64, then 64 pages fill a 4kb wide by 64 row region.
   418		 */
   419		const int n = priv->usergart[fmt].height;
   420		const int n_shift = priv->usergart[fmt].height_shift;
   421	
   422		/*
   423		 * If buffer width in bytes > PAGE_SIZE then the virtual stride is
   424		 * rounded up to next multiple of PAGE_SIZE.. this need to be taken
   425		 * into account in some of the math, so figure out virtual stride
   426		 * in pages
   427		 */
   428		const int m = DIV_ROUND_UP(omap_obj->width << fmt, PAGE_SIZE);
   429	
   430		/* We don't use vmf->pgoff since that has the fake offset: */
   431		pgoff = (vmf->address - vma->vm_start) >> PAGE_SHIFT;
   432	
   433		/*
   434		 * Actual address we start mapping at is rounded down to previous slot
   435		 * boundary in the y direction:
   436		 */
   437		base_pgoff = round_down(pgoff, m << n_shift);
   438	
   439		/* figure out buffer width in slots */
   440		slots = omap_obj->width >> priv->usergart[fmt].slot_shift;
   441	
   442		vaddr = vmf->address - ((pgoff - base_pgoff) << PAGE_SHIFT);
   443	
   444		entry = &priv->usergart[fmt].entry[priv->usergart[fmt].last];
   445	
   446		/* evict previous buffer using this usergart entry, if any: */
   447		if (entry->obj)
   448			evict_entry(entry->obj, fmt, entry);
   449	
   450		entry->obj = obj;
   451		entry->obj_pgoff = base_pgoff;
   452	
   453		/* now convert base_pgoff to phys offset from virt offset: */
   454		base_pgoff = (base_pgoff >> n_shift) * slots;
   455	
   456		/* for wider-than 4k.. figure out which part of the slot-row we want: */
   457		if (m > 1) {
   458			int off = pgoff % m;
   459			entry->obj_pgoff += off;
   460			base_pgoff /= m;
   461			slots = min(slots - (off << n_shift), n);
   462			base_pgoff += off << n_shift;
   463			vaddr += off << PAGE_SHIFT;
   464		}
   465	
   466		/*
   467		 * Map in pages. Beyond the valid pixel part of the buffer, we set
   468		 * pages[i] to NULL to get a dummy page mapped in.. if someone
   469		 * reads/writes it they will get random/undefined content, but at
   470		 * least it won't be corrupting whatever other random page used to
   471		 * be mapped in, or other undefined behavior.
   472		 */
   473		memcpy(pages, &omap_obj->pages[base_pgoff],
   474				sizeof(struct page *) * slots);
   475		memset(pages + slots, 0,
   476				sizeof(struct page *) * (n - slots));
   477	
   478		err = tiler_pin(entry->block, pages, ARRAY_SIZE(pages), 0, true);
   479		if (err) {
 > 480			ret = vmf_error(err);
   481			dev_err(obj->dev->dev, "failed to pin: %d\n", err);
   482			return ret;
   483		}
   484	
   485		pfn = entry->dma_addr >> PAGE_SHIFT;
   486	
   487		VERB("Inserting %p pfn %lx, pa %lx", (void *)vmf->address,
   488				pfn, pfn << PAGE_SHIFT);
   489	
   490		for (i = n; i > 0; i--) {
   491			ret = vmf_insert_mixed(vma,
   492				vaddr, __pfn_to_pfn_t(pfn, PFN_DEV));
   493			if (ret & VM_FAULT_ERROR)
   494				break;
   495			pfn += priv->usergart[fmt].stride_pfn;
   496			vaddr += PAGE_SIZE * m;
   497		}
   498	
   499		/* simple round-robin: */
   500		priv->usergart[fmt].last = (priv->usergart[fmt].last + 1)
   501					 % NUM_USERGART_ENTRIES;
   502	
 > 503		return ret;
   504	}
   505	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

Attachment: .config.gz
Description: application/gzip

_______________________________________________
dri-devel mailing list
dri-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux