From patchwork Fri Mar 18 19:04:24 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dario Faggioli X-Patchwork-Id: 8623271 Return-Path: X-Original-To: patchwork-xen-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id F26FC9F6E1 for ; Fri, 18 Mar 2016 19:06:54 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id C1FE82034F for ; Fri, 18 Mar 2016 19:06:53 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 7CEC72022A for ; Fri, 18 Mar 2016 19:06:52 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1agzhF-0008VJ-CF; Fri, 18 Mar 2016 19:04:29 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1agzhE-0008Uy-Oc for xen-devel@lists.xenproject.org; Fri, 18 Mar 2016 19:04:28 +0000 Received: from [85.158.137.68] by server-6.bemta-3.messagelabs.com id 6E/E8-23864-B315CE65; Fri, 18 Mar 2016 19:04:27 +0000 X-Env-Sender: raistlin.df@gmail.com X-Msg-Ref: server-2.tower-31.messagelabs.com!1458327867!30148397!1 X-Originating-IP: [74.125.82.65] X-SpamReason: No, hits=0.7 required=7.0 tests=BODY_RANDOM_LONG, RCVD_ILLEGAL_IP X-StarScan-Received: X-StarScan-Version: 8.11; banners=-,-,- X-VirusChecked: Checked Received: (qmail 38386 invoked from network); 18 Mar 2016 19:04:27 -0000 Received: from mail-wm0-f65.google.com (HELO mail-wm0-f65.google.com) (74.125.82.65) by server-2.tower-31.messagelabs.com with AES128-GCM-SHA256 encrypted SMTP; 18 Mar 2016 19:04:27 -0000 Received: by mail-wm0-f65.google.com with SMTP id x188so8145147wmg.0 for ; Fri, 18 Mar 2016 12:04:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:subject:from:to:cc:date:message-id:in-reply-to:references :user-agent:mime-version:content-transfer-encoding; bh=4M8NeOm5qYiZ5H+GPJOv5VJMIrxkYG4h80oEO8wVJPU=; b=eqrZWAmh0yvSgT2kFCaumRN6jUtAVdHxkbrkktcdNxZFgFBJV4tEEIPwYgfk8th7vq q7uZ1wAJca0ddf8l/OmRug0iUPF9imaVsyFgFXzOQn3mOKAuvRWYeM73Aaqo5Wl8vdJI NXJ1RblESyhqD5cjnyJSbWW5KPsdHCVofBmkwlmy9JIPgXpYHBpvqQ5CnNikujalwrP9 dGzB0xACHePwXKCQSEm/SQd+tZrvvZRDdgjV2drx9Nn+DkgiVsVFTh71mxu+agsGuGTy q/Dpk/8MZyOU9+aI/y8blf+K2/wp5mAH60/84J9Zu5WaLDfk8c+I5XqpMYiGFF8BzTXD cVMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:subject:from:to:cc:date:message-id :in-reply-to:references:user-agent:mime-version :content-transfer-encoding; bh=4M8NeOm5qYiZ5H+GPJOv5VJMIrxkYG4h80oEO8wVJPU=; b=P6T4DI7SL1X5ED6rLBEghDp5/t2Gf0s6UNaoog7J/CSYvkwOiO4joQw7KdDAHQrss8 IqJIhEiuo5JwjDsx6RY51jVMeGGbO7tnWPjy9zLol7f0JH1QNGVSh76QdA4sxeF1DKmS uAv2qFScmxuCW62yU77SE6ndNN9KWOrXTcz7l7Wjo36udLntHqJ2Nu9Y9N+7F9A/6kTU Tom/Q9ULfVg/Y4EtmJN9QkAVzGE3FoNg4h7eMax1zI7jfJ2TsZGH8TTWOdzu+XzNeVth FxTVGGwWDziRhejke8ebWose9PlztCU8fo9AJxu8A2xy1Dr4zAm5i+Nvjyq3eyVBEU02 HYqw== X-Gm-Message-State: AD7BkJJ8xpnaOKhfmPAK4u1AV3F7y1g/Fel2TYyh/2pqqbMSVpyO/copWCx1eQyWKfblew== X-Received: by 10.28.215.16 with SMTP id o16mr886977wmg.57.1458327866926; Fri, 18 Mar 2016 12:04:26 -0700 (PDT) Received: from Solace.station (net-2-35-170-8.cust.vodafonedsl.it. [2.35.170.8]) by smtp.gmail.com with ESMTPSA id t8sm13383149wjy.41.2016.03.18.12.04.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 18 Mar 2016 12:04:26 -0700 (PDT) From: Dario Faggioli To: xen-devel@lists.xenproject.org Date: Fri, 18 Mar 2016 20:04:24 +0100 Message-ID: <20160318190424.8117.85820.stgit@Solace.station> In-Reply-To: <20160318185524.8117.74837.stgit@Solace.station> References: <20160318185524.8117.74837.stgit@Solace.station> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Cc: George Dunlap , Juergen Gross , Meng Xu Subject: [Xen-devel] [PATCH 04/16] xen: sched: implement .init_pdata in all schedulers X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Spam-Status: No, score=-4.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP by borrowing some of the code of .alloc_pdata, i.e., the bits that perform initializations, leaving only actual allocations in there, when any, which is the case for Credit1 and RTDS. On the other hand, in Credit2, since we don't really need any per-pCPU data allocation, everything that was being done in .alloc_pdata, is now done in .init_pdata. And the fact that now .alloc_pdata can be left undefined, allows us to just get rid of it. Still for Credit2, the fact that .init_pdata is called during CPU_STARTING (rather than CPU_UP_PREPARE) kills the need for the scheduler to setup a similar callback itself, simplifying the code. And thanks to such simplification, it is now also ok to move some of the logic meant at double checking that a cpu was (or was not) initialized, into ASSERTS (rather than an if() and a BUG_ON). Signed-off-by: Dario Faggioli Reviewed-by: Meng Xu Reviewed-by: George Dunlap --- Cc: George Dunlap Cc: Meng Xu Cc: Juergen Gross --- xen/common/sched_credit.c | 20 +++++++++--- xen/common/sched_credit2.c | 72 +++----------------------------------------- xen/common/sched_rt.c | 9 ++++-- 3 files changed, 26 insertions(+), 75 deletions(-) diff --git a/xen/common/sched_credit.c b/xen/common/sched_credit.c index 288749f..d4a0f5e 100644 --- a/xen/common/sched_credit.c +++ b/xen/common/sched_credit.c @@ -526,8 +526,6 @@ static void * csched_alloc_pdata(const struct scheduler *ops, int cpu) { struct csched_pcpu *spc; - struct csched_private *prv = CSCHED_PRIV(ops); - unsigned long flags; /* Allocate per-PCPU info */ spc = xzalloc(struct csched_pcpu); @@ -540,6 +538,19 @@ csched_alloc_pdata(const struct scheduler *ops, int cpu) return ERR_PTR(-ENOMEM); } + return spc; +} + +static void +csched_init_pdata(const struct scheduler *ops, void *pdata, int cpu) +{ + struct csched_private *prv = CSCHED_PRIV(ops); + struct csched_pcpu * const spc = pdata; + unsigned long flags; + + /* cpu data needs to be allocated, but STILL uninitialized */ + ASSERT(spc && spc->runq.next == spc->runq.prev && spc->runq.next == NULL); + spin_lock_irqsave(&prv->lock, flags); /* Initialize/update system-wide config */ @@ -560,16 +571,12 @@ csched_alloc_pdata(const struct scheduler *ops, int cpu) INIT_LIST_HEAD(&spc->runq); spc->runq_sort_last = prv->runq_sort; spc->idle_bias = nr_cpu_ids - 1; - if ( per_cpu(schedule_data, cpu).sched_priv == NULL ) - per_cpu(schedule_data, cpu).sched_priv = spc; /* Start off idling... */ BUG_ON(!is_idle_vcpu(curr_on_cpu(cpu))); cpumask_set_cpu(cpu, prv->idlers); spin_unlock_irqrestore(&prv->lock, flags); - - return spc; } #ifndef NDEBUG @@ -2051,6 +2058,7 @@ static const struct scheduler sched_credit_def = { .alloc_vdata = csched_alloc_vdata, .free_vdata = csched_free_vdata, .alloc_pdata = csched_alloc_pdata, + .init_pdata = csched_init_pdata, .free_pdata = csched_free_pdata, .alloc_domdata = csched_alloc_domdata, .free_domdata = csched_free_domdata, diff --git a/xen/common/sched_credit2.c b/xen/common/sched_credit2.c index 36dc9ee..b1642a8 100644 --- a/xen/common/sched_credit2.c +++ b/xen/common/sched_credit2.c @@ -1968,7 +1968,8 @@ static void deactivate_runqueue(struct csched2_private *prv, int rqi) cpumask_clear_cpu(rqi, &prv->active_queues); } -static void init_pcpu(const struct scheduler *ops, int cpu) +static void +csched2_init_pdata(const struct scheduler *ops, void *pdata, int cpu) { unsigned rqi; unsigned long flags; @@ -1978,12 +1979,7 @@ static void init_pcpu(const struct scheduler *ops, int cpu) spin_lock_irqsave(&prv->lock, flags); - if ( cpumask_test_cpu(cpu, &prv->initialized) ) - { - printk("%s: Strange, cpu %d already initialized!\n", __func__, cpu); - spin_unlock_irqrestore(&prv->lock, flags); - return; - } + ASSERT(!cpumask_test_cpu(cpu, &prv->initialized)); /* Figure out which runqueue to put it in */ rqi = 0; @@ -2033,20 +2029,6 @@ static void init_pcpu(const struct scheduler *ops, int cpu) return; } -static void * -csched2_alloc_pdata(const struct scheduler *ops, int cpu) -{ - /* Check to see if the cpu is online yet */ - /* Note: cpu 0 doesn't get a STARTING callback */ - if ( cpu == 0 || cpu_to_socket(cpu) != XEN_INVALID_SOCKET_ID ) - init_pcpu(ops, cpu); - else - printk("%s: cpu %d not online yet, deferring initializatgion\n", - __func__, cpu); - - return NULL; -} - static void csched2_free_pdata(const struct scheduler *ops, void *pcpu, int cpu) { @@ -2058,7 +2040,7 @@ csched2_free_pdata(const struct scheduler *ops, void *pcpu, int cpu) spin_lock_irqsave(&prv->lock, flags); - BUG_ON(!cpumask_test_cpu(cpu, &prv->initialized)); + ASSERT(cpumask_test_cpu(cpu, &prv->initialized)); /* Find the old runqueue and remove this cpu from it */ rqi = prv->runq_map[cpu]; @@ -2096,49 +2078,6 @@ csched2_free_pdata(const struct scheduler *ops, void *pcpu, int cpu) } static int -csched2_cpu_starting(int cpu) -{ - struct scheduler *ops; - - /* Hope this is safe from cpupools switching things around. :-) */ - ops = per_cpu(scheduler, cpu); - - if ( ops->alloc_pdata == csched2_alloc_pdata ) - init_pcpu(ops, cpu); - - return NOTIFY_DONE; -} - -static int cpu_credit2_callback( - struct notifier_block *nfb, unsigned long action, void *hcpu) -{ - unsigned int cpu = (unsigned long)hcpu; - int rc = 0; - - switch ( action ) - { - case CPU_STARTING: - csched2_cpu_starting(cpu); - break; - default: - break; - } - - return !rc ? NOTIFY_DONE : notifier_from_errno(rc); -} - -static struct notifier_block cpu_credit2_nfb = { - .notifier_call = cpu_credit2_callback -}; - -static int -csched2_global_init(void) -{ - register_cpu_notifier(&cpu_credit2_nfb); - return 0; -} - -static int csched2_init(struct scheduler *ops) { int i; @@ -2216,12 +2155,11 @@ static const struct scheduler sched_credit2_def = { .dump_cpu_state = csched2_dump_pcpu, .dump_settings = csched2_dump, - .global_init = csched2_global_init, .init = csched2_init, .deinit = csched2_deinit, .alloc_vdata = csched2_alloc_vdata, .free_vdata = csched2_free_vdata, - .alloc_pdata = csched2_alloc_pdata, + .init_pdata = csched2_init_pdata, .free_pdata = csched2_free_pdata, .alloc_domdata = csched2_alloc_domdata, .free_domdata = csched2_free_domdata, diff --git a/xen/common/sched_rt.c b/xen/common/sched_rt.c index ac8019f..b6ac3ad 100644 --- a/xen/common/sched_rt.c +++ b/xen/common/sched_rt.c @@ -649,8 +649,8 @@ rt_deinit(struct scheduler *ops) * Point per_cpu spinlock to the global system lock; * All cpu have same global system lock */ -static void * -rt_alloc_pdata(const struct scheduler *ops, int cpu) +static void +rt_init_pdata(const struct scheduler *ops, void *pdata, int cpu) { struct rt_private *prv = rt_priv(ops); spinlock_t *old_lock; @@ -663,7 +663,11 @@ rt_alloc_pdata(const struct scheduler *ops, int cpu) /* _Not_ pcpu_schedule_unlock(): per_cpu().schedule_lock changed! */ spin_unlock_irqrestore(old_lock, flags); +} +static void * +rt_alloc_pdata(const struct scheduler *ops, int cpu) +{ if ( !alloc_cpumask_var(&_cpumask_scratch[cpu]) ) return ERR_PTR(-ENOMEM); @@ -1395,6 +1399,7 @@ static const struct scheduler sched_rtds_def = { .deinit = rt_deinit, .alloc_pdata = rt_alloc_pdata, .free_pdata = rt_free_pdata, + .init_pdata = rt_init_pdata, .alloc_domdata = rt_alloc_domdata, .free_domdata = rt_free_domdata, .init_domain = rt_dom_init,