lkml.org 
[lkml]   [2011]   [Aug]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[75/90] sparc: Size mondo queues more sanely.
    3.0-stable review patch.  If anyone has any objections, please let us know.

    ------------------


    From: "David S. Miller" <davem@davemloft.net>

    [ Upstream commit 961f65fc41cdc1f9099a6075258816c0db98e390 ]

    There is currently no upper limit on the mondo queue sizes we'll use,
    which guarentees that we'll eventually his page allocation limits, and
    thus allocation failures, due to MAX_ORDER.

    Cap the sizes sanely, current limits are:

    CPU MONDO 2 * max_possible_cpus
    DEV MONDO 256 (basically NR_IRQS)
    RES MONDO 128
    NRES MONDO 4

    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
    ---
    arch/sparc/kernel/mdesc.c | 30 +++++++++++++++++++++++-------
    1 file changed, 23 insertions(+), 7 deletions(-)

    --- a/arch/sparc/kernel/mdesc.c
    +++ b/arch/sparc/kernel/mdesc.c
    @@ -508,6 +508,8 @@ const char *mdesc_node_name(struct mdesc
    }
    EXPORT_SYMBOL(mdesc_node_name);

    +static u64 max_cpus = 64;
    +
    static void __init report_platform_properties(void)
    {
    struct mdesc_handle *hp = mdesc_grab();
    @@ -543,8 +545,10 @@ static void __init report_platform_prope
    if (v)
    printk("PLATFORM: watchdog-max-timeout [%llu ms]\n", *v);
    v = mdesc_get_property(hp, pn, "max-cpus", NULL);
    - if (v)
    - printk("PLATFORM: max-cpus [%llu]\n", *v);
    + if (v) {
    + max_cpus = *v;
    + printk("PLATFORM: max-cpus [%llu]\n", max_cpus);
    + }

    #ifdef CONFIG_SMP
    {
    @@ -715,7 +719,7 @@ static void __cpuinit set_proc_ids(struc
    }

    static void __cpuinit get_one_mondo_bits(const u64 *p, unsigned int *mask,
    - unsigned char def)
    + unsigned long def, unsigned long max)
    {
    u64 val;

    @@ -726,6 +730,9 @@ static void __cpuinit get_one_mondo_bits
    if (!val || val >= 64)
    goto use_default;

    + if (val > max)
    + val = max;
    +
    *mask = ((1U << val) * 64U) - 1U;
    return;

    @@ -736,19 +743,28 @@ use_default:
    static void __cpuinit get_mondo_data(struct mdesc_handle *hp, u64 mp,
    struct trap_per_cpu *tb)
    {
    + static int printed;
    const u64 *val;

    val = mdesc_get_property(hp, mp, "q-cpu-mondo-#bits", NULL);
    - get_one_mondo_bits(val, &tb->cpu_mondo_qmask, 7);
    + get_one_mondo_bits(val, &tb->cpu_mondo_qmask, 7, ilog2(max_cpus * 2));

    val = mdesc_get_property(hp, mp, "q-dev-mondo-#bits", NULL);
    - get_one_mondo_bits(val, &tb->dev_mondo_qmask, 7);
    + get_one_mondo_bits(val, &tb->dev_mondo_qmask, 7, 8);

    val = mdesc_get_property(hp, mp, "q-resumable-#bits", NULL);
    - get_one_mondo_bits(val, &tb->resum_qmask, 6);
    + get_one_mondo_bits(val, &tb->resum_qmask, 6, 7);

    val = mdesc_get_property(hp, mp, "q-nonresumable-#bits", NULL);
    - get_one_mondo_bits(val, &tb->nonresum_qmask, 2);
    + get_one_mondo_bits(val, &tb->nonresum_qmask, 2, 2);
    + if (!printed++) {
    + pr_info("SUN4V: Mondo queue sizes "
    + "[cpu(%u) dev(%u) r(%u) nr(%u)]\n",
    + tb->cpu_mondo_qmask + 1,
    + tb->dev_mondo_qmask + 1,
    + tb->resum_qmask + 1,
    + tb->nonresum_qmask + 1);
    + }
    }

    static void * __cpuinit mdesc_iterate_over_cpus(void *(*func)(struct mdesc_handle *, u64, int, void *), void *arg, cpumask_t *mask)



    \
     
     \ /
      Last update: 2011-08-14 18:15    [W:0.030 / U:0.168 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site