All of lore.kernel.org
 help / color / mirror / Atom feed
* [radeon-alex:drm-next-5.2-wip 19/42] drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c:87:20: error: field 'mirror' has incomplete type
@ 2019-04-03 18:26 kbuild test robot
  0 siblings, 0 replies; only message in thread
From: kbuild test robot @ 2019-04-03 18:26 UTC (permalink / raw)
  To: Philip Yang
  Cc: Alex Deucher, Felix Kuehling, kbuild-all, dri-devel,
	Christian König

[-- Attachment #1: Type: text/plain, Size: 15270 bytes --]

tree:   git://people.freedesktop.org/~agd5f/linux.git drm-next-5.2-wip
head:   5666aea3ea494d4dd96df8f092cab32dbeeac321
commit: ba5896bd6a1a175b21609c6c81dea9813cbf296c [19/42] drm/amdgpu: use HMM callback to replace mmu notifier
config: xtensa-allyesconfig (attached as .config)
compiler: xtensa-linux-gcc (GCC) 8.1.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        git checkout ba5896bd6a1a175b21609c6c81dea9813cbf296c
        # save the attached .config to linux build tree
        GCC_VERSION=8.1.0 make.cross ARCH=xtensa 

Note: the radeon-alex/drm-next-5.2-wip HEAD 5666aea3ea494d4dd96df8f092cab32dbeeac321 builds fine.
      It only hurts bisectibility.

All error/warnings (new ones prefixed by >>):

>> drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c:87:20: error: field 'mirror' has incomplete type
     struct hmm_mirror mirror;
                       ^~~~~~
   drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c: In function 'amdgpu_mn_destroy':
>> drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c:131:2: error: implicit declaration of function 'hmm_mirror_unregister'; did you mean 'drm_dp_aux_unregister'? [-Werror=implicit-function-declaration]
     hmm_mirror_unregister(&amn->mirror);
     ^~~~~~~~~~~~~~~~~~~~~
     drm_dp_aux_unregister
   In file included from include/linux/firmware.h:6,
                    from drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c:46:
   drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c: In function 'amdgpu_hmm_mirror_release':
>> include/linux/kernel.h:979:32: error: dereferencing pointer to incomplete type 'struct hmm_mirror'
     BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
                                   ^~~~~~
   include/linux/compiler.h:324:9: note: in definition of macro '__compiletime_assert'
      if (!(condition))     \
            ^~~~~~~~~
   include/linux/compiler.h:344:2: note: in expansion of macro '_compiletime_assert'
     _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
     ^~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert'
    #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
                                        ^~~~~~~~~~~~~~~~~~
   include/linux/kernel.h:979:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
     BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
     ^~~~~~~~~~~~~~~~
   include/linux/kernel.h:979:20: note: in expansion of macro '__same_type'
     BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
                       ^~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c:144:26: note: in expansion of macro 'container_of'
     struct amdgpu_mn *amn = container_of(mirror, struct amdgpu_mn, mirror);
                             ^~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c: At top level:
>> drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c:238:17: warning: 'struct hmm_update' declared inside parameter list will not be visible outside of this definition or declaration
       const struct hmm_update *update)
                    ^~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c: In function 'amdgpu_mn_sync_pagetables_gfx':
>> drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c:241:30: error: dereferencing pointer to incomplete type 'const struct hmm_update'
     unsigned long start = update->start;
                                 ^~
   drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c: At top level:
   drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c:286:17: warning: 'struct hmm_update' declared inside parameter list will not be visible outside of this definition or declaration
       const struct hmm_update *update)
                    ^~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c: In function 'amdgpu_mn_sync_pagetables_hsa':
   drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c:289:30: error: dereferencing pointer to incomplete type 'const struct hmm_update'
     unsigned long start = update->start;
                                 ^~
   drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c: At top level:
>> drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c:333:30: error: array type has incomplete element type 'struct hmm_mirror_ops'
    static struct hmm_mirror_ops amdgpu_hmm_mirror_ops[] = {
                                 ^~~~~~~~~~~~~~~~~~~~~
>> drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c:334:3: error: array index in non-array initializer
     [AMDGPU_MN_TYPE_GFX] = {
      ^~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c:334:3: note: (near initialization for 'amdgpu_hmm_mirror_ops')
>> drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c:335:3: error: field name not in record or union initializer
      .sync_cpu_device_pagetables = amdgpu_mn_sync_pagetables_gfx,
      ^
   drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c:335:3: note: (near initialization for 'amdgpu_hmm_mirror_ops')
   drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c:336:3: error: field name not in record or union initializer
      .release = amdgpu_hmm_mirror_release
      ^
   drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c:336:3: note: (near initialization for 'amdgpu_hmm_mirror_ops')
   drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c:338:3: error: array index in non-array initializer
     [AMDGPU_MN_TYPE_HSA] = {
      ^~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c:338:3: note: (near initialization for 'amdgpu_hmm_mirror_ops')
   drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c:339:3: error: field name not in record or union initializer
      .sync_cpu_device_pagetables = amdgpu_mn_sync_pagetables_hsa,
      ^
   drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c:339:3: note: (near initialization for 'amdgpu_hmm_mirror_ops')
   drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c:340:3: error: field name not in record or union initializer
      .release = amdgpu_hmm_mirror_release
      ^
   drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c:340:3: note: (near initialization for 'amdgpu_hmm_mirror_ops')
   drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c: In function 'amdgpu_mn_get':
>> drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c:383:6: error: implicit declaration of function 'hmm_mirror_register'; did you mean 'drm_dp_aux_register'? [-Werror=implicit-function-declaration]
     r = hmm_mirror_register(&amn->mirror, mm);
         ^~~~~~~~~~~~~~~~~~~
         drm_dp_aux_register
   At top level:
   drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c:333:30: warning: 'amdgpu_hmm_mirror_ops' defined but not used [-Wunused-variable]
    static struct hmm_mirror_ops amdgpu_hmm_mirror_ops[] = {
                                 ^~~~~~~~~~~~~~~~~~~~~
   cc1: some warnings being treated as errors

vim +/mirror +87 drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c

    55	
    56	/**
    57	 * struct amdgpu_mn
    58	 *
    59	 * @adev: amdgpu device pointer
    60	 * @mm: process address space
    61	 * @type: type of MMU notifier
    62	 * @work: destruction work item
    63	 * @node: hash table node to find structure by adev and mn
    64	 * @lock: rw semaphore protecting the notifier nodes
    65	 * @objects: interval tree containing amdgpu_mn_nodes
    66	 * @mirror: HMM mirror function support
    67	 *
    68	 * Data for each amdgpu device and process address space.
    69	 */
    70	struct amdgpu_mn {
    71		/* constant after initialisation */
    72		struct amdgpu_device	*adev;
    73		struct mm_struct	*mm;
    74		enum amdgpu_mn_type	type;
    75	
    76		/* only used on destruction */
    77		struct work_struct	work;
    78	
    79		/* protected by adev->mn_lock */
    80		struct hlist_node	node;
    81	
    82		/* objects protected by lock */
    83		struct rw_semaphore	lock;
    84		struct rb_root_cached	objects;
    85	
    86		/* HMM mirror */
  > 87		struct hmm_mirror	mirror;
    88	};
    89	
    90	/**
    91	 * struct amdgpu_mn_node
    92	 *
    93	 * @it: interval node defining start-last of the affected address range
    94	 * @bos: list of all BOs in the affected address range
    95	 *
    96	 * Manages all BOs which are affected of a certain range of address space.
    97	 */
    98	struct amdgpu_mn_node {
    99		struct interval_tree_node	it;
   100		struct list_head		bos;
   101	};
   102	
   103	/**
   104	 * amdgpu_mn_destroy - destroy the HMM mirror
   105	 *
   106	 * @work: previously sheduled work item
   107	 *
   108	 * Lazy destroys the notifier from a work item
   109	 */
   110	static void amdgpu_mn_destroy(struct work_struct *work)
   111	{
   112		struct amdgpu_mn *amn = container_of(work, struct amdgpu_mn, work);
   113		struct amdgpu_device *adev = amn->adev;
   114		struct amdgpu_mn_node *node, *next_node;
   115		struct amdgpu_bo *bo, *next_bo;
   116	
   117		mutex_lock(&adev->mn_lock);
   118		down_write(&amn->lock);
   119		hash_del(&amn->node);
   120		rbtree_postorder_for_each_entry_safe(node, next_node,
   121						     &amn->objects.rb_root, it.rb) {
   122			list_for_each_entry_safe(bo, next_bo, &node->bos, mn_list) {
   123				bo->mn = NULL;
   124				list_del_init(&bo->mn_list);
   125			}
   126			kfree(node);
   127		}
   128		up_write(&amn->lock);
   129		mutex_unlock(&adev->mn_lock);
   130	
 > 131		hmm_mirror_unregister(&amn->mirror);
   132		kfree(amn);
   133	}
   134	
   135	/**
   136	 * amdgpu_hmm_mirror_release - callback to notify about mm destruction
   137	 *
   138	 * @mirror: the HMM mirror (mm) this callback is about
   139	 *
   140	 * Shedule a work item to lazy destroy HMM mirror.
   141	 */
   142	static void amdgpu_hmm_mirror_release(struct hmm_mirror *mirror)
   143	{
 > 144		struct amdgpu_mn *amn = container_of(mirror, struct amdgpu_mn, mirror);
   145	
   146		INIT_WORK(&amn->work, amdgpu_mn_destroy);
   147		schedule_work(&amn->work);
   148	}
   149	
   150	/**
   151	 * amdgpu_mn_lock - take the write side lock for this notifier
   152	 *
   153	 * @mn: our notifier
   154	 */
   155	void amdgpu_mn_lock(struct amdgpu_mn *mn)
   156	{
   157		if (mn)
   158			down_write(&mn->lock);
   159	}
   160	
   161	/**
   162	 * amdgpu_mn_unlock - drop the write side lock for this notifier
   163	 *
   164	 * @mn: our notifier
   165	 */
   166	void amdgpu_mn_unlock(struct amdgpu_mn *mn)
   167	{
   168		if (mn)
   169			up_write(&mn->lock);
   170	}
   171	
   172	/**
   173	 * amdgpu_mn_read_lock - take the read side lock for this notifier
   174	 *
   175	 * @amn: our notifier
   176	 */
   177	static int amdgpu_mn_read_lock(struct amdgpu_mn *amn, bool blockable)
   178	{
   179		if (blockable)
   180			down_read(&amn->lock);
   181		else if (!down_read_trylock(&amn->lock))
   182			return -EAGAIN;
   183	
   184		return 0;
   185	}
   186	
   187	/**
   188	 * amdgpu_mn_read_unlock - drop the read side lock for this notifier
   189	 *
   190	 * @amn: our notifier
   191	 */
   192	static void amdgpu_mn_read_unlock(struct amdgpu_mn *amn)
   193	{
   194		up_read(&amn->lock);
   195	}
   196	
   197	/**
   198	 * amdgpu_mn_invalidate_node - unmap all BOs of a node
   199	 *
   200	 * @node: the node with the BOs to unmap
   201	 * @start: start of address range affected
   202	 * @end: end of address range affected
   203	 *
   204	 * Block for operations on BOs to finish and mark pages as accessed and
   205	 * potentially dirty.
   206	 */
   207	static void amdgpu_mn_invalidate_node(struct amdgpu_mn_node *node,
   208					      unsigned long start,
   209					      unsigned long end)
   210	{
   211		struct amdgpu_bo *bo;
   212		long r;
   213	
   214		list_for_each_entry(bo, &node->bos, mn_list) {
   215	
   216			if (!amdgpu_ttm_tt_affect_userptr(bo->tbo.ttm, start, end))
   217				continue;
   218	
   219			r = reservation_object_wait_timeout_rcu(bo->tbo.resv,
   220				true, false, MAX_SCHEDULE_TIMEOUT);
   221			if (r <= 0)
   222				DRM_ERROR("(%ld) failed to wait for user bo\n", r);
   223	
   224			amdgpu_ttm_tt_mark_user_pages(bo->tbo.ttm);
   225		}
   226	}
   227	
   228	/**
   229	 * amdgpu_mn_sync_pagetables_gfx - callback to notify about mm change
   230	 *
   231	 * @mirror: the hmm_mirror (mm) is about to update
   232	 * @update: the update start, end address
   233	 *
   234	 * Block for operations on BOs to finish and mark pages as accessed and
   235	 * potentially dirty.
   236	 */
   237	static int amdgpu_mn_sync_pagetables_gfx(struct hmm_mirror *mirror,
 > 238				const struct hmm_update *update)
   239	{
   240		struct amdgpu_mn *amn = container_of(mirror, struct amdgpu_mn, mirror);
 > 241		unsigned long start = update->start;
   242		unsigned long end = update->end;
   243		bool blockable = update->blockable;
   244		struct interval_tree_node *it;
   245	
   246		/* notification is exclusive, but interval is inclusive */
   247		end -= 1;
   248	
   249		/* TODO we should be able to split locking for interval tree and
   250		 * amdgpu_mn_invalidate_node
   251		 */
   252		if (amdgpu_mn_read_lock(amn, blockable))
   253			return -EAGAIN;
   254	
   255		it = interval_tree_iter_first(&amn->objects, start, end);
   256		while (it) {
   257			struct amdgpu_mn_node *node;
   258	
   259			if (!blockable) {
   260				amdgpu_mn_read_unlock(amn);
   261				return -EAGAIN;
   262			}
   263	
   264			node = container_of(it, struct amdgpu_mn_node, it);
   265			it = interval_tree_iter_next(it, start, end);
   266	
   267			amdgpu_mn_invalidate_node(node, start, end);
   268		}
   269	
   270		amdgpu_mn_read_unlock(amn);
   271	
   272		return 0;
   273	}
   274	
   275	/**
   276	 * amdgpu_mn_sync_pagetables_hsa - callback to notify about mm change
   277	 *
   278	 * @mirror: the hmm_mirror (mm) is about to update
   279	 * @update: the update start, end address
   280	 *
   281	 * We temporarily evict all BOs between start and end. This
   282	 * necessitates evicting all user-mode queues of the process. The BOs
   283	 * are restorted in amdgpu_mn_invalidate_range_end_hsa.
   284	 */
   285	static int amdgpu_mn_sync_pagetables_hsa(struct hmm_mirror *mirror,
 > 286				const struct hmm_update *update)
   287	{
   288		struct amdgpu_mn *amn = container_of(mirror, struct amdgpu_mn, mirror);
   289		unsigned long start = update->start;
   290		unsigned long end = update->end;
   291		bool blockable = update->blockable;
   292		struct interval_tree_node *it;
   293	
   294		/* notification is exclusive, but interval is inclusive */
   295		end -= 1;
   296	
   297		if (amdgpu_mn_read_lock(amn, blockable))
   298			return -EAGAIN;
   299	
   300		it = interval_tree_iter_first(&amn->objects, start, end);
   301		while (it) {
   302			struct amdgpu_mn_node *node;
   303			struct amdgpu_bo *bo;
   304	
   305			if (!blockable) {
   306				amdgpu_mn_read_unlock(amn);
   307				return -EAGAIN;
   308			}
   309	
   310			node = container_of(it, struct amdgpu_mn_node, it);
   311			it = interval_tree_iter_next(it, start, end);
   312	
   313			list_for_each_entry(bo, &node->bos, mn_list) {
   314				struct kgd_mem *mem = bo->kfd_bo;
   315	
   316				if (amdgpu_ttm_tt_affect_userptr(bo->tbo.ttm,
   317								 start, end))
   318					amdgpu_amdkfd_evict_userptr(mem, amn->mm);
   319			}
   320		}
   321	
   322		amdgpu_mn_read_unlock(amn);
   323	
   324		return 0;
   325	}
   326	

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

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 56816 bytes --]

[-- Attachment #3: Type: text/plain, Size: 159 bytes --]

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

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2019-04-03 18:26 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-04-03 18:26 [radeon-alex:drm-next-5.2-wip 19/42] drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c:87:20: error: field 'mirror' has incomplete type kbuild test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.