@@ -75,6 +75,7 @@ struct drm_gem_shmem_object *drm_gem_shmem_create(struct drm_device *dev, size_t
75
75
shmem = to_drm_gem_shmem_obj (obj );
76
76
mutex_init (& shmem -> pages_lock );
77
77
mutex_init (& shmem -> vmap_lock );
78
+ INIT_LIST_HEAD (& shmem -> madv_list );
78
79
79
80
/*
80
81
* Our buffers are kept pinned, so allocating them
@@ -362,6 +363,62 @@ drm_gem_shmem_create_with_handle(struct drm_file *file_priv,
362
363
}
363
364
EXPORT_SYMBOL (drm_gem_shmem_create_with_handle );
364
365
366
+ /* Update madvise status, returns true if not purged, else
367
+ * false or -errno.
368
+ */
369
+ int drm_gem_shmem_madvise (struct drm_gem_object * obj , int madv )
370
+ {
371
+ struct drm_gem_shmem_object * shmem = to_drm_gem_shmem_obj (obj );
372
+
373
+ mutex_lock (& shmem -> pages_lock );
374
+
375
+ if (shmem -> madv >= 0 )
376
+ shmem -> madv = madv ;
377
+
378
+ madv = shmem -> madv ;
379
+
380
+ mutex_unlock (& shmem -> pages_lock );
381
+
382
+ return (madv >= 0 );
383
+ }
384
+ EXPORT_SYMBOL (drm_gem_shmem_madvise );
385
+
386
+ void drm_gem_shmem_purge_locked (struct drm_gem_object * obj )
387
+ {
388
+ struct drm_device * dev = obj -> dev ;
389
+ struct drm_gem_shmem_object * shmem = to_drm_gem_shmem_obj (obj );
390
+
391
+ WARN_ON (!drm_gem_shmem_is_purgeable (shmem ));
392
+
393
+ drm_gem_shmem_put_pages_locked (shmem );
394
+
395
+ shmem -> madv = -1 ;
396
+
397
+ drm_vma_node_unmap (& obj -> vma_node , dev -> anon_inode -> i_mapping );
398
+ drm_gem_free_mmap_offset (obj );
399
+
400
+ /* Our goal here is to return as much of the memory as
401
+ * is possible back to the system as we are called from OOM.
402
+ * To do this we must instruct the shmfs to drop all of its
403
+ * backing pages, *now*.
404
+ */
405
+ shmem_truncate_range (file_inode (obj -> filp ), 0 , (loff_t )- 1 );
406
+
407
+ invalidate_mapping_pages (file_inode (obj -> filp )-> i_mapping ,
408
+ 0 , (loff_t )- 1 );
409
+ }
410
+ EXPORT_SYMBOL (drm_gem_shmem_purge_locked );
411
+
412
+ void drm_gem_shmem_purge (struct drm_gem_object * obj )
413
+ {
414
+ struct drm_gem_shmem_object * shmem = to_drm_gem_shmem_obj (obj );
415
+
416
+ mutex_lock (& shmem -> pages_lock );
417
+ drm_gem_shmem_purge_locked (obj );
418
+ mutex_unlock (& shmem -> pages_lock );
419
+ }
420
+ EXPORT_SYMBOL (drm_gem_shmem_purge );
421
+
365
422
/**
366
423
* drm_gem_shmem_dumb_create - Create a dumb shmem buffer object
367
424
* @file: DRM file structure to create the dumb buffer for
0 commit comments