|
@@ -3739,6 +3739,53 @@ void *__kmalloc(size_t size, gfp_t flags)
|
|
|
EXPORT_SYMBOL(__kmalloc);
|
|
|
#endif
|
|
|
|
|
|
+/**
|
|
|
+ * krealloc - reallocate memory. The contents will remain unchanged.
|
|
|
+ *
|
|
|
+ * @p: object to reallocate memory for.
|
|
|
+ * @new_size: how many bytes of memory are required.
|
|
|
+ * @flags: the type of memory to allocate.
|
|
|
+ *
|
|
|
+ * The contents of the object pointed to are preserved up to the
|
|
|
+ * lesser of the new and old sizes. If @p is %NULL, krealloc()
|
|
|
+ * behaves exactly like kmalloc(). If @size is 0 and @p is not a
|
|
|
+ * %NULL pointer, the object pointed to is freed.
|
|
|
+ */
|
|
|
+void *krealloc(const void *p, size_t new_size, gfp_t flags)
|
|
|
+{
|
|
|
+ struct kmem_cache *cache, *new_cache;
|
|
|
+ void *ret;
|
|
|
+
|
|
|
+ if (unlikely(!p))
|
|
|
+ return kmalloc_track_caller(new_size, flags);
|
|
|
+
|
|
|
+ if (unlikely(!new_size)) {
|
|
|
+ kfree(p);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ cache = virt_to_cache(p);
|
|
|
+ new_cache = __find_general_cachep(new_size, flags);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If new size fits in the current cache, bail out.
|
|
|
+ */
|
|
|
+ if (likely(cache == new_cache))
|
|
|
+ return (void *)p;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * We are on the slow-path here so do not use __cache_alloc
|
|
|
+ * because it bloats kernel text.
|
|
|
+ */
|
|
|
+ ret = kmalloc_track_caller(new_size, flags);
|
|
|
+ if (ret) {
|
|
|
+ memcpy(ret, p, min(new_size, ksize(p)));
|
|
|
+ kfree(p);
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(krealloc);
|
|
|
+
|
|
|
/**
|
|
|
* kmem_cache_free - Deallocate an object
|
|
|
* @cachep: The cache the allocation was from.
|
|
@@ -4481,7 +4528,7 @@ const struct seq_operations slabstats_op = {
|
|
|
* allocated with either kmalloc() or kmem_cache_alloc(). The object
|
|
|
* must not be freed during the duration of the call.
|
|
|
*/
|
|
|
-unsigned int ksize(const void *objp)
|
|
|
+size_t ksize(const void *objp)
|
|
|
{
|
|
|
if (unlikely(objp == NULL))
|
|
|
return 0;
|