All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@linux-foundation.org>
To: Sage Weil <sage@newdream.net>
Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
	yehuda@newdream.net, sage@newdream.net
Subject: Re: [PATCH 04/21] ceph: ref counted buffer
Date: Tue, 29 Sep 2009 17:02:40 -0700	[thread overview]
Message-ID: <20090929170240.ce93d637.akpm@linux-foundation.org> (raw)
In-Reply-To: <1253641129-28434-5-git-send-email-sage@newdream.net>

On Tue, 22 Sep 2009 10:38:32 -0700
Sage Weil <sage@newdream.net> wrote:

> struct ceph_buffer is a simple ref-counted buffer.  We transparently
> choose between kmalloc for small buffers and vmalloc for large ones.
> 
> This is used for allocating memory for xattr data, among other things.
> 
> Signed-off-by: Sage Weil <sage@newdream.net>
> ---
>  fs/ceph/buffer.h |   83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 83 insertions(+), 0 deletions(-)
>  create mode 100644 fs/ceph/buffer.h
> 
> diff --git a/fs/ceph/buffer.h b/fs/ceph/buffer.h
> new file mode 100644
> index 0000000..128593d
> --- /dev/null
> +++ b/fs/ceph/buffer.h
> @@ -0,0 +1,83 @@
> +#ifndef __FS_CEPH_BUFFER_H
> +#define __FS_CEPH_BUFFER_H
> +
> +#include <linux/mm.h>
> +#include <linux/types.h>
> +#include <linux/vmalloc.h>
> +
> +#include "ceph_debug.h"
> +
> +/*
> + * a simple reference counted buffer.
> + *
> + * use kmalloc for small sizes (<= one page), vmalloc for larger
> + * sizes.
> + */
> +struct ceph_buffer {
> +	atomic_t nref;
> +	struct kvec vec;
> +	size_t alloc_len;
> +	bool is_vmalloc;
> +};

vmalloc is a concern.  It is vulnerable to (and can cause) internal
fragmentation.  One that occurs, it's as good as a full machine
failure.

> +static inline struct ceph_buffer *ceph_buffer_new(gfp_t gfp)
> +{
> +	struct ceph_buffer *b;
> +
> +	b = kmalloc(sizeof(*b), gfp);
> +	if (!b)
> +		return NULL;
> +	atomic_set(&b->nref, 1);
> +	b->vec.iov_base = NULL;
> +	b->vec.iov_len = 0;
> +	b->alloc_len = 0;
> +	return b;
> +}

I was going to stop commenting on all the nutty inlining decisions but gee.

> +static inline int ceph_buffer_alloc(struct ceph_buffer *b, int len, gfp_t gfp)
> +{
> +	if (len <= PAGE_SIZE) {
> +		b->vec.iov_base = kmalloc(len, gfp);
> +		b->is_vmalloc = false;
> +	} else {
> +		b->vec.iov_base = __vmalloc(len, gfp, PAGE_KERNEL);
> +		b->is_vmalloc = true;
> +	}
> +	if (!b->vec.iov_base)
> +		return -ENOMEM;
> +	b->alloc_len = len;
> +	b->vec.iov_len = len;
> +	return 0;
> +}

Do we *really* need vmalloc here?  It much be one humongous vector! 
How large can it really get?

A still-lame-but-less-lame option here would be to attempt the kmalloc
(with __GFP_NOWARN) and if it failed, fall back to vmalloc.


>
> ...
>
> +static inline void ceph_buffer_put(struct ceph_buffer *b)
> +{
> +	if (b && atomic_dec_and_test(&b->nref)) {
> +		if (b->vec.iov_base) {
> +			if (b->is_vmalloc)
> +				vfree(b->vec.iov_base);
> +			else
> +				kfree(b->vec.iov_base);
> +		}
> +		kfree(b);
> +	}
> +}
> +
> +static inline struct ceph_buffer *ceph_buffer_new_alloc(int len, gfp_t gfp)
> +{
> +	struct ceph_buffer *b = ceph_buffer_new(gfp);
> +
> +	if (b && ceph_buffer_alloc(b, len, gfp) < 0) {
> +		ceph_buffer_put(b);
> +		b = NULL;
> +	}
> +	return b;
> +}

Do we really need to test for b==NULL here?  Is that test potentially
hiding bugs in calling code?


  parent reply	other threads:[~2009-09-30  0:02 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-09-22 17:38 [PATCH 00/21] ceph distributed file system client Sage Weil
2009-09-22 17:38 ` [PATCH 01/21] ceph: documentation Sage Weil
2009-09-22 17:38   ` [PATCH 02/21] ceph: on-wire types Sage Weil
2009-09-22 17:38     ` [PATCH 03/21] ceph: client types Sage Weil
2009-09-22 17:38       ` [PATCH 04/21] ceph: ref counted buffer Sage Weil
2009-09-22 17:38         ` [PATCH 05/21] ceph: super.c Sage Weil
2009-09-22 17:38           ` [PATCH 06/21] ceph: inode operations Sage Weil
2009-09-22 17:38             ` [PATCH 07/21] ceph: directory operations Sage Weil
2009-09-22 17:38               ` [PATCH 08/21] ceph: file operations Sage Weil
2009-09-22 17:38                 ` [PATCH 09/21] ceph: address space operations Sage Weil
2009-09-22 17:38                   ` [PATCH 10/21] ceph: MDS client Sage Weil
2009-09-22 17:38                     ` [PATCH 11/21] ceph: OSD client Sage Weil
2009-09-22 17:38                       ` [PATCH 12/21] ceph: CRUSH mapping algorithm Sage Weil
2009-09-22 17:38                         ` [PATCH 13/21] ceph: monitor client Sage Weil
2009-09-22 17:38                           ` [PATCH 14/21] ceph: capability management Sage Weil
2009-09-22 17:38                             ` [PATCH 15/21] ceph: snapshot management Sage Weil
2009-09-22 17:38                               ` [PATCH 16/21] ceph: messenger library Sage Weil
2009-09-22 17:38                                 ` [PATCH 17/21] ceph: message pools Sage Weil
2009-09-22 17:38                                   ` [PATCH 18/21] ceph: nfs re-export support Sage Weil
2009-09-22 17:38                                     ` [PATCH 19/21] ceph: ioctls Sage Weil
2009-09-22 17:38                                       ` [PATCH 20/21] ceph: debugfs Sage Weil
2009-09-22 17:38                                         ` [PATCH 21/21] ceph: Kconfig, Makefile Sage Weil
2009-10-02  4:18                                       ` [PATCH 19/21] ceph: ioctls Andi Kleen
2009-10-02 15:55                                         ` Sage Weil
2009-10-02 16:36                                           ` Andi Kleen
2009-09-30  0:15             ` [PATCH 06/21] ceph: inode operations Andrew Morton
2009-09-30 17:45               ` Sage Weil
2009-12-03 20:27               ` ceph code review Sage Weil
2009-12-03 20:31                 ` Andrew Morton
2009-12-03 21:22                   ` Randy Dunlap
2009-09-30  0:13           ` [PATCH 05/21] ceph: super.c Andrew Morton
2009-09-30  0:02         ` Andrew Morton [this message]
2009-09-22 18:08       ` [PATCH 03/21] ceph: client types Joe Perches
2009-09-29 23:57       ` Andrew Morton
2009-09-30 17:41         ` Sage Weil
2009-09-22 18:01     ` [PATCH 02/21] ceph: on-wire types Joe Perches
2009-09-22 18:21       ` Sage Weil
2009-09-29 23:52     ` Andrew Morton
2009-09-30 17:40       ` Sage Weil
  -- strict thread matches above, loose matches on Subject: below --
2009-10-05 22:50 [PATCH 00/21] ceph distributed file system client Sage Weil
2009-10-05 22:50 ` [PATCH 01/21] ceph: documentation Sage Weil
2009-10-05 22:50   ` [PATCH 02/21] ceph: on-wire types Sage Weil
2009-10-05 22:50     ` [PATCH 03/21] ceph: client types Sage Weil
2009-10-05 22:50       ` [PATCH 04/21] ceph: ref counted buffer Sage Weil

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20090929170240.ce93d637.akpm@linux-foundation.org \
    --to=akpm@linux-foundation.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sage@newdream.net \
    --cc=yehuda@newdream.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.