Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at master 92 lines 2.8 kB view raw
1/* SPDX-License-Identifier: MIT */ 2/* 3 * Copyright © 2025 Intel Corporation 4 */ 5 6#ifndef _DRM_PAGEMAP_UTIL_H_ 7#define _DRM_PAGEMAP_UTIL_H_ 8 9#include <linux/list.h> 10#include <linux/mutex.h> 11 12struct drm_device; 13struct drm_pagemap; 14struct drm_pagemap_cache; 15struct drm_pagemap_owner; 16struct drm_pagemap_shrinker; 17 18/** 19 * struct drm_pagemap_peer - Structure representing a fast interconnect peer 20 * @list: Pointer to a &struct drm_pagemap_owner_list used to keep track of peers 21 * @link: List link for @list's list of peers. 22 * @owner: Pointer to a &struct drm_pagemap_owner, common for a set of peers having 23 * fast interconnects. 24 * @private: Pointer private to the struct embedding this struct. 25 */ 26struct drm_pagemap_peer { 27 struct drm_pagemap_owner_list *list; 28 struct list_head link; 29 struct drm_pagemap_owner *owner; 30 void *private; 31}; 32 33/** 34 * struct drm_pagemap_owner_list - Keeping track of peers and owners 35 * @peer: List of peers. 36 * 37 * The owner list defines the scope where we identify peers having fast interconnects 38 * and a common owner. Typically a driver has a single global owner list to 39 * keep track of common owners for the driver's pagemaps. 40 */ 41struct drm_pagemap_owner_list { 42 /** @lock: Mutex protecting the @peers list. */ 43 struct mutex lock; 44 /** @peers: List of peers. */ 45 struct list_head peers; 46}; 47 48/* 49 * Convenience macro to define an owner list. 50 * Typically the owner list statically declared 51 * driver-wide. 52 */ 53#define DRM_PAGEMAP_OWNER_LIST_DEFINE(_name) \ 54 struct drm_pagemap_owner_list _name = { \ 55 .lock = __MUTEX_INITIALIZER((_name).lock), \ 56 .peers = LIST_HEAD_INIT((_name).peers) } 57 58void drm_pagemap_shrinker_add(struct drm_pagemap *dpagemap); 59 60int drm_pagemap_cache_lock_lookup(struct drm_pagemap_cache *cache); 61 62void drm_pagemap_cache_unlock_lookup(struct drm_pagemap_cache *cache); 63 64struct drm_pagemap_shrinker *drm_pagemap_shrinker_create_devm(struct drm_device *drm); 65 66struct drm_pagemap_cache *drm_pagemap_cache_create_devm(struct drm_pagemap_shrinker *shrinker); 67 68struct drm_pagemap *drm_pagemap_get_from_cache(struct drm_pagemap_cache *cache); 69 70void drm_pagemap_cache_set_pagemap(struct drm_pagemap_cache *cache, struct drm_pagemap *dpagemap); 71 72struct drm_pagemap *drm_pagemap_get_from_cache_if_active(struct drm_pagemap_cache *cache); 73 74#ifdef CONFIG_PROVE_LOCKING 75 76void drm_pagemap_shrinker_might_lock(struct drm_pagemap *dpagemap); 77 78#else 79 80static inline void drm_pagemap_shrinker_might_lock(struct drm_pagemap *dpagemap) 81{ 82} 83 84#endif /* CONFIG_PROVE_LOCKING */ 85 86void drm_pagemap_release_owner(struct drm_pagemap_peer *peer); 87 88int drm_pagemap_acquire_owner(struct drm_pagemap_peer *peer, 89 struct drm_pagemap_owner_list *owner_list, 90 bool (*has_interconnect)(struct drm_pagemap_peer *peer1, 91 struct drm_pagemap_peer *peer2)); 92#endif