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