throttle: Add throttle group infrastructure

The throttle_group_incref increment the refcount of a throttle group given it's
name and return the associated throttle state.

The throttle_group_unref is the mirror function for cleaning up.

Signed-off-by: Benoit Canet <benoit@irqsave.net>
throttle: Add throttle group infrastructure tests

Signed-off-by: Benoit Canet <benoit@irqsave.net>
throttle: Prepare to have multiple timers for one ThrottleState

This patch transform the timer_pending call into two boolean values in the
ThrottleState structure.

This way we are sure that when multiple timers will be used only
one can be armed at a time.

Signed-off-by: Benoit Canet <benoit@irqsave.net>
throttle: Add a way to know if throttle_schedule_timer had armed a timer

This will be needed by the group throttling patches for the algorithm to be
accurate.

Signed-off-by: Benoit Canet <benoit@irqsave.net>
throttle: Add a way to fire one of the timers immediatly like a bottom half

This will be needed by the group throttling algorithm.

Signed-off-by: Benoit Canet <benoit@irqsave.net>
throttle: Add throttle group support

The throttle group support use a cooperative round robin scheduling algorithm.

The principle of the algorithm are simple:
- Each BDS of the group is used as a token in a circular way.
- The active BDS compute if a wait must be done and arm the right timer.
- If a wait must be done the token timer will be armed so the token will become
  the next active BDS.

Signed-off-by: Benoit Canet <benoit@irqsave.net>