[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] Avoid panic when adjusting sedf parameters


  • To: Jan Beulich <JBeulich@xxxxxxxx>
  • From: Juergen Gross <juergen.gross@xxxxxxxxxxxxxx>
  • Date: Thu, 17 Nov 2011 15:41:11 +0100
  • Cc: Keir Fraser <keir.xen@xxxxxxxxx>, xen-devel@xxxxxxxxxxxxxxxxxxx
  • Delivery-date: Thu, 17 Nov 2011 14:43:56 +0000
  • Domainkey-signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns; h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV: Received:Received:Message-ID:Date:From:Organization: User-Agent:MIME-Version:To:CC:Subject:References: In-Reply-To:Content-Type:Content-Transfer-Encoding; b=Y9rp3T7s6CyMDZisF48T5m+AXH6JwijiedAt5+1t6tJJ+F4QWx4cz59C F2LrddWVuF96X8GZvRmWR6P7DK6/X2zkxLwB85Z8ia2gPdFzppSh5vuEA alvAVahS+TsmLEAL8zaMVEkZuN4jfQKG30SMfP7nLezkEmov0YKHz0LAh 4kVrH+vpvKRYysGxCsTkWpXynFEATc87E13n/5NbqOkYbMMXhqCmVAkJB OG+5VEb2/urElt+2DLQRRkIXR5AVh;
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>

On 11/17/2011 03:32 PM, Jan Beulich wrote:
On 17.11.11 at 15:04, Juergen Gross<juergen.gross@xxxxxxxxxxxxxx>  wrote:
On 11/17/2011 02:52 PM, Keir Fraser wrote:
On 17/11/2011 13:30, "Jan Beulich"<JBeulich@xxxxxxxx>   wrote:

which would now associate the else with the wrong (inner) if. One
possible solution that comes to mind would be

#define for_each_domain_in_cpupool(_d,_c) \
      for_each_domain_in_cpupool (_d) \
          if ((_d)->cpupool != (_c)) \
              continue; \
          else

but I think I had seen a more clever solution to this problem, but cannot
remember/locate it right now.
Given the gcc ({}) construction, you could do a double-loop:
   for ( (_d) = rcu_dereference(domain_list);     \
         (_d) != NULL;                            \
         ({ while ((_d) = rcu_dereference((_d)->next_in_list != NULL)
               if ((_d)->cpupool == (_c)) break;
            (_d); }) )

A bit ugly. ;-) And I still worry about cpupool locking...
What about:

static inline struct domain *next_domain_in_cpupool(
      struct domain *d, struct cpupool *c)
{
      for (d = rcu_dereference(d->next_in_list); d&&  d->cpupool != c;
           d = rcu_dereference(d->next_in_list));
      return d;
}

#define for_each_domain_in_cpupool(_d,_c)       \
   for ( (_d) = rcu_dereference(domain_list);     \
         (_d) != NULL;                            \
         (_d) = next_domain_in_cpupool((_d), (_c)))
Same problem as with Keir's variant - you'd enter the loop body for
the first domain on the list regardless of its cpupool. But with a
first_domain_in_cpupool() counterpart this might be usable. Or, as
said in the other reply, putting a more complex construct in the
middle clause.

I think adding first_domain_in_cpupool() is a good way to go.
Sending out adjusted patch with appropriate locking added in
cpupool_unassign_cpu() soon.


Juergen

--
Juergen Gross                 Principal Developer Operating Systems
PDG ES&S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: juergen.gross@xxxxxxxxxxxxxx
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.