[PATCH 206/206] Staging: hv: Get rid of the function count_hv_channel()
KY Srinivasan
kys at microsoft.com
Sat May 14 14:32:04 UTC 2011
> -----Original Message-----
> From: KY Srinivasan
> Sent: Wednesday, May 11, 2011 6:56 PM
> To: 'Greg KH'
> Cc: gregkh at suse.de; devel at linuxdriverproject.org; Haiyang Zhang; Abhishek
> Kane (Mindtree Consulting PVT LTD); Hank Janssen
> Subject: RE: [PATCH 206/206] Staging: hv: Get rid of the function
> count_hv_channel()
>
>
>
> > -----Original Message-----
> > From: Greg KH [mailto:greg at kroah.com]
> > Sent: Wednesday, May 11, 2011 4:57 PM
> > To: KY Srinivasan
> > Cc: gregkh at suse.de; devel at linuxdriverproject.org; Haiyang Zhang; Abhishek
> > Kane (Mindtree Consulting PVT LTD); Hank Janssen
> > Subject: Re: [PATCH 206/206] Staging: hv: Get rid of the function
> > count_hv_channel()
> >
> > On Tue, May 10, 2011 at 07:57:12AM -0700, K. Y. Srinivasan wrote:
> > > Get rid of the function count_hv_channel()
> > > by inlining the code.
> >
> > Close, but not quite:
> >
> > > +static atomic_t num_channels;
> >
> > Why is this atomic?
>
> The original code had a spin lock protecting this counter; so I made the
> variable atomic and eliminated the locking around the increment. Now
> looking at the code more carefully, this code itself is single threaded and
> so no locking should be necessary (I will check with the windows guys if this
> is the case).
>
> >
> > > struct vmbus_channel_message_table_entry {
> > > enum vmbus_channel_message_type message_type;
> > > void (*message_handler)(struct vmbus_channel_message_header
> > *msg);
> > > @@ -316,21 +318,6 @@ void free_channel(struct vmbus_channel *channel)
> > > DECLARE_COMPLETION(hv_channel_ready);
> > >
> > > /*
> > > - * Count initialized channels, and ensure all channels are ready when
> > hv_vmbus
> > > - * module loading completes.
> > > - */
> > > -static void count_hv_channel(void)
> > > -{
> > > - static int counter;
> > > - unsigned long flags;
> > > -
> > > - spin_lock_irqsave(&vmbus_connection.channel_lock, flags);
> > > - if (++counter == MAX_MSG_TYPES)
> > > - complete(&hv_channel_ready);
> > > - spin_unlock_irqrestore(&vmbus_connection.channel_lock, flags);
> > > -}
> > > -
> > > -/*
> > > * vmbus_process_rescind_offer -
> > > * Rescind the offer by initiating a device removal
> > > */
> > > @@ -433,7 +420,16 @@ static void vmbus_process_offer(struct work_struct
> > *work)
> > >
> > > pr_info("%s\n", hv_cb_utils[cnt].log_msg);
> > >
> > > - count_hv_channel();
> > > + /*
> > > + * Count initialized channels, and ensure
> > > + * all channels are ready when hv_vmbus
> > > + * module loading completes.
> > > + */
> > > +
> > > + atomic_inc(&num_channels);
> > > + if (atomic_read(&num_channels)
> > > + == MAX_MSG_TYPES)
> > > + complete(&hv_channel_ready);
> >
> > I don't see why this needs to be atomic, if you properly lock things it
> > can just be a variable, right?
> >
> > And what's copying this from ever terminating if the count never
> > increments? This logic is very strange and should be reworked to not do
> > this kind of "loop until something else counts high enough" code.
>
> I need to check with Haiyang who I think introduced this. If I recall correctly
> this was to fix a bug and the patch was accepted only a few months ago.
> I will check and see if some other solution is possible.
Greg, I have completely re-worked this patch and I will send it to you ASAP. I have
circulated the patches internally and I hope to send it to you soon. With this, I have
addressed all the review comments you had given me earlier. I know you are very busy
but if you let me know what else needs to be fixed, I can work on that.
Regards,
K. Y
More information about the devel
mailing list