Skip to content

Commit

Permalink
rfkill: prevent unnecessary event generation
Browse files Browse the repository at this point in the history
Prevent unnecessary rfkill event generation when the state has
not actually changed. These events have to be delivered to
relevant userspace processes, causing these processes to wake
up and do something while they could as well have slept. This
obviously results in more CPU usage, longer time-to-sleep-again
and therefore higher power consumption.

Signed-off-by: Vitaly Wool <vitalywool@gmail.com>
Signed-off-by: Mykyta Iziumtsev <nikita.izyumtsev@gmail.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  • Loading branch information
Vitaly Wool authored and Johannes Berg committed Sep 24, 2012
1 parent c6f219d commit eab4834
Showing 1 changed file with 7 additions and 1 deletion.
8 changes: 7 additions & 1 deletion net/rfkill/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,7 @@ static bool __rfkill_set_hw_state(struct rfkill *rfkill,
static void rfkill_set_block(struct rfkill *rfkill, bool blocked)
{
unsigned long flags;
bool prev, curr;
int err;

if (unlikely(rfkill->dev.power.power_state.event & PM_EVENT_SLEEP))
Expand All @@ -284,6 +285,8 @@ static void rfkill_set_block(struct rfkill *rfkill, bool blocked)
rfkill->ops->query(rfkill, rfkill->data);

spin_lock_irqsave(&rfkill->lock, flags);
prev = rfkill->state & RFKILL_BLOCK_SW;

if (rfkill->state & RFKILL_BLOCK_SW)
rfkill->state |= RFKILL_BLOCK_SW_PREV;
else
Expand Down Expand Up @@ -313,10 +316,13 @@ static void rfkill_set_block(struct rfkill *rfkill, bool blocked)
}
rfkill->state &= ~RFKILL_BLOCK_SW_SETCALL;
rfkill->state &= ~RFKILL_BLOCK_SW_PREV;
curr = rfkill->state & RFKILL_BLOCK_SW;
spin_unlock_irqrestore(&rfkill->lock, flags);

rfkill_led_trigger_event(rfkill);
rfkill_event(rfkill);

if (prev != curr)
rfkill_event(rfkill);
}

#ifdef CONFIG_RFKILL_INPUT
Expand Down

0 comments on commit eab4834

Please sign in to comment.