[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <46923DA8.9010208@trash.net>
Date: Mon, 09 Jul 2007 15:52:40 +0200
From: Patrick McHardy <kaber@...sh.net>
To: Ranko Zivojnovic <ranko@...dernet.net>
CC: Jarek Poplawski <jarkao2@...pl>, akpm@...ux-foundation.org,
netdev@...r.kernel.org
Subject: Re: + gen_estimator-fix-locking-and-timer-related-bugs.patch added
to -mm tree
Ranko Zivojnovic wrote:
> On Sat, 2007-07-07 at 17:10 +0200, Patrick McHardy wrote:
>
>>On Sat, 7 Jul 2007, Ranko Zivojnovic wrote:
>>
>>>Maybe the appropriate way to fix this would to call gen_kill_estimator,
>>>with the appropriate lock order, before the call to qdisc_destroy, so
>>>when dev->queue_lock is taken for qdisc_destroy - the structure is
>>>already off the list.
>>
>>Probably easier to just kill est_lock and use rcu lists.
>>I'm currently travelling, I'll look into it tomorrow.
>
>
> Patrick, I've taken liberty to try and implement this myself. Attached
> is the whole new gen_estimator-fix-locking-and-timer-related-bugs.patch
> that is RCU lists based. Please be kind to review.
Thanks for taking care of this, I'm a bit behind.
See below for comments ..
> --- a/net/core/gen_estimator.c 2007-06-25 02:21:48.000000000 +0300
> +++ b/net/core/gen_estimator.c 2007-07-09 14:27:12.053336875 +0300
> @@ -79,7 +79,7 @@
>
> struct gen_estimator
> {
> - struct gen_estimator *next;
> + struct list_head list;
> struct gnet_stats_basic *bstats;
> struct gnet_stats_rate_est *rate_est;
> spinlock_t *stats_lock;
> @@ -89,26 +89,27 @@
> u32 last_packets;
> u32 avpps;
> u32 avbps;
> + struct rcu_head e_rcu;
You could also use synchronize_rcu(), estimator destruction is
not particulary performance critical.
> static struct gen_estimator_head elist[EST_MAX_INTERVAL+1];
>
> /* Estimator array lock */
> -static DEFINE_RWLOCK(est_lock);
> +static DEFINE_SPINLOCK(est_lock);
The lock isn't needed anymore since we can rely on the rtnl
for creation/destruction.
> /**
> @@ -152,6 +153,7 @@
> {
> struct gen_estimator *est;
> struct gnet_estimator *parm = RTA_DATA(opt);
> + int idx;
>
> if (RTA_PAYLOAD(opt) < sizeof(*parm))
> return -EINVAL;
> @@ -163,7 +165,8 @@
> if (est == NULL)
> return -ENOBUFS;
>
> - est->interval = parm->interval + 2;
> + INIT_LIST_HEAD(&est->list);
Initializing the members' list_head isn't necessary.
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists