From: gregory.clement@free-electrons.com (Gregory CLEMENT)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH net 1/3] net: mvneta: Fix spinlock usage
Date: Wed, 09 Mar 2016 08:49:40 +0100 [thread overview]
Message-ID: <87wppc2iqz.fsf@free-electrons.com> (raw)
In-Reply-To: <20160309144254.3fbf177f@xhacker> (Jisheng Zhang's message of "Wed, 9 Mar 2016 14:42:54 +0800")
Hi Jisheng,
On mer., mars 09 2016, Jisheng Zhang <jszhang@marvell.com> wrote:
> Dear Gregory,
>
> On Tue, 8 Mar 2016 13:57:04 +0100 Gregory CLEMENT wrote:
>
>> In the previous patch, the spinlock was not initialized. While it didn't
>> cause any trouble yet it could be a problem to use it uninitialized.
>>
>> The most annoying part was the critical section protected by the spinlock
>> in mvneta_stop(). Some of the functions could sleep as pointed when
>> activated CONFIG_DEBUG_ATOMIC_SLEEP. Actually, in mvneta_stop() we only
>> need to protect the is_stopped flagged, indeed the code of the notifier
>> for CPU online is protected by the same spinlock, so when we get the
>> lock, the notifer work is done.
>>
>> Reported-by: Patrick Uiterwijk <patrick@puiterwijk.org>
>> Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
>> ---
>> drivers/net/ethernet/marvell/mvneta.c | 11 ++++++-----
>> 1 file changed, 6 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c
>> index b0ae69f84493..8dc7df2edff6 100644
>> --- a/drivers/net/ethernet/marvell/mvneta.c
>> +++ b/drivers/net/ethernet/marvell/mvneta.c
>> @@ -3070,17 +3070,17 @@ static int mvneta_stop(struct net_device *dev)
>> struct mvneta_port *pp = netdev_priv(dev);
>>
>> /* Inform that we are stopping so we don't want to setup the
>> - * driver for new CPUs in the notifiers
>> + * driver for new CPUs in the notifiers. The code of the
>> + * notifier for CPU online is protected by the same spinlock,
>> + * so when we get the lock, the notifer work is done.
>> */
>> spin_lock(&pp->lock);
>> pp->is_stopped = true;
>> + spin_unlock(&pp->lock);
>
> This fix sleep in atomic issue. But
> I see race here. Let's assume is_stopped is false.
You forgot that the lock was hold in the mvneta_percpu_notifier so your
scenario can't happen.
>
> cpu0: cpu1:
> mvneta_percpu_notifier(): mvneta_stop():
>
spin_lock(&pp->lock);
> if (pp->is_stopped) {
> spin_unlock(&pp->lock);
> break;
> }
>
the lock is hold in
mvneta_percpu_notifier(), so as
said in the comment this cpu is
waiting for on the following
line:
spin_lock(&pp->lock);
This code will be executed only
when the lock will be released
> pp->is_stopped = true;
> spin_unlock(&pp->lock);
>
>
> netif_tx_stop_all_queues(pp->dev);
> for_each_online_cpu(other_cpu) {
> ....
>
So what will happen is:
cpu0: cpu1:
mvneta_percpu_notifier(): mvneta_stop():
spin_lock(&pp->lock);
if (pp->is_stopped) {
spin_unlock(&pp->lock);
break;
}
spin_lock(&pp->lock);
netif_tx_stop_all_queues(pp->dev);
for_each_online_cpu(other_cpu) {
....
spin_unlock(&pp->lock);
pp->is_stopped = true;
spin_unlock(&pp->lock);
Gregory
--
Gregory Clement, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com
WARNING: multiple messages have this Message-ID (diff)
From: Gregory CLEMENT <gregory.clement@free-electrons.com>
To: Jisheng Zhang <jszhang@marvell.com>
Cc: "David S. Miller" <davem@davemloft.net>,
Thomas Petazzoni <thomas.petazzoni@free-electrons.com>,
<linux-kernel@vger.kernel.org>, <netdev@vger.kernel.org>,
Lior Amsalem <alior@marvell.com>, Andrew Lunn <andrew@lunn.ch>,
Jason Cooper <jason@lakedaemon.net>,
Ofer Heifetz <oferh@marvell.com>,
Nadav Haklai <nadavh@marvell.com>,
Patrick Uiterwijk <patrick@puiterwijk.org>,
"Marcin Wojtas" <mw@semihalf.com>,
Dimitri Epshtein <dima@marvell.com>,
<linux-arm-kernel@lists.infradead.org>,
Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Subject: Re: [PATCH net 1/3] net: mvneta: Fix spinlock usage
Date: Wed, 09 Mar 2016 08:49:40 +0100 [thread overview]
Message-ID: <87wppc2iqz.fsf@free-electrons.com> (raw)
In-Reply-To: <20160309144254.3fbf177f@xhacker> (Jisheng Zhang's message of "Wed, 9 Mar 2016 14:42:54 +0800")
Hi Jisheng,
On mer., mars 09 2016, Jisheng Zhang <jszhang@marvell.com> wrote:
> Dear Gregory,
>
> On Tue, 8 Mar 2016 13:57:04 +0100 Gregory CLEMENT wrote:
>
>> In the previous patch, the spinlock was not initialized. While it didn't
>> cause any trouble yet it could be a problem to use it uninitialized.
>>
>> The most annoying part was the critical section protected by the spinlock
>> in mvneta_stop(). Some of the functions could sleep as pointed when
>> activated CONFIG_DEBUG_ATOMIC_SLEEP. Actually, in mvneta_stop() we only
>> need to protect the is_stopped flagged, indeed the code of the notifier
>> for CPU online is protected by the same spinlock, so when we get the
>> lock, the notifer work is done.
>>
>> Reported-by: Patrick Uiterwijk <patrick@puiterwijk.org>
>> Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
>> ---
>> drivers/net/ethernet/marvell/mvneta.c | 11 ++++++-----
>> 1 file changed, 6 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c
>> index b0ae69f84493..8dc7df2edff6 100644
>> --- a/drivers/net/ethernet/marvell/mvneta.c
>> +++ b/drivers/net/ethernet/marvell/mvneta.c
>> @@ -3070,17 +3070,17 @@ static int mvneta_stop(struct net_device *dev)
>> struct mvneta_port *pp = netdev_priv(dev);
>>
>> /* Inform that we are stopping so we don't want to setup the
>> - * driver for new CPUs in the notifiers
>> + * driver for new CPUs in the notifiers. The code of the
>> + * notifier for CPU online is protected by the same spinlock,
>> + * so when we get the lock, the notifer work is done.
>> */
>> spin_lock(&pp->lock);
>> pp->is_stopped = true;
>> + spin_unlock(&pp->lock);
>
> This fix sleep in atomic issue. But
> I see race here. Let's assume is_stopped is false.
You forgot that the lock was hold in the mvneta_percpu_notifier so your
scenario can't happen.
>
> cpu0: cpu1:
> mvneta_percpu_notifier(): mvneta_stop():
>
spin_lock(&pp->lock);
> if (pp->is_stopped) {
> spin_unlock(&pp->lock);
> break;
> }
>
the lock is hold in
mvneta_percpu_notifier(), so as
said in the comment this cpu is
waiting for on the following
line:
spin_lock(&pp->lock);
This code will be executed only
when the lock will be released
> pp->is_stopped = true;
> spin_unlock(&pp->lock);
>
>
> netif_tx_stop_all_queues(pp->dev);
> for_each_online_cpu(other_cpu) {
> ....
>
So what will happen is:
cpu0: cpu1:
mvneta_percpu_notifier(): mvneta_stop():
spin_lock(&pp->lock);
if (pp->is_stopped) {
spin_unlock(&pp->lock);
break;
}
spin_lock(&pp->lock);
netif_tx_stop_all_queues(pp->dev);
for_each_online_cpu(other_cpu) {
....
spin_unlock(&pp->lock);
pp->is_stopped = true;
spin_unlock(&pp->lock);
Gregory
--
Gregory Clement, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com
next prev parent reply other threads:[~2016-03-09 7:49 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-08 12:57 [PATCH net 0/3] Few mvneta fixes Gregory CLEMENT
2016-03-08 12:57 ` Gregory CLEMENT
2016-03-08 12:57 ` [PATCH net 1/3] net: mvneta: Fix spinlock usage Gregory CLEMENT
2016-03-08 12:57 ` Gregory CLEMENT
2016-03-09 6:42 ` Jisheng Zhang
2016-03-09 6:42 ` Jisheng Zhang
2016-03-09 7:49 ` Gregory CLEMENT [this message]
2016-03-09 7:49 ` Gregory CLEMENT
2016-03-09 8:13 ` Jisheng Zhang
2016-03-09 8:13 ` Jisheng Zhang
2016-03-08 12:57 ` [PATCH net 2/3] net: mvneta: enable change MAC address when interface is up Gregory CLEMENT
2016-03-08 12:57 ` Gregory CLEMENT
2016-03-08 12:57 ` [PATCH net 3/3] net: mvneta: fix error messages in mvneta_port_down function Gregory CLEMENT
2016-03-08 12:57 ` Gregory CLEMENT
2016-03-11 19:20 ` David Miller
2016-03-11 19:20 ` David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87wppc2iqz.fsf@free-electrons.com \
--to=gregory.clement@free-electrons.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.