|
@@ -688,6 +688,13 @@ const struct file_operations proc_tid_smaps_operations = {
|
|
|
.release = seq_release_private,
|
|
|
};
|
|
|
|
|
|
+enum clear_refs_types {
|
|
|
+ CLEAR_REFS_ALL = 1,
|
|
|
+ CLEAR_REFS_ANON,
|
|
|
+ CLEAR_REFS_MAPPED,
|
|
|
+ CLEAR_REFS_LAST,
|
|
|
+};
|
|
|
+
|
|
|
static int clear_refs_pte_range(pmd_t *pmd, unsigned long addr,
|
|
|
unsigned long end, struct mm_walk *walk)
|
|
|
{
|
|
@@ -719,10 +726,6 @@ static int clear_refs_pte_range(pmd_t *pmd, unsigned long addr,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-#define CLEAR_REFS_ALL 1
|
|
|
-#define CLEAR_REFS_ANON 2
|
|
|
-#define CLEAR_REFS_MAPPED 3
|
|
|
-
|
|
|
static ssize_t clear_refs_write(struct file *file, const char __user *buf,
|
|
|
size_t count, loff_t *ppos)
|
|
|
{
|
|
@@ -730,7 +733,8 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf,
|
|
|
char buffer[PROC_NUMBUF];
|
|
|
struct mm_struct *mm;
|
|
|
struct vm_area_struct *vma;
|
|
|
- int type;
|
|
|
+ enum clear_refs_types type;
|
|
|
+ int itype;
|
|
|
int rv;
|
|
|
|
|
|
memset(buffer, 0, sizeof(buffer));
|
|
@@ -738,10 +742,11 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf,
|
|
|
count = sizeof(buffer) - 1;
|
|
|
if (copy_from_user(buffer, buf, count))
|
|
|
return -EFAULT;
|
|
|
- rv = kstrtoint(strstrip(buffer), 10, &type);
|
|
|
+ rv = kstrtoint(strstrip(buffer), 10, &itype);
|
|
|
if (rv < 0)
|
|
|
return rv;
|
|
|
- if (type < CLEAR_REFS_ALL || type > CLEAR_REFS_MAPPED)
|
|
|
+ type = (enum clear_refs_types)itype;
|
|
|
+ if (type < CLEAR_REFS_ALL || type >= CLEAR_REFS_LAST)
|
|
|
return -EINVAL;
|
|
|
task = get_proc_task(file_inode(file));
|
|
|
if (!task)
|