Re: pack-objects: Fix segfault when object count is less than thread count

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

 



On Mon, 21 Jan 2008, Sergey Vlasov wrote:

> On Mon, Jan 21, 2008 at 11:07:15AM -0500, Nicolas Pitre wrote:
> > On Mon, 21 Jan 2008, Sergey Vlasov wrote:
> > 
> > > When partitioning the work amongst threads, dividing the number of
> > > objects by the number of threads may return 0 when there are less
> > > objects than threads; this will cause the subsequent code to segfault
> > > when accessing list[sub_size-1].  Fix this by ensuring that sub_size
> > > is not zero if there is at least one object to process.
> > 
> > No.  Forcing one object in a thread is counter productive since it won't 
> > have anything to delta against.  Instead, the thread should be allowed 
> > to have zero objects and let the other threads have more.
> > 
> > This patch would be a proper fix:
> > 
> > diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c
> > index ec10238..d3efeff 100644
> > --- a/builtin-pack-objects.c
> > +++ b/builtin-pack-objects.c
> > @@ -1672,7 +1672,8 @@ static void ll_find_deltas(struct object_entry **list, unsigned list_size,
> >  		p[i].data_ready = 0;
> >  
> >  		/* try to split chunks on "path" boundaries */
> > -		while (sub_size < list_size && list[sub_size]->hash &&
> > +		while (sub_size && sub_size < list_size &&
> > +		       list[sub_size]->hash &&
> >  		       list[sub_size]->hash == list[sub_size-1]->hash)
> >  			sub_size++;
> 
> Actually there will not be any significant differences - with my patch
> the object distribution between threads will be 1, 1, ..., 0, 0...,
> and with your patch it would be 0, 0, ..., 1, 1, ...

Or more likely 0, 0, ..., 2.

And the code is simpler.

> We could even introduce some limit on the number of objects below
> which multithreaded packing is not attempted, so that packing a small
> number of objects would be more efficient.

Possibly.  But that's not a requirement at this moment.


Nicolas
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux