RE: [PATCH 06/21] usb/gadget: f_mass_storage: add a level of indirection for luns storage

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

 



Hello Alan,

Thank you for your review. Please see below for a comment.

On Tuesday, July 16, 2013 5:13 PM Alan Stern wrote:
> On Tue, 16 Jul 2013, Andrzej Pietrasiewicz wrote:
> 
> > This is needed to prepare for configfs integration.
> >
> > So far the luns have been allocated during gadget's initialization,
> > based on the nluns module parameter's value; the exact number is known
> > when the gadget is initialized and that number of luns is allocated in
> > one go; they all will be used.
> >
> > When configfs is in place, the luns will be created one-by-one by the
> user.
> > Once the user is satisfied with the number of luns, they activate the
> > gadget. The number of luns must be <= FSG_MAX_LUN (currently 8), but
> > other than that it is not known up front and the user need not use
> > contiguous numbering (apart from the default lun #0). On the other
> > hand, the function code uses lun numbers to identify them and the
> > number needs to be used as an index into an array.
> >
> > Given the above, an array needs to be allocated, but it might happen
> > that
> > 7 out of its 8 elements will not be used. On my machine sizeof(struct
> > fsg_lun) == 462, so > 3k of memory is allocated but not used in the
> > worst case.
> >
> > By adding another level of indirection (allocating an array of
> > pointers to struct fsg_lun and then allocating individual luns instead
> > of an array of struct fsg_luns) at most 7 pointers are wasted, which is
> much less.
> >
> > This patch also changes some for/while loops to cope with the fact
> > that in the luns array some entries are potentially empty.
> 
> > @@ -621,7 +621,7 @@ static int sleep_thread(struct fsg_common *common)
> >
> >  static int do_read(struct fsg_common *common)  {
> > -	struct fsg_lun		*curlun = common->curlun;
> > +	struct fsg_lun		**curlun = common->curlun;
> 
> It would be much easier here and in other functions to instead do:
> 
> +	struct fsg_lun		*curlun = *common->curlun;
> 
> Then you wouldn't need to replace "curlun" with "*curlun" all over the
> place.
> 
> Alternatively (I haven't checked in detail to see if this would work),
> keep common->curlun itself as a "struct fsg_lun *" instead of making it
> "struct fsg_lun **".

Yeah, these two ideas look attractive, I'll give them a try.

Thanks,

Andrzej


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




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux