Since the allocation was being done throug memdup_user, the caller is wrongly traced as being strndup_user (the correct trace should report the caller of strndup_user). This is a common problem: in order to get accurate callsite tracing, a utils function can't allocate through another utils function, but instead do the allocation himself. Cc: Pekka Enberg <penberg@xxxxxxxxxx> Cc: Christoph Lameter <cl@xxxxxxxxx> Signed-off-by: Ezequiel Garcia <elezegarcia@xxxxxxxxx> --- I'm not sure this is the best solution, but creating another function to reuse between strndup_user and memdup_user seemed like an overkill. mm/util.c | 15 ++++++++++++--- 1 files changed, 12 insertions(+), 3 deletions(-) diff --git a/mm/util.c b/mm/util.c index dc3036c..87ff667 100644 --- a/mm/util.c +++ b/mm/util.c @@ -214,10 +214,19 @@ char *strndup_user(const char __user *s, long n) if (length > n) return ERR_PTR(-EINVAL); - p = memdup_user(s, length); + /* + * Always use GFP_KERNEL, since copy_from_user() can sleep and + * cause pagefault, which makes it pointless to use GFP_NOFS + * or GFP_ATOMIC. + */ + p = kmalloc_track_caller(length, GFP_KERNEL); + if (!p) + return ERR_PTR(-ENOMEM); - if (IS_ERR(p)) - return p; + if (copy_from_user(p, s, length)) { + kfree(p); + return ERR_PTR(-EFAULT); + } p[length - 1] = '\0'; -- 1.7.8.6 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>