madv
int drm_gem_shmem_madvise_locked(struct drm_gem_shmem_object *shmem, int madv)
if (shmem->madv >= 0)
shmem->madv = madv;
madv = shmem->madv;
return (madv >= 0);
shmem->madv = -1;
shmem->madv < 0) {
int drm_gem_shmem_madvise(struct drm_gem_shmem_object *shmem, int madv)
ret = drm_gem_shmem_madvise_locked(shmem, madv);
obj->mm.madv = I915_MADV_WILLNEED;
GEM_BUG_ON(obj->mm.madv != I915_MADV_WILLNEED);
GEM_BUG_ON(obj->mm.madv != I915_MADV_WILLNEED);
unsigned int madv:2;
if (unlikely(obj->mm.madv != I915_MADV_WILLNEED)) {
obj->mm.madv = I915_MADV_WILLNEED;
obj->mm.madv = I915_MADV_DONTNEED;
if (obj->mm.madv != I915_MADV_WILLNEED)
if (obj->mm.madv == I915_MADV_WILLNEED)
if (obj->mm.madv != I915_MADV_WILLNEED)
if (unlikely(obj->mm.madv != I915_MADV_WILLNEED)) {
obj->mm.madv = __I915_MADV_PURGED;
switch (obj->mm.madv) {
GEM_BUG_ON(obj->mm.madv == __I915_MADV_PURGED);
if (obj->mm.madv == I915_MADV_DONTNEED)
obj->mm.dirty, obj->mm.madv == I915_MADV_WILLNEED);
if (obj->mm.madv != I915_MADV_WILLNEED)
return swap_available() || obj->mm.madv == I915_MADV_DONTNEED;
obj->mm.madv == I915_MADV_WILLNEED &&
if (obj->mm.madv != I915_MADV_WILLNEED) {
if (obj->mm.madv == __I915_MADV_PURGED)
obj->mm.madv = __I915_MADV_PURGED;
switch (obj->mm.madv) {
WARN_ON_ONCE(obj->mm.madv == I915_MADV_WILLNEED);
if (!ret && obj->mm.madv != I915_MADV_WILLNEED)
if (obj->mm.madv == I915_MADV_WILLNEED)
} else if (obj->mm.madv != I915_MADV_WILLNEED) {
if (obj->mm.madv != I915_MADV_WILLNEED) {
obj->mm.madv == I915_MADV_DONTNEED ? " purgeable" : "");
obj->mm.madv == I915_MADV_DONTNEED)
switch (args->madv) {
if (obj->mm.madv == I915_MADV_WILLNEED) {
if (args->madv == I915_MADV_WILLNEED) {
if (obj->mm.madv != __I915_MADV_PURGED) {
obj->mm.madv = args->madv;
if (obj->mm.madv != I915_MADV_WILLNEED)
if (obj->mm.madv == I915_MADV_DONTNEED &&
args->retained = obj->mm.madv != __I915_MADV_PURGED;
switch (args->madv) {
ret = msm_gem_madvise(obj, args->madv);
if (msm_obj->madv == MSM_MADV_DONTNEED)
msm_obj->madv = MSM_MADV_WILLNEED;
} else if (msm_obj->madv == MSM_MADV_WILLNEED) {
GEM_WARN_ON(msm_obj->madv != MSM_MADV_DONTNEED);
struct page **msm_gem_get_pages_locked(struct drm_gem_object *obj, unsigned madv)
if (msm_obj->madv > madv) {
msm_obj->madv, madv);
if (GEM_WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED)) {
static void *get_vaddr(struct drm_gem_object *obj, unsigned madv)
pages = msm_gem_get_pages_locked(obj, madv);
int msm_gem_madvise(struct drm_gem_object *obj, unsigned madv)
if (msm_obj->madv != __MSM_MADV_PURGED)
msm_obj->madv = madv;
madv = msm_obj->madv;
return (madv != __MSM_MADV_PURGED);
msm_obj->madv = __MSM_MADV_PURGED;
const char *madv;
switch (msm_obj->madv) {
madv = " purged";
madv = " purgeable";
madv = "";
seq_printf(m, " %08zu %9s %-32s\n", obj->size, madv, msm_obj->name);
uint8_t madv;
struct page **msm_gem_get_pages_locked(struct drm_gem_object *obj, unsigned madv);
int msm_gem_madvise(struct drm_gem_object *obj, unsigned madv);
return (msm_obj->madv == MSM_MADV_DONTNEED) && msm_obj->sgt &&
if (args->madv == PANFROST_MADV_DONTNEED) {
args->retained = drm_gem_shmem_madvise_locked(&bo->base, args->madv);
if (args->madv == PANFROST_MADV_DONTNEED)
else if (args->madv == PANFROST_MADV_WILLNEED)
WARN_ON(bo->base.madv != PANFROST_MADV_WILLNEED);
if (bo->base.madv == PANFROST_MADV_DONTNEED)
if (bo->base.madv < 0)
else if (bo->base.madv > 0)
if (bo->base.madv > 0)
if (bo->base.madv > 0)
KUNIT_ASSERT_EQ(test, shmem->madv, 0);
KUNIT_ASSERT_EQ(test, shmem->madv, 1);
KUNIT_ASSERT_EQ(test, shmem->madv, -1);
KUNIT_ASSERT_EQ(test, shmem->madv, -1);
KUNIT_EXPECT_EQ(test, shmem->madv, -1);
WARN_ON(bo->madv != VC4_MADV_DONTNEED);
bo->madv = __VC4_MADV_PURGED;
if (bo->madv == VC4_MADV_DONTNEED &&
bo->madv = VC4_MADV_WILLNEED;
bo->madv = __VC4_MADV_NOTSUPP;
bo->madv = VC4_MADV_WILLNEED;
if (bo->madv == VC4_MADV_DONTNEED && !refcount_read(&bo->usecnt))
bo->madv = __VC4_MADV_NOTSUPP;
switch (bo->madv) {
bo->madv == VC4_MADV_DONTNEED)
WARN_ON(bo->madv != __VC4_MADV_PURGED);
if (bo->madv != VC4_MADV_WILLNEED) {
bo->madv == VC4_MADV_DONTNEED ?
bo->madv = VC4_MADV_WILLNEED;
bo->madv = VC4_MADV_WILLNEED;
u32 madv;
switch (args->madv) {
if (bo->madv == __VC4_MADV_NOTSUPP) {
if (args->madv == VC4_MADV_DONTNEED && bo->madv == VC4_MADV_WILLNEED &&
} else if (args->madv == VC4_MADV_WILLNEED &&
bo->madv == VC4_MADV_DONTNEED &&
args->retained = bo->madv != __VC4_MADV_PURGED;
if (bo->madv != __VC4_MADV_PURGED)
bo->madv = args->madv;
if (bo->madv == __VC4_MADV_NOTSUPP)
if (!WARN_ON(bo->madv == __VC4_MADV_PURGED))
bo->madv = VC4_MADV_WILLNEED;
int drm_gem_shmem_madvise_locked(struct drm_gem_shmem_object *shmem, int madv);
return (shmem->madv > 0) &&
int drm_gem_shmem_madvise(struct drm_gem_shmem_object *shmem, int madv);
int madv;
__u32 madv;
__u32 madv; /* in, MSM_MADV_x */
__u32 madv; /* in, PANFROST_MADV_x */
__u32 madv;
__u32 madv;
pthread_create(&thread1, NULL, madv, NULL);
pthread_create(&thread1, NULL, madv, NULL);