[Intel-gfx] [PATCH 2/3] drm/vma_manage: Drop has_offset

kbuild test robot lkp at intel.com
Thu Oct 22 11:47:49 PDT 2015


Hi Daniel,

[auto build test WARNING on drm/drm-next -- if it's inappropriate base, please suggest rules for selecting the more suitable base]

url:    https://github.com/0day-ci/linux/commits/Daniel-Vetter/drm-Update-GEM-refcounting-docs/20151023-011317
config: x86_64-randconfig-s1-10230205 (attached as .config)
reproduce:
        # save the attached .config to linux build tree
        make ARCH=x86_64 

All warnings (new ones prefixed by >>):

   In file included from include/uapi/linux/stddef.h:1:0,
                    from include/linux/stddef.h:4,
                    from include/uapi/linux/posix_types.h:4,
                    from include/uapi/linux/types.h:13,
                    from include/linux/types.h:5,
                    from include/linux/list.h:4,
                    from include/linux/module.h:9,
                    from drivers/gpu/drm/vgem/vgem_drv.c:33:
   drivers/gpu/drm/vgem/vgem_drv.c: In function 'vgem_gem_dumb_map':
   drivers/gpu/drm/vgem/vgem_drv.c:211:7: error: implicit declaration of function 'drm_vma_node_has_offset' [-Werror=implicit-function-declaration]
     if (!drm_vma_node_has_offset(&obj->vma_node)) {
          ^
   include/linux/compiler.h:147:28: note: in definition of macro '__trace_if'
     if (__builtin_constant_p((cond)) ? !!(cond) :   \
                               ^
>> drivers/gpu/drm/vgem/vgem_drv.c:211:2: note: in expansion of macro 'if'
     if (!drm_vma_node_has_offset(&obj->vma_node)) {
     ^
   cc1: some warnings being treated as errors

vim +/if +211 drivers/gpu/drm/vgem/vgem_drv.c

502e95c6 Zach Reizner       2015-03-04   27  
502e95c6 Zach Reizner       2015-03-04   28  /**
502e95c6 Zach Reizner       2015-03-04   29   * This is vgem, a (non-hardware-backed) GEM service.  This is used by Mesa's
502e95c6 Zach Reizner       2015-03-04   30   * software renderer and the X server for efficient buffer sharing.
502e95c6 Zach Reizner       2015-03-04   31   */
502e95c6 Zach Reizner       2015-03-04   32  
502e95c6 Zach Reizner       2015-03-04  @33  #include <linux/module.h>
502e95c6 Zach Reizner       2015-03-04   34  #include <linux/ramfs.h>
502e95c6 Zach Reizner       2015-03-04   35  #include <linux/shmem_fs.h>
502e95c6 Zach Reizner       2015-03-04   36  #include <linux/dma-buf.h>
502e95c6 Zach Reizner       2015-03-04   37  #include "vgem_drv.h"
502e95c6 Zach Reizner       2015-03-04   38  
502e95c6 Zach Reizner       2015-03-04   39  #define DRIVER_NAME	"vgem"
502e95c6 Zach Reizner       2015-03-04   40  #define DRIVER_DESC	"Virtual GEM provider"
502e95c6 Zach Reizner       2015-03-04   41  #define DRIVER_DATE	"20120112"
502e95c6 Zach Reizner       2015-03-04   42  #define DRIVER_MAJOR	1
502e95c6 Zach Reizner       2015-03-04   43  #define DRIVER_MINOR	0
502e95c6 Zach Reizner       2015-03-04   44  
502e95c6 Zach Reizner       2015-03-04   45  void vgem_gem_put_pages(struct drm_vgem_gem_object *obj)
502e95c6 Zach Reizner       2015-03-04   46  {
502e95c6 Zach Reizner       2015-03-04   47  	drm_gem_put_pages(&obj->base, obj->pages, false, false);
502e95c6 Zach Reizner       2015-03-04   48  	obj->pages = NULL;
502e95c6 Zach Reizner       2015-03-04   49  }
502e95c6 Zach Reizner       2015-03-04   50  
502e95c6 Zach Reizner       2015-03-04   51  static void vgem_gem_free_object(struct drm_gem_object *obj)
502e95c6 Zach Reizner       2015-03-04   52  {
502e95c6 Zach Reizner       2015-03-04   53  	struct drm_vgem_gem_object *vgem_obj = to_vgem_bo(obj);
502e95c6 Zach Reizner       2015-03-04   54  
502e95c6 Zach Reizner       2015-03-04   55  	drm_gem_free_mmap_offset(obj);
502e95c6 Zach Reizner       2015-03-04   56  
502e95c6 Zach Reizner       2015-03-04   57  	if (vgem_obj->use_dma_buf && obj->dma_buf) {
502e95c6 Zach Reizner       2015-03-04   58  		dma_buf_put(obj->dma_buf);
502e95c6 Zach Reizner       2015-03-04   59  		obj->dma_buf = NULL;
502e95c6 Zach Reizner       2015-03-04   60  	}
502e95c6 Zach Reizner       2015-03-04   61  
502e95c6 Zach Reizner       2015-03-04   62  	drm_gem_object_release(obj);
502e95c6 Zach Reizner       2015-03-04   63  
502e95c6 Zach Reizner       2015-03-04   64  	if (vgem_obj->pages)
502e95c6 Zach Reizner       2015-03-04   65  		vgem_gem_put_pages(vgem_obj);
502e95c6 Zach Reizner       2015-03-04   66  
502e95c6 Zach Reizner       2015-03-04   67  	vgem_obj->pages = NULL;
502e95c6 Zach Reizner       2015-03-04   68  
502e95c6 Zach Reizner       2015-03-04   69  	kfree(vgem_obj);
502e95c6 Zach Reizner       2015-03-04   70  }
502e95c6 Zach Reizner       2015-03-04   71  
502e95c6 Zach Reizner       2015-03-04   72  int vgem_gem_get_pages(struct drm_vgem_gem_object *obj)
502e95c6 Zach Reizner       2015-03-04   73  {
502e95c6 Zach Reizner       2015-03-04   74  	struct page **pages;
502e95c6 Zach Reizner       2015-03-04   75  
502e95c6 Zach Reizner       2015-03-04   76  	if (obj->pages || obj->use_dma_buf)
502e95c6 Zach Reizner       2015-03-04   77  		return 0;
502e95c6 Zach Reizner       2015-03-04   78  
502e95c6 Zach Reizner       2015-03-04   79  	pages = drm_gem_get_pages(&obj->base);
502e95c6 Zach Reizner       2015-03-04   80  	if (IS_ERR(pages)) {
502e95c6 Zach Reizner       2015-03-04   81  		return PTR_ERR(pages);
502e95c6 Zach Reizner       2015-03-04   82  	}
502e95c6 Zach Reizner       2015-03-04   83  
502e95c6 Zach Reizner       2015-03-04   84  	obj->pages = pages;
502e95c6 Zach Reizner       2015-03-04   85  
502e95c6 Zach Reizner       2015-03-04   86  	return 0;
502e95c6 Zach Reizner       2015-03-04   87  }
502e95c6 Zach Reizner       2015-03-04   88  
502e95c6 Zach Reizner       2015-03-04   89  static int vgem_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
502e95c6 Zach Reizner       2015-03-04   90  {
502e95c6 Zach Reizner       2015-03-04   91  	struct drm_vgem_gem_object *obj = vma->vm_private_data;
502e95c6 Zach Reizner       2015-03-04   92  	struct drm_device *dev = obj->base.dev;
502e95c6 Zach Reizner       2015-03-04   93  	loff_t num_pages;
502e95c6 Zach Reizner       2015-03-04   94  	pgoff_t page_offset;
502e95c6 Zach Reizner       2015-03-04   95  	int ret;
502e95c6 Zach Reizner       2015-03-04   96  
502e95c6 Zach Reizner       2015-03-04   97  	/* We don't use vmf->pgoff since that has the fake offset */
502e95c6 Zach Reizner       2015-03-04   98  	page_offset = ((unsigned long)vmf->virtual_address - vma->vm_start) >>
502e95c6 Zach Reizner       2015-03-04   99  		PAGE_SHIFT;
502e95c6 Zach Reizner       2015-03-04  100  
502e95c6 Zach Reizner       2015-03-04  101  	num_pages = DIV_ROUND_UP(obj->base.size, PAGE_SIZE);
502e95c6 Zach Reizner       2015-03-04  102  
502e95c6 Zach Reizner       2015-03-04  103  	if (page_offset > num_pages)
502e95c6 Zach Reizner       2015-03-04  104  		return VM_FAULT_SIGBUS;
502e95c6 Zach Reizner       2015-03-04  105  
502e95c6 Zach Reizner       2015-03-04  106  	mutex_lock(&dev->struct_mutex);
502e95c6 Zach Reizner       2015-03-04  107  
502e95c6 Zach Reizner       2015-03-04  108  	ret = vm_insert_page(vma, (unsigned long)vmf->virtual_address,
502e95c6 Zach Reizner       2015-03-04  109  			     obj->pages[page_offset]);
502e95c6 Zach Reizner       2015-03-04  110  
502e95c6 Zach Reizner       2015-03-04  111  	mutex_unlock(&dev->struct_mutex);
502e95c6 Zach Reizner       2015-03-04  112  	switch (ret) {
502e95c6 Zach Reizner       2015-03-04  113  	case 0:
502e95c6 Zach Reizner       2015-03-04  114  		return VM_FAULT_NOPAGE;
502e95c6 Zach Reizner       2015-03-04  115  	case -ENOMEM:
502e95c6 Zach Reizner       2015-03-04  116  		return VM_FAULT_OOM;
502e95c6 Zach Reizner       2015-03-04  117  	case -EBUSY:
502e95c6 Zach Reizner       2015-03-04  118  		return VM_FAULT_RETRY;
502e95c6 Zach Reizner       2015-03-04  119  	case -EFAULT:
502e95c6 Zach Reizner       2015-03-04  120  	case -EINVAL:
502e95c6 Zach Reizner       2015-03-04  121  		return VM_FAULT_SIGBUS;
502e95c6 Zach Reizner       2015-03-04  122  	default:
502e95c6 Zach Reizner       2015-03-04  123  		WARN_ON(1);
502e95c6 Zach Reizner       2015-03-04  124  		return VM_FAULT_SIGBUS;
502e95c6 Zach Reizner       2015-03-04  125  	}
502e95c6 Zach Reizner       2015-03-04  126  }
502e95c6 Zach Reizner       2015-03-04  127  
7cbea8dc Kirill A. Shutemov 2015-09-09  128  static const struct vm_operations_struct vgem_gem_vm_ops = {
502e95c6 Zach Reizner       2015-03-04  129  	.fault = vgem_gem_fault,
502e95c6 Zach Reizner       2015-03-04  130  	.open = drm_gem_vm_open,
502e95c6 Zach Reizner       2015-03-04  131  	.close = drm_gem_vm_close,
502e95c6 Zach Reizner       2015-03-04  132  };
502e95c6 Zach Reizner       2015-03-04  133  
502e95c6 Zach Reizner       2015-03-04  134  /* ioctls */
502e95c6 Zach Reizner       2015-03-04  135  
502e95c6 Zach Reizner       2015-03-04  136  static struct drm_gem_object *vgem_gem_create(struct drm_device *dev,
502e95c6 Zach Reizner       2015-03-04  137  					      struct drm_file *file,
502e95c6 Zach Reizner       2015-03-04  138  					      unsigned int *handle,
502e95c6 Zach Reizner       2015-03-04  139  					      unsigned long size)
502e95c6 Zach Reizner       2015-03-04  140  {
502e95c6 Zach Reizner       2015-03-04  141  	struct drm_vgem_gem_object *obj;
502e95c6 Zach Reizner       2015-03-04  142  	struct drm_gem_object *gem_object;
502e95c6 Zach Reizner       2015-03-04  143  	int err;
502e95c6 Zach Reizner       2015-03-04  144  
502e95c6 Zach Reizner       2015-03-04  145  	size = roundup(size, PAGE_SIZE);
502e95c6 Zach Reizner       2015-03-04  146  
502e95c6 Zach Reizner       2015-03-04  147  	obj = kzalloc(sizeof(*obj), GFP_KERNEL);
502e95c6 Zach Reizner       2015-03-04  148  	if (!obj)
502e95c6 Zach Reizner       2015-03-04  149  		return ERR_PTR(-ENOMEM);
502e95c6 Zach Reizner       2015-03-04  150  
502e95c6 Zach Reizner       2015-03-04  151  	gem_object = &obj->base;
502e95c6 Zach Reizner       2015-03-04  152  
502e95c6 Zach Reizner       2015-03-04  153  	err = drm_gem_object_init(dev, gem_object, size);
502e95c6 Zach Reizner       2015-03-04  154  	if (err)
502e95c6 Zach Reizner       2015-03-04  155  		goto out;
502e95c6 Zach Reizner       2015-03-04  156  
502e95c6 Zach Reizner       2015-03-04  157  	err = drm_gem_handle_create(file, gem_object, handle);
502e95c6 Zach Reizner       2015-03-04  158  	if (err)
502e95c6 Zach Reizner       2015-03-04  159  		goto handle_out;
502e95c6 Zach Reizner       2015-03-04  160  
502e95c6 Zach Reizner       2015-03-04  161  	drm_gem_object_unreference_unlocked(gem_object);
502e95c6 Zach Reizner       2015-03-04  162  
502e95c6 Zach Reizner       2015-03-04  163  	return gem_object;
502e95c6 Zach Reizner       2015-03-04  164  
502e95c6 Zach Reizner       2015-03-04  165  handle_out:
502e95c6 Zach Reizner       2015-03-04  166  	drm_gem_object_release(gem_object);
502e95c6 Zach Reizner       2015-03-04  167  out:
502e95c6 Zach Reizner       2015-03-04  168  	kfree(obj);
502e95c6 Zach Reizner       2015-03-04  169  	return ERR_PTR(err);
502e95c6 Zach Reizner       2015-03-04  170  }
502e95c6 Zach Reizner       2015-03-04  171  
502e95c6 Zach Reizner       2015-03-04  172  static int vgem_gem_dumb_create(struct drm_file *file, struct drm_device *dev,
502e95c6 Zach Reizner       2015-03-04  173  				struct drm_mode_create_dumb *args)
502e95c6 Zach Reizner       2015-03-04  174  {
502e95c6 Zach Reizner       2015-03-04  175  	struct drm_gem_object *gem_object;
502e95c6 Zach Reizner       2015-03-04  176  	uint64_t size;
502e95c6 Zach Reizner       2015-03-04  177  	uint64_t pitch = args->width * DIV_ROUND_UP(args->bpp, 8);
502e95c6 Zach Reizner       2015-03-04  178  
502e95c6 Zach Reizner       2015-03-04  179  	size = args->height * pitch;
502e95c6 Zach Reizner       2015-03-04  180  	if (size == 0)
502e95c6 Zach Reizner       2015-03-04  181  		return -EINVAL;
502e95c6 Zach Reizner       2015-03-04  182  
502e95c6 Zach Reizner       2015-03-04  183  	gem_object = vgem_gem_create(dev, file, &args->handle, size);
502e95c6 Zach Reizner       2015-03-04  184  
502e95c6 Zach Reizner       2015-03-04  185  	if (IS_ERR(gem_object)) {
502e95c6 Zach Reizner       2015-03-04  186  		DRM_DEBUG_DRIVER("object creation failed\n");
502e95c6 Zach Reizner       2015-03-04  187  		return PTR_ERR(gem_object);
502e95c6 Zach Reizner       2015-03-04  188  	}
502e95c6 Zach Reizner       2015-03-04  189  
502e95c6 Zach Reizner       2015-03-04  190  	args->size = gem_object->size;
502e95c6 Zach Reizner       2015-03-04  191  	args->pitch = pitch;
502e95c6 Zach Reizner       2015-03-04  192  
502e95c6 Zach Reizner       2015-03-04  193  	DRM_DEBUG_DRIVER("Created object of size %lld\n", size);
502e95c6 Zach Reizner       2015-03-04  194  
502e95c6 Zach Reizner       2015-03-04  195  	return 0;
502e95c6 Zach Reizner       2015-03-04  196  }
502e95c6 Zach Reizner       2015-03-04  197  
502e95c6 Zach Reizner       2015-03-04  198  int vgem_gem_dumb_map(struct drm_file *file, struct drm_device *dev,
502e95c6 Zach Reizner       2015-03-04  199  		      uint32_t handle, uint64_t *offset)
502e95c6 Zach Reizner       2015-03-04  200  {
502e95c6 Zach Reizner       2015-03-04  201  	int ret = 0;
502e95c6 Zach Reizner       2015-03-04  202  	struct drm_gem_object *obj;
502e95c6 Zach Reizner       2015-03-04  203  
502e95c6 Zach Reizner       2015-03-04  204  	mutex_lock(&dev->struct_mutex);
502e95c6 Zach Reizner       2015-03-04  205  	obj = drm_gem_object_lookup(dev, file, handle);
502e95c6 Zach Reizner       2015-03-04  206  	if (!obj) {
502e95c6 Zach Reizner       2015-03-04  207  		ret = -ENOENT;
502e95c6 Zach Reizner       2015-03-04  208  		goto unlock;
502e95c6 Zach Reizner       2015-03-04  209  	}
502e95c6 Zach Reizner       2015-03-04  210  
502e95c6 Zach Reizner       2015-03-04 @211  	if (!drm_vma_node_has_offset(&obj->vma_node)) {
502e95c6 Zach Reizner       2015-03-04  212  		ret = drm_gem_create_mmap_offset(obj);
502e95c6 Zach Reizner       2015-03-04  213  		if (ret)
502e95c6 Zach Reizner       2015-03-04  214  			goto unref;

:::::: The code at line 211 was first introduced by commit
:::::: 502e95c6678505474f1056480310cd9382bacbac drm/vgem: implement virtual GEM

:::::: TO: Zach Reizner <zachr at google.com>
:::::: CC: Dave Airlie <airlied at redhat.com>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
-------------- next part --------------
A non-text attachment was scrubbed...
Name: .config.gz
Type: application/octet-stream
Size: 19274 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/intel-gfx/attachments/20151023/1726e093/attachment-0001.obj>


More information about the Intel-gfx mailing list