lkml.org 
[lkml]   [2021]   [Feb]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v6 1/7] Increase size of ucounts to atomic_long_t
    Date
    RLIMIT_MSGQUEUE and RLIMIT_MEMLOCK use unsigned long to store their
    counters. As a preparation for moving rlimits based on ucounts, we need
    to increase the size of the variable to long.

    Signed-off-by: Alexey Gladkov <gladkov.alexey@gmail.com>
    ---
    include/linux/user_namespace.h | 4 ++--
    kernel/ucount.c | 16 ++++++++--------
    2 files changed, 10 insertions(+), 10 deletions(-)

    diff --git a/include/linux/user_namespace.h b/include/linux/user_namespace.h
    index 64cf8ebdc4ec..0bb833fd41f4 100644
    --- a/include/linux/user_namespace.h
    +++ b/include/linux/user_namespace.h
    @@ -85,7 +85,7 @@ struct user_namespace {
    struct ctl_table_header *sysctls;
    #endif
    struct ucounts *ucounts;
    - int ucount_max[UCOUNT_COUNTS];
    + long ucount_max[UCOUNT_COUNTS];
    } __randomize_layout;

    struct ucounts {
    @@ -93,7 +93,7 @@ struct ucounts {
    struct user_namespace *ns;
    kuid_t uid;
    int count;
    - atomic_t ucount[UCOUNT_COUNTS];
    + atomic_long_t ucount[UCOUNT_COUNTS];
    };

    extern struct user_namespace init_user_ns;
    diff --git a/kernel/ucount.c b/kernel/ucount.c
    index 11b1596e2542..04c561751af1 100644
    --- a/kernel/ucount.c
    +++ b/kernel/ucount.c
    @@ -175,14 +175,14 @@ static void put_ucounts(struct ucounts *ucounts)
    kfree(ucounts);
    }

    -static inline bool atomic_inc_below(atomic_t *v, int u)
    +static inline bool atomic_long_inc_below(atomic_long_t *v, int u)
    {
    - int c, old;
    - c = atomic_read(v);
    + long c, old;
    + c = atomic_long_read(v);
    for (;;) {
    if (unlikely(c >= u))
    return false;
    - old = atomic_cmpxchg(v, c, c+1);
    + old = atomic_long_cmpxchg(v, c, c+1);
    if (likely(old == c))
    return true;
    c = old;
    @@ -196,17 +196,17 @@ struct ucounts *inc_ucount(struct user_namespace *ns, kuid_t uid,
    struct user_namespace *tns;
    ucounts = get_ucounts(ns, uid);
    for (iter = ucounts; iter; iter = tns->ucounts) {
    - int max;
    + long max;
    tns = iter->ns;
    max = READ_ONCE(tns->ucount_max[type]);
    - if (!atomic_inc_below(&iter->ucount[type], max))
    + if (!atomic_long_inc_below(&iter->ucount[type], max))
    goto fail;
    }
    return ucounts;
    fail:
    bad = iter;
    for (iter = ucounts; iter != bad; iter = iter->ns->ucounts)
    - atomic_dec(&iter->ucount[type]);
    + atomic_long_dec(&iter->ucount[type]);

    put_ucounts(ucounts);
    return NULL;
    @@ -216,7 +216,7 @@ void dec_ucount(struct ucounts *ucounts, enum ucount_type type)
    {
    struct ucounts *iter;
    for (iter = ucounts; iter; iter = iter->ns->ucounts) {
    - int dec = atomic_dec_if_positive(&iter->ucount[type]);
    + long dec = atomic_long_dec_if_positive(&iter->ucount[type]);
    WARN_ON_ONCE(dec < 0);
    }
    put_ucounts(ucounts);
    --
    2.29.2
    \
     
     \ /
      Last update: 2021-02-15 13:45    [W:4.287 / U:0.124 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site