lkml.org 
[lkml]   [2010]   [Nov]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH net-next-2.6] scm: lower SCM_MAX_FD
    From
    Date

    > David, commit f8d570a4 added one "struct list_head list;" to struct
    > scm_fp_list, enlarging it by a two factor because of power of two
    > kmalloc() sizes. (2048 bytes on 64bit arches instead of 1024
    > previously)
    >
    > We might lower SCM_MAX_FD from 255 to 253 ?
    >
    >

    This wont correct Vegard reported problem yet, but following patch
    should reduce ram usage a lot (32 bytes instead of 2048 bytes per scm in
    Vegard test program)

    Thanks

    [PATCH net-next-2.6] net: scm: lower SCM_MAX_FD

    Lower SCM_MAX_FD from 255 to 253 so that allocations for scm_fp_list are
    halved. (commit f8d570a4 added two pointers in this structure)

    scm_fp_dup() should not copy whole structure (and trigger kmemcheck
    warnings), but only the used part. While we are at it, only allocate
    needed size.

    Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
    ---
    include/net/scm.h | 5 +++--
    net/core/scm.c | 10 ++++++----
    2 files changed, 9 insertions(+), 6 deletions(-)

    diff --git a/include/net/scm.h b/include/net/scm.h
    index 3165650..745460f 100644
    --- a/include/net/scm.h
    +++ b/include/net/scm.h
    @@ -10,11 +10,12 @@
    /* Well, we should have at least one descriptor open
    * to accept passed FDs 8)
    */
    -#define SCM_MAX_FD 255
    +#define SCM_MAX_FD 253

    struct scm_fp_list {
    struct list_head list;
    - int count;
    + short count;
    + short max;
    struct file *fp[SCM_MAX_FD];
    };

    diff --git a/net/core/scm.c b/net/core/scm.c
    index 413cab8..bbe4544 100644
    --- a/net/core/scm.c
    +++ b/net/core/scm.c
    @@ -79,10 +79,11 @@ static int scm_fp_copy(struct cmsghdr *cmsg, struct scm_fp_list **fplp)
    return -ENOMEM;
    *fplp = fpl;
    fpl->count = 0;
    + fpl->max = SCM_MAX_FD;
    }
    fpp = &fpl->fp[fpl->count];

    - if (fpl->count + num > SCM_MAX_FD)
    + if (fpl->count + num > fpl->max)
    return -EINVAL;

    /*
    @@ -331,11 +332,12 @@ struct scm_fp_list *scm_fp_dup(struct scm_fp_list *fpl)
    if (!fpl)
    return NULL;

    - new_fpl = kmalloc(sizeof(*fpl), GFP_KERNEL);
    + new_fpl = kmemdup(fpl, offsetof(struct scm_fp_list, fp[fpl->count]),
    + GFP_KERNEL);
    if (new_fpl) {
    - for (i=fpl->count-1; i>=0; i--)
    + for (i = 0; i < fpl->count; i++)
    get_file(fpl->fp[i]);
    - memcpy(new_fpl, fpl, sizeof(*fpl));
    + new_fpl->max = new_fpl->count;
    }
    return new_fpl;
    }



    \
     
     \ /
      Last update: 2010-11-24 01:11    [W:0.064 / U:0.764 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site