|
@@ -105,6 +105,25 @@ void *memdup_user(const void __user *src, size_t len)
|
|
|
}
|
|
|
EXPORT_SYMBOL(memdup_user);
|
|
|
|
|
|
+static __always_inline void *__do_krealloc(const void *p, size_t new_size,
|
|
|
+ gfp_t flags)
|
|
|
+{
|
|
|
+ void *ret;
|
|
|
+ size_t ks = 0;
|
|
|
+
|
|
|
+ if (p)
|
|
|
+ ks = ksize(p);
|
|
|
+
|
|
|
+ if (ks >= new_size)
|
|
|
+ return (void *)p;
|
|
|
+
|
|
|
+ ret = kmalloc_track_caller(new_size, flags);
|
|
|
+ if (ret && p)
|
|
|
+ memcpy(ret, p, ks);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* __krealloc - like krealloc() but don't free @p.
|
|
|
* @p: object to reallocate memory for.
|
|
@@ -117,23 +136,11 @@ EXPORT_SYMBOL(memdup_user);
|
|
|
*/
|
|
|
void *__krealloc(const void *p, size_t new_size, gfp_t flags)
|
|
|
{
|
|
|
- void *ret;
|
|
|
- size_t ks = 0;
|
|
|
-
|
|
|
if (unlikely(!new_size))
|
|
|
return ZERO_SIZE_PTR;
|
|
|
|
|
|
- if (p)
|
|
|
- ks = ksize(p);
|
|
|
+ return __do_krealloc(p, new_size, flags);
|
|
|
|
|
|
- if (ks >= new_size)
|
|
|
- return (void *)p;
|
|
|
-
|
|
|
- ret = kmalloc_track_caller(new_size, flags);
|
|
|
- if (ret && p)
|
|
|
- memcpy(ret, p, ks);
|
|
|
-
|
|
|
- return ret;
|
|
|
}
|
|
|
EXPORT_SYMBOL(__krealloc);
|
|
|
|
|
@@ -157,7 +164,7 @@ void *krealloc(const void *p, size_t new_size, gfp_t flags)
|
|
|
return ZERO_SIZE_PTR;
|
|
|
}
|
|
|
|
|
|
- ret = __krealloc(p, new_size, flags);
|
|
|
+ ret = __do_krealloc(p, new_size, flags);
|
|
|
if (ret && p != ret)
|
|
|
kfree(p);
|
|
|
|