[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <1270195122.1936.106.camel@edumazet-laptop>
Date: Fri, 02 Apr 2010 09:58:42 +0200
From: Eric Dumazet <eric.dumazet@...il.com>
To: Tom Herbert <therbert@...gle.com>
Cc: davem@...emloft.net, netdev@...r.kernel.org
Subject: Re: [PATCH] rfs: Receive Flow Steering
Le jeudi 01 avril 2010 à 20:59 -0700, Tom Herbert a écrit :
> +static void rps_dev_flow_table_release_work(struct work_struct *work)
> +{
> + struct rps_dev_flow_table *table = container_of(work,
> + struct rps_dev_flow_table, free_work);
> +
> + vfree(table);
> +}
> +
> +static void rps_dev_flow_table_release(struct rcu_head *rcu)
> +{
> + struct rps_dev_flow_table *table = container_of(rcu,
> + struct rps_dev_flow_table, rcu);
> +
> + INIT_WORK(&table->free_work, rps_dev_flow_table_release_work);
> + schedule_work(&table->free_work);
> +}
> +
> +ssize_t store_rps_dev_flow_table_cnt(struct netdev_rx_queue *queue,
> + struct rx_queue_attribute *attr,
> + const char *buf, size_t len)
> +{
....
> + if (old_table)
> + call_rcu(&old_table->rcu, rps_dev_flow_table_release);
> +
> + return len;
> +}
> +
Instead of this complex logic (yet fine), you might try :
if (old_table) {
synchronize_rcu();
vfree(old_table);
}
(and remove free_work from struct rps_dev_flow_table)
We dont write this file that often, we can afford the synchronize_rcu()
here...
--
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