On Wednesday 01 November 2006 21:30, Larry Finger wrote:
> Michael,
>
> The "badness" variable and the concept of BADNESS_LIMIT were useful during
> the debugging of the
> preemptible periodic work routines, but now that those problems seem to be
> fixed, I propose
> simplifying that section of the code according to the patch below. I believe
> the functionality to be
> identical to what was there before the patch. I expected the size of bcm43xx
> to be smaller, but on
> i386, at least, the reduction does not cross a page boundary. It does,
> however, give us a little
> more headroom before we cross that next boundary.
I don't care. You're the maintainer.
> Larry
>
>
> Index: wireless-2.6/drivers/net/wireless/bcm43xx/bcm43xx_main.c
> ===================================================================
> --- wireless-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_main.c
> +++ wireless-2.6/drivers/net/wireless/bcm43xx/bcm43xx_main.c
> @@ -3192,55 +3192,27 @@ static void bcm43xx_periodic_every15sec(
>
> static void do_periodic_work(struct bcm43xx_private *bcm)
> {
> - unsigned int state;
> -
> - state = bcm->periodic_state;
> - if (state % 8 == 0)
> + if (bcm->periodic_state % 8 == 0)
> bcm43xx_periodic_every120sec(bcm);
> - if (state % 4 == 0)
> + if (bcm->periodic_state % 4 == 0)
> bcm43xx_periodic_every60sec(bcm);
> - if (state % 2 == 0)
> + if (bcm->periodic_state % 2 == 0)
> bcm43xx_periodic_every30sec(bcm);
> - if (state % 1 == 0)
> - bcm43xx_periodic_every15sec(bcm);
> - bcm->periodic_state = state + 1;
> + bcm43xx_periodic_every15sec(bcm);
>
> schedule_delayed_work(&bcm->periodic_work, HZ * 15);
> }
>
> -/* Estimate a "Badness" value based on the periodic work
> - * state-machine state. "Badness" is worse (bigger), if the
> - * periodic work will take longer.
> - */
> -static int estimate_periodic_work_badness(unsigned int state)
> -{
> - int badness = 0;
> -
> - if (state % 8 == 0) /* every 120 sec */
> - badness += 10;
> - if (state % 4 == 0) /* every 60 sec */
> - badness += 5;
> - if (state % 2 == 0) /* every 30 sec */
> - badness += 1;
> - if (state % 1 == 0) /* every 15 sec */
> - badness += 1;
> -
> -#define BADNESS_LIMIT 4
> - return badness;
> -}
> -
> static void bcm43xx_periodic_work_handler(void *d)
> {
> struct bcm43xx_private *bcm = d;
> struct net_device *net_dev = bcm->net_dev;
> unsigned long flags;
> u32 savedirqs = 0;
> - int badness;
> unsigned long orig_trans_start = 0;
>
> mutex_lock(&bcm->mutex);
> - badness = estimate_periodic_work_badness(bcm->periodic_state);
> - if (badness > BADNESS_LIMIT) {
> + if (unlikely(bcm->periodic_state % 4 == 0)) {
> /* Periodic work will take a long time, so we want it to
> * be preemtible.
> */
> @@ -3272,7 +3244,7 @@ static void bcm43xx_periodic_work_handle
>
> do_periodic_work(bcm);
>
> - if (badness > BADNESS_LIMIT) {
> + if (unlikely(bcm->periodic_state % 4 == 0)) {
> spin_lock_irqsave(&bcm->irq_lock, flags);
> tasklet_enable(&bcm->isr_tasklet);
> bcm43xx_interrupt_enable(bcm, savedirqs);
> @@ -3283,6 +3255,7 @@ static void bcm43xx_periodic_work_handle
> net_dev->trans_start = orig_trans_start;
> }
> mmiowb();
> + bcm->periodic_state++;
> spin_unlock_irqrestore(&bcm->irq_lock, flags);
> mutex_unlock(&bcm->mutex);
> }
>
>
> ---
>
--
Greetings Michael.
_______________________________________________
Bcm43xx-dev mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/bcm43xx-dev