[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20090515054947.GA4497@ff.dom.local>
Date: Fri, 15 May 2009 05:49:47 +0000
From: Jarek Poplawski <jarkao2@...il.com>
To: Neil Horman <nhorman@...driver.com>
Cc: Jiri Pirko <jpirko@...hat.com>,
"Paul E. McKenney" <paulmck@...ux.vnet.ibm.com>,
Eric Dumazet <dada1@...mosbay.com>, netdev@...r.kernel.org,
davem@...emloft.net
Subject: Re: [PATCH] dropmon: add ability to detect when hardware
dropsrxpackets
On 14-05-2009 19:29, Neil Horman wrote:
> On Thu, May 14, 2009 at 02:44:08PM +0200, Jiri Pirko wrote:
>>> +
>>> + /*
>>> + * Clean the device list
>>> + */
>>> + list_for_each_entry_rcu(new_stat, &hw_stats_list, list) {
>> ^^^^^^^^^^^^^^^^^^^^^^^
>> This is meaningless here. Use list_for_each_entry_rcu only under rcu_read_lock.
>> Also it would be good to use list_for_each_entry_safe here since you're
>> modifying the list.
>>
>
> The definition of list_for_each_entry_rcu specifically says its safe against
> list-mutation primitives, so its fine. Although you are correct, in that its
> safety is dependent on the protection of rcu_read_lock(), so I'll add that in.
> Thanks for the catch! New patch attached
>
> Change notes:
> 1) Add rcu_read_lock/unlock protection around TRACE_OFF event
>
> Neil
...
> static int set_all_monitor_traces(int state)
> {
> int rc = 0;
> + struct dm_hw_stat_delta *new_stat = NULL;
> +
> + spin_lock(&trace_state_lock);
>
> switch (state) {
> case TRACE_ON:
> rc |= register_trace_kfree_skb(trace_kfree_skb_hit);
> + rc |= register_trace_napi_poll(trace_napi_poll_hit);
> break;
> case TRACE_OFF:
> rc |= unregister_trace_kfree_skb(trace_kfree_skb_hit);
> + rc |= unregister_trace_napi_poll(trace_napi_poll_hit);
>
> tracepoint_synchronize_unregister();
> +
> + /*
> + * Clean the device list
> + */
> + rcu_read_lock();
> + list_for_each_entry_rcu(new_stat, &hw_stats_list, list) {
> + if (new_stat->dev == NULL) {
> + list_del_rcu(&new_stat->list);
> + call_rcu(&new_stat->rcu, free_dm_hw_stat);
> + }
> + }
> + rcu_read_unlock();
IMHO it looks worse now. rcu_read_lock() suggests it's a read side,
and spin_lock(&trace_state_lock) protects something else.
Jarek P.
--
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