Re: [PATCH 3/3] mm,page_owner: Filter out stacks by a threshold counter

From: Ammar Faizi
Date: Thu Sep 01 2022 - 04:32:11 EST


On 9/1/22 11:42 AM, Oscar Salvador wrote:> +static ssize_t read_page_owner_threshold(struct file *file, char __user *buf,
+ size_t count, loff_t *pos)
+{
+ char *kbuf;
+ int ret = 0;
+
+ count = min_t(size_t, count, PAGE_SIZE);
+
+ if (*pos >= count)
+ return 0;
+
+ kbuf = kmalloc(count, GFP_KERNEL);
+ if (!kbuf)
+ return ENOMEM;

Missing a negative sign, return -ENOMEM.

+ ret = scnprintf(kbuf, count, "%lu\n", threshold_count);
+ if (copy_to_user(buf, kbuf, ret))
+ ret = -EFAULT;
+
+ *pos += count;
+ kfree(kbuf);
+
+ return ret;
+}
+
+static ssize_t write_page_owner_threshold(struct file *file, const char __user *buf,
+ size_t count, loff_t *pos)
+{
+ char *kbuf;
+ int ret = 0;
+
+ count = min_t(size_t, count, PAGE_SIZE);
+ kbuf = kmalloc(count, GFP_KERNEL);

This looks overestimating to me. For unsigned long, on a 64-bit system
has max val 18446744073709551615 (20 chars).

You can use stack a allocated local variable with length 21. No need
to use kmalloc(). The same way with the read() op.

+ if (!kbuf)
+ return -ENOMEM;
+
+ if (copy_from_user(kbuf, buf, count)) {
+ ret = -EFAULT;
+ goto out;
+ }
+
+ kbuf[count - 1] = '\0';
+
+ ret = kstrtoul(kbuf, 10, &threshold_count);
+
+out:
+ kfree(kbuf);
+ return ret ? ret : count;
+}
+
+static const struct file_operations proc_page_owner_threshold = {
+ .read = read_page_owner_threshold,
+ .write = write_page_owner_threshold,
+};

--
Ammar Faizi