From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Jan Beulich" Subject: Re: [PATCH] switch rangeset's lock to rwlock Date: Tue, 30 Sep 2014 09:50:05 +0100 Message-ID: <542A8ADD020000780003AE5E@mail.emea.novell.com> References: <5413094B020000780003480E@mail.emea.novell.com> <20140919163202.GA9327@laptop.dumpdata.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mail6.bemta14.messagelabs.com ([193.109.254.103]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1XYt8M-0004l1-4i for xen-devel@lists.xenproject.org; Tue, 30 Sep 2014 08:50:10 +0000 In-Reply-To: <20140919163202.GA9327@laptop.dumpdata.com> Content-Disposition: inline List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Ian Campbell , Ian Jackson , Keir Fraser , Tim Deegan Cc: xen-devel List-Id: xen-devel@lists.xenproject.org >>> On 19.09.14 at 18:32, wrote: > On Fri, Sep 12, 2014 at 01:55:07PM +0100, Jan Beulich wrote: >> As a general library routine, it should behave as efficiently as >> possible, even if at present no significant contention is known here. >> > > Reviewed-by: Konrad Rzeszutek Wilk > > I am comfortable with this going to Xen 4.5. Anyone of you wanting to ack this then, or should I nevertheless postpone it until after 4.5? Jan >> Signed-off-by: Jan Beulich >> --- >> With the widened use of rangesets I'd like to re-suggest this change >> which I had posted already a couple of years back. >> >> --- a/xen/common/rangeset.c >> +++ b/xen/common/rangeset.c >> @@ -28,7 +28,7 @@ struct rangeset { >> >> /* Number of ranges that can be allocated */ >> long nr_ranges; >> - spinlock_t lock; >> + rwlock_t lock; >> >> /* Pretty-printing name. */ >> char name[32]; >> @@ -120,7 +120,7 @@ int rangeset_add_range( >> >> ASSERT(s <= e); >> >> - spin_lock(&r->lock); >> + write_lock(&r->lock); >> >> x = find_range(r, s); >> y = find_range(r, e); >> @@ -176,7 +176,7 @@ int rangeset_add_range( >> } >> >> out: >> - spin_unlock(&r->lock); >> + write_unlock(&r->lock); >> return rc; >> } >> >> @@ -188,7 +188,7 @@ int rangeset_remove_range( >> >> ASSERT(s <= e); >> >> - spin_lock(&r->lock); >> + write_lock(&r->lock); >> >> x = find_range(r, s); >> y = find_range(r, e); >> @@ -244,7 +244,7 @@ int rangeset_remove_range( >> } >> >> out: >> - spin_unlock(&r->lock); >> + write_unlock(&r->lock); >> return rc; >> } >> >> @@ -256,10 +256,10 @@ int rangeset_contains_range( >> >> ASSERT(s <= e); >> >> - spin_lock(&r->lock); >> + read_lock(&r->lock); >> x = find_range(r, s); >> contains = (x && (x->e >= e)); >> - spin_unlock(&r->lock); >> + read_unlock(&r->lock); >> >> return contains; >> } >> @@ -272,10 +272,10 @@ int rangeset_overlaps_range( >> >> ASSERT(s <= e); >> >> - spin_lock(&r->lock); >> + read_lock(&r->lock); >> x = find_range(r, e); >> overlaps = (x && (s <= x->e)); >> - spin_unlock(&r->lock); >> + read_unlock(&r->lock); >> >> return overlaps; >> } >> @@ -287,13 +287,13 @@ int rangeset_report_ranges( >> struct range *x; >> int rc = 0; >> >> - spin_lock(&r->lock); >> + read_lock(&r->lock); >> >> for ( x = find_range(r, s); x && (x->s <= e) && !rc; x = next_range(r, x) ) >> if ( x->e >= s ) >> rc = cb(max(x->s, s), min(x->e, e), ctxt); >> >> - spin_unlock(&r->lock); >> + read_unlock(&r->lock); >> >> return rc; >> } >> @@ -331,7 +331,7 @@ struct rangeset *rangeset_new( >> if ( r == NULL ) >> return NULL; >> >> - spin_lock_init(&r->lock); >> + rwlock_init(&r->lock); >> INIT_LIST_HEAD(&r->range_list); >> r->nr_ranges = -1; >> >> @@ -414,21 +414,21 @@ void rangeset_swap(struct rangeset *a, s >> >> if ( a < b ) >> { >> - spin_lock(&a->lock); >> - spin_lock(&b->lock); >> + write_lock(&a->lock); >> + write_lock(&b->lock); >> } >> else >> { >> - spin_lock(&b->lock); >> - spin_lock(&a->lock); >> + write_lock(&b->lock); >> + write_lock(&a->lock); >> } >> >> list_splice_init(&a->range_list, &tmp); >> list_splice_init(&b->range_list, &a->range_list); >> list_splice(&tmp, &b->range_list); >> >> - spin_unlock(&a->lock); >> - spin_unlock(&b->lock); >> + write_unlock(&a->lock); >> + write_unlock(&b->lock); >> } >> >> /***************************** >> @@ -446,7 +446,7 @@ void rangeset_printk( >> int nr_printed = 0; >> struct range *x; >> >> - spin_lock(&r->lock); >> + read_lock(&r->lock); >> >> printk("%-10s {", r->name); >> >> @@ -465,7 +465,7 @@ void rangeset_printk( >> >> printk(" }"); >> >> - spin_unlock(&r->lock); >> + read_unlock(&r->lock); >> } >> >> void rangeset_domain_printk( >> >> >> > >> switch rangeset's lock to rwlock >> >> As a general library routine, it should behave as efficiently as >> possible, even if at present no significant contention is known here. >> >> Signed-off-by: Jan Beulich >> --- >> With the widened use of rangesets I'd like to re-suggest this change >> which I had posted already a couple of years back. >> >> --- a/xen/common/rangeset.c >> +++ b/xen/common/rangeset.c >> @@ -28,7 +28,7 @@ struct rangeset { >> >> /* Number of ranges that can be allocated */ >> long nr_ranges; >> - spinlock_t lock; >> + rwlock_t lock; >> >> /* Pretty-printing name. */ >> char name[32]; >> @@ -120,7 +120,7 @@ int rangeset_add_range( >> >> ASSERT(s <= e); >> >> - spin_lock(&r->lock); >> + write_lock(&r->lock); >> >> x = find_range(r, s); >> y = find_range(r, e); >> @@ -176,7 +176,7 @@ int rangeset_add_range( >> } >> >> out: >> - spin_unlock(&r->lock); >> + write_unlock(&r->lock); >> return rc; >> } >> >> @@ -188,7 +188,7 @@ int rangeset_remove_range( >> >> ASSERT(s <= e); >> >> - spin_lock(&r->lock); >> + write_lock(&r->lock); >> >> x = find_range(r, s); >> y = find_range(r, e); >> @@ -244,7 +244,7 @@ int rangeset_remove_range( >> } >> >> out: >> - spin_unlock(&r->lock); >> + write_unlock(&r->lock); >> return rc; >> } >> >> @@ -256,10 +256,10 @@ int rangeset_contains_range( >> >> ASSERT(s <= e); >> >> - spin_lock(&r->lock); >> + read_lock(&r->lock); >> x = find_range(r, s); >> contains = (x && (x->e >= e)); >> - spin_unlock(&r->lock); >> + read_unlock(&r->lock); >> >> return contains; >> } >> @@ -272,10 +272,10 @@ int rangeset_overlaps_range( >> >> ASSERT(s <= e); >> >> - spin_lock(&r->lock); >> + read_lock(&r->lock); >> x = find_range(r, e); >> overlaps = (x && (s <= x->e)); >> - spin_unlock(&r->lock); >> + read_unlock(&r->lock); >> >> return overlaps; >> } >> @@ -287,13 +287,13 @@ int rangeset_report_ranges( >> struct range *x; >> int rc = 0; >> >> - spin_lock(&r->lock); >> + read_lock(&r->lock); >> >> for ( x = find_range(r, s); x && (x->s <= e) && !rc; x = next_range(r, x) ) >> if ( x->e >= s ) >> rc = cb(max(x->s, s), min(x->e, e), ctxt); >> >> - spin_unlock(&r->lock); >> + read_unlock(&r->lock); >> >> return rc; >> } >> @@ -331,7 +331,7 @@ struct rangeset *rangeset_new( >> if ( r == NULL ) >> return NULL; >> >> - spin_lock_init(&r->lock); >> + rwlock_init(&r->lock); >> INIT_LIST_HEAD(&r->range_list); >> r->nr_ranges = -1; >> >> @@ -414,21 +414,21 @@ void rangeset_swap(struct rangeset *a, s >> >> if ( a < b ) >> { >> - spin_lock(&a->lock); >> - spin_lock(&b->lock); >> + write_lock(&a->lock); >> + write_lock(&b->lock); >> } >> else >> { >> - spin_lock(&b->lock); >> - spin_lock(&a->lock); >> + write_lock(&b->lock); >> + write_lock(&a->lock); >> } >> >> list_splice_init(&a->range_list, &tmp); >> list_splice_init(&b->range_list, &a->range_list); >> list_splice(&tmp, &b->range_list); >> >> - spin_unlock(&a->lock); >> - spin_unlock(&b->lock); >> + write_unlock(&a->lock); >> + write_unlock(&b->lock); >> } >> >> /***************************** >> @@ -446,7 +446,7 @@ void rangeset_printk( >> int nr_printed = 0; >> struct range *x; >> >> - spin_lock(&r->lock); >> + read_lock(&r->lock); >> >> printk("%-10s {", r->name); >> >> @@ -465,7 +465,7 @@ void rangeset_printk( >> >> printk(" }"); >> >> - spin_unlock(&r->lock); >> + read_unlock(&r->lock); >> } >> >> void rangeset_domain_printk( > >> _______________________________________________ >> Xen-devel mailing list >> Xen-devel@lists.xen.org >> http://lists.xen.org/xen-devel