mirror of
https://github.com/torvalds/linux.git
synced 2026-10-07 05:31:08 -04:00
There are many code paths opencoding kvmalloc. Let's use the helper instead. The main difference to kvmalloc is that those users are usually not considering all the aspects of the memory allocator. E.g. allocation requests <= 32kB (with 4kB pages) are basically never failing and invoke OOM killer to satisfy the allocation. This sounds too disruptive for something that has a reasonable fallback - the vmalloc. On the other hand those requests might fallback to vmalloc even when the memory allocator would succeed after several more reclaim/compaction attempts previously. There is no guarantee something like that happens though. This patch converts many of those places to kv[mz]alloc* helpers because they are more conservative. Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Michal Hocko <[email protected]> Reviewed-by: Boris Ostrovsky <[email protected]> # Xen bits Acked-by: Kees Cook <[email protected]> Acked-by: Vlastimil Babka <[email protected]> Acked-by: Andreas Dilger <[email protected]> # Lustre Acked-by: Christian Borntraeger <[email protected]> # KVM/s390 Acked-by: Dan Williams <[email protected]> # nvdim Acked-by: David Sterba <[email protected]> # btrfs Acked-by: Ilya Dryomov <[email protected]> # Ceph Acked-by: Tariq Toukan <[email protected]> # mlx4 Acked-by: Leon Romanovsky <[email protected]> # mlx5 Cc: Martin Schwidefsky <[email protected]> Cc: Heiko Carstens <[email protected]> Cc: Herbert Xu <[email protected]> Cc: Anton Vorontsov <[email protected]> Cc: Colin Cross <[email protected]> Cc: Tony Luck <[email protected]> Cc: "Rafael J. Wysocki" <[email protected]> Cc: Ben Skeggs <[email protected]> Cc: Kent Overstreet <[email protected]> Cc: Santosh Raspatur <[email protected]> Cc: Hariprasad S <[email protected]> Cc: Yishai Hadas <[email protected]> Cc: Oleg Drokin <[email protected]> Cc: "Yan, Zheng" <[email protected]> Cc: Alexander Viro <[email protected]> Cc: Alexei Starovoitov <[email protected]> Cc: Eric Dumazet <[email protected]> Cc: David Miller <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
176 lines
3.9 KiB
C
176 lines
3.9 KiB
C
/*
|
|
* Cryptographic API.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 as published by
|
|
* the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with
|
|
* this program; if not, write to the Free Software Foundation, Inc., 51
|
|
* Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*
|
|
*/
|
|
|
|
#include <linux/init.h>
|
|
#include <linux/module.h>
|
|
#include <linux/crypto.h>
|
|
#include <linux/vmalloc.h>
|
|
#include <linux/mm.h>
|
|
#include <linux/lzo.h>
|
|
#include <crypto/internal/scompress.h>
|
|
|
|
struct lzo_ctx {
|
|
void *lzo_comp_mem;
|
|
};
|
|
|
|
static void *lzo_alloc_ctx(struct crypto_scomp *tfm)
|
|
{
|
|
void *ctx;
|
|
|
|
ctx = kvmalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL);
|
|
if (!ctx)
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
return ctx;
|
|
}
|
|
|
|
static int lzo_init(struct crypto_tfm *tfm)
|
|
{
|
|
struct lzo_ctx *ctx = crypto_tfm_ctx(tfm);
|
|
|
|
ctx->lzo_comp_mem = lzo_alloc_ctx(NULL);
|
|
if (IS_ERR(ctx->lzo_comp_mem))
|
|
return -ENOMEM;
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void lzo_free_ctx(struct crypto_scomp *tfm, void *ctx)
|
|
{
|
|
kvfree(ctx);
|
|
}
|
|
|
|
static void lzo_exit(struct crypto_tfm *tfm)
|
|
{
|
|
struct lzo_ctx *ctx = crypto_tfm_ctx(tfm);
|
|
|
|
lzo_free_ctx(NULL, ctx->lzo_comp_mem);
|
|
}
|
|
|
|
static int __lzo_compress(const u8 *src, unsigned int slen,
|
|
u8 *dst, unsigned int *dlen, void *ctx)
|
|
{
|
|
size_t tmp_len = *dlen; /* size_t(ulong) <-> uint on 64 bit */
|
|
int err;
|
|
|
|
err = lzo1x_1_compress(src, slen, dst, &tmp_len, ctx);
|
|
|
|
if (err != LZO_E_OK)
|
|
return -EINVAL;
|
|
|
|
*dlen = tmp_len;
|
|
return 0;
|
|
}
|
|
|
|
static int lzo_compress(struct crypto_tfm *tfm, const u8 *src,
|
|
unsigned int slen, u8 *dst, unsigned int *dlen)
|
|
{
|
|
struct lzo_ctx *ctx = crypto_tfm_ctx(tfm);
|
|
|
|
return __lzo_compress(src, slen, dst, dlen, ctx->lzo_comp_mem);
|
|
}
|
|
|
|
static int lzo_scompress(struct crypto_scomp *tfm, const u8 *src,
|
|
unsigned int slen, u8 *dst, unsigned int *dlen,
|
|
void *ctx)
|
|
{
|
|
return __lzo_compress(src, slen, dst, dlen, ctx);
|
|
}
|
|
|
|
static int __lzo_decompress(const u8 *src, unsigned int slen,
|
|
u8 *dst, unsigned int *dlen)
|
|
{
|
|
int err;
|
|
size_t tmp_len = *dlen; /* size_t(ulong) <-> uint on 64 bit */
|
|
|
|
err = lzo1x_decompress_safe(src, slen, dst, &tmp_len);
|
|
|
|
if (err != LZO_E_OK)
|
|
return -EINVAL;
|
|
|
|
*dlen = tmp_len;
|
|
return 0;
|
|
}
|
|
|
|
static int lzo_decompress(struct crypto_tfm *tfm, const u8 *src,
|
|
unsigned int slen, u8 *dst, unsigned int *dlen)
|
|
{
|
|
return __lzo_decompress(src, slen, dst, dlen);
|
|
}
|
|
|
|
static int lzo_sdecompress(struct crypto_scomp *tfm, const u8 *src,
|
|
unsigned int slen, u8 *dst, unsigned int *dlen,
|
|
void *ctx)
|
|
{
|
|
return __lzo_decompress(src, slen, dst, dlen);
|
|
}
|
|
|
|
static struct crypto_alg alg = {
|
|
.cra_name = "lzo",
|
|
.cra_flags = CRYPTO_ALG_TYPE_COMPRESS,
|
|
.cra_ctxsize = sizeof(struct lzo_ctx),
|
|
.cra_module = THIS_MODULE,
|
|
.cra_init = lzo_init,
|
|
.cra_exit = lzo_exit,
|
|
.cra_u = { .compress = {
|
|
.coa_compress = lzo_compress,
|
|
.coa_decompress = lzo_decompress } }
|
|
};
|
|
|
|
static struct scomp_alg scomp = {
|
|
.alloc_ctx = lzo_alloc_ctx,
|
|
.free_ctx = lzo_free_ctx,
|
|
.compress = lzo_scompress,
|
|
.decompress = lzo_sdecompress,
|
|
.base = {
|
|
.cra_name = "lzo",
|
|
.cra_driver_name = "lzo-scomp",
|
|
.cra_module = THIS_MODULE,
|
|
}
|
|
};
|
|
|
|
static int __init lzo_mod_init(void)
|
|
{
|
|
int ret;
|
|
|
|
ret = crypto_register_alg(&alg);
|
|
if (ret)
|
|
return ret;
|
|
|
|
ret = crypto_register_scomp(&scomp);
|
|
if (ret) {
|
|
crypto_unregister_alg(&alg);
|
|
return ret;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static void __exit lzo_mod_fini(void)
|
|
{
|
|
crypto_unregister_alg(&alg);
|
|
crypto_unregister_scomp(&scomp);
|
|
}
|
|
|
|
module_init(lzo_mod_init);
|
|
module_exit(lzo_mod_fini);
|
|
|
|
MODULE_LICENSE("GPL");
|
|
MODULE_DESCRIPTION("LZO Compression Algorithm");
|
|
MODULE_ALIAS_CRYPTO("lzo");
|