[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] switch rangeset's lock to rwlock
>>> On 19.09.14 at 18:32, <konrad.wilk@xxxxxxxxxx> 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 <konrad.wilk@xxxxxxxxxx> > > 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 <jbeulich@xxxxxxxx> >> --- >> 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 <jbeulich@xxxxxxxx> >> --- >> 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@xxxxxxxxxxxxx >> http://lists.xen.org/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |