ANDROID: ashmem_rust: Add support for retrieving an ashmem area's vmfile
Given a pointer to a file structure that represents an ashmem region, return the shmem vmfile that backs the region. This should only be used for dumping information about ashmem regions in debug scenarios. Bug: 193397560 Change-Id: I6ecd4ed0e02caac29a8bff9c52052066219a5a8c Signed-off-by: Isaac J. Manjarres <isaacmanjarres@google.com>
This commit is contained in:
committed by
Isaac Manjarres
parent
0be74214c0
commit
d893caf112
@@ -34,5 +34,6 @@ enum {
|
|||||||
bool is_ashmem_file(struct file *file);
|
bool is_ashmem_file(struct file *file);
|
||||||
int ashmem_area_name(struct file *file, char *name);
|
int ashmem_area_name(struct file *file, char *name);
|
||||||
long ashmem_area_size(struct file *file);
|
long ashmem_area_size(struct file *file);
|
||||||
|
struct file *ashmem_area_vmfile(struct file *file);
|
||||||
|
|
||||||
#endif /* _LINUX_ASHMEM_H */
|
#endif /* _LINUX_ASHMEM_H */
|
||||||
|
|||||||
@@ -724,3 +724,31 @@ unsafe extern "C" fn ashmem_area_size(file: *mut bindings::file) -> isize {
|
|||||||
Err(_err) => 0,
|
Err(_err) => 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// # Safety
|
||||||
|
///
|
||||||
|
/// The caller must ensure that `file` is valid for the duration of this function.
|
||||||
|
///
|
||||||
|
/// If this function returns a non-NULL pointer to a file structure, the refcount for that
|
||||||
|
/// file will be incremented by 1. It is the caller's responsibility to decrement the refcount
|
||||||
|
/// when the file is no longer needed.
|
||||||
|
#[no_mangle]
|
||||||
|
unsafe extern "C" fn ashmem_area_vmfile(file: *mut bindings::file) -> *mut bindings::file {
|
||||||
|
// SAFETY: file is valid for the duration of this function.
|
||||||
|
let ashmem = match unsafe { get_ashmem_area(file) } {
|
||||||
|
Ok(area) => area,
|
||||||
|
Err(_err) => return null_mut(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let asma = &mut *ashmem.inner.lock();
|
||||||
|
match asma.file.as_ref() {
|
||||||
|
Some(shmem_file) => {
|
||||||
|
let shmem_file_ptr = shmem_file.file().as_ptr();
|
||||||
|
// SAFETY: file is valid for the duration of the function, which means shmem file is
|
||||||
|
// also valid at this point.
|
||||||
|
unsafe { bindings::get_file(shmem_file_ptr) };
|
||||||
|
shmem_file_ptr
|
||||||
|
}
|
||||||
|
None => null_mut(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -19,3 +19,4 @@
|
|||||||
EXPORT_SYMBOL_GPL(is_ashmem_file);
|
EXPORT_SYMBOL_GPL(is_ashmem_file);
|
||||||
EXPORT_SYMBOL_GPL(ashmem_area_name);
|
EXPORT_SYMBOL_GPL(ashmem_area_name);
|
||||||
EXPORT_SYMBOL_GPL(ashmem_area_size);
|
EXPORT_SYMBOL_GPL(ashmem_area_size);
|
||||||
|
EXPORT_SYMBOL_GPL(ashmem_area_vmfile);
|
||||||
|
|||||||
Reference in New Issue
Block a user