Search Linux Wireless

Re: [PATCH] rfkill: rate-limit rfkill-input workqueue usage

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

 



On Wed, 23 Jul 2008, Dmitry Torokhov wrote:
> On Wed, Jul 23, 2008 at 08:46:58PM +0200, Ivo van Doorn wrote:
> > On Wednesday 23 July 2008, Henrique de Moraes Holschuh wrote:
> > > Limit the number of rfkill-input global operations per second.  It lacked
> > > the limiter that non-global operations (state changes) had.  This way, a
> > > rogue input event generator cannot force rfkill-input to hog the workqueue
> > > too much.
> > > 
> > > Rework the limiter code so that newer state change requests (rfkill input
> > > events) will override older ones that haven't been acted upon yet.  It used
> > > to ignore new ones that were past the rate limit.
> 
> This was done to deal with potential jitter from button devices.

I'd argue that should be handled in the input device driver (note: I didn't
say input layer, although it could certainly add debouncing helpers if we
don't want to duplicate code in drivers).

IMHO, you should NOT send the result of a lack of proper debouncing to the
input layer.  When you do, you send duplicated events to every input device
handler, userspace, etc.

> In the proposed implementation, if button bounces and generates 2 or
> more press/release pairs and we manage to schedule and execure first
> task (which is scheduled with delay 0) before the last press/release
> arrives we will schedule an extra work and toggle the switch again as
> far as I can see.

You are correct.  I didn't know the previous behaviour was there to ignore
rapid press of buttons.  It looked like anti-DoS standard limiting to me
(needed, since userspace can inject events).

Well there are two possible ways to deal with this.  Three actually.  The
first is to ignore the issue in rfkill-input and input layer, and tell
anything that generate events for badly-behaved buttons to deal with it.
The second, is to fix it in the input layer, so that we don't have to fix it
in every handler.  The third is to fix it in the handlers.

I'd rather either the driver or the input layer dealt with this issue, so as
not to propagate bogus events to the rest of the system...

Or did I misunderstand the issue?

> > > @@ -132,24 +147,22 @@ static void rfkill_schedule_toggle(struct rfkill_task *task)
> > >  {
> > >  	unsigned long flags;
> > >  
> > > -	if (unlikely(work_pending(&rfkill_global_task.work)))
> > > +	if (unlikely(delayed_work_pending(&rfkill_global_task.dwork)))
> 
> What if the global task comletes executing right at this moment?

If delayed_work_pending() is set, then it has not begun executing yet.  That
bit is cleared by the workqueue stuff right before the delayed work handler
is called.

But I missed a test. I should check delayed_work_pending() and if it is set,
check rfkill_global_task.op_count.  If both are set, we are sure we ARE going
to execute a global operation in the near future, and therefore we should
clobber regular toggles.

Would that fix the issue with rfkill_schedule_toggle versus
rfkill_global_task?

-- 
  "One disk to rule them all, One disk to find them. One disk to bring
  them all and in the darkness grind them. In the Land of Redmond
  where the shadows lie." -- The Silicon Valley Tarot
  Henrique Holschuh
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux