* [patch 0/2] s390: qeth bug fixes for 2.6.38 next rc
@ 2011-01-13 6:42 frank.blaschka
2011-01-13 6:42 ` [patch 1/2] [PATCH] qeth: postpone open till recovery is finished frank.blaschka
2011-01-13 6:42 ` [patch 2/2] [PATCH] qeth: l3 hw tx csum circumvent hw bug frank.blaschka
0 siblings, 2 replies; 6+ messages in thread
From: frank.blaschka @ 2011-01-13 6:42 UTC (permalink / raw)
To: davem; +Cc: netdev, linux-s390
Hi Dave,
here are 2 qeth bug fixes for 2.6.38 next rc (net-2.6)
shortlog:
Ursula Braun (1)
qeth: postpone open till recovery is finished
Frank Blaschka (1)
qeth: l3 hw tx csum circumvent hw bug
Thanks,
Frank
^ permalink raw reply [flat|nested] 6+ messages in thread
* [patch 1/2] [PATCH] qeth: postpone open till recovery is finished
2011-01-13 6:42 [patch 0/2] s390: qeth bug fixes for 2.6.38 next rc frank.blaschka
@ 2011-01-13 6:42 ` frank.blaschka
2011-01-13 6:42 ` [patch 2/2] [PATCH] qeth: l3 hw tx csum circumvent hw bug frank.blaschka
1 sibling, 0 replies; 6+ messages in thread
From: frank.blaschka @ 2011-01-13 6:42 UTC (permalink / raw)
To: davem; +Cc: netdev, linux-s390, Ursula Braun
[-- Attachment #1: 601-qeth-postpone-open.diff --]
[-- Type: text/plain, Size: 3138 bytes --]
From: Ursula Braun <ursula.braun@de.ibm.com>
The open function of qeth is not executed if the qeth device is in
state DOWN or HARDSETUP. A recovery switches from state SOFTSETUP to
HARDSETUP to DOWN to HARDSETUP and back to SOFTSETUP. If open and
recover are running concurrently, open fails if it hits the states
HARDSETUP or DOWN. This patch inserts waiting for recovery finish
in the qeth open functions to enable successful qeth device opening
in spite of a running recovery.
Signed-off-by: Ursula Braun <ursula.braun@de.ibm.com>
Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
---
drivers/s390/net/qeth_l2_main.c | 18 ++++++++++++++++--
drivers/s390/net/qeth_l3_main.c | 18 ++++++++++++++++--
2 files changed, 32 insertions(+), 4 deletions(-)
--- a/drivers/s390/net/qeth_l2_main.c
+++ b/drivers/s390/net/qeth_l2_main.c
@@ -831,12 +831,14 @@ tx_drop:
return NETDEV_TX_OK;
}
-static int qeth_l2_open(struct net_device *dev)
+static int __qeth_l2_open(struct net_device *dev)
{
struct qeth_card *card = dev->ml_priv;
int rc = 0;
QETH_CARD_TEXT(card, 4, "qethopen");
+ if (card->state == CARD_STATE_UP)
+ return rc;
if (card->state != CARD_STATE_SOFTSETUP)
return -ENODEV;
@@ -857,6 +859,18 @@ static int qeth_l2_open(struct net_devic
return rc;
}
+static int qeth_l2_open(struct net_device *dev)
+{
+ struct qeth_card *card = dev->ml_priv;
+
+ QETH_CARD_TEXT(card, 5, "qethope_");
+ if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
+ QETH_CARD_TEXT(card, 3, "openREC");
+ return -ERESTARTSYS;
+ }
+ return __qeth_l2_open(dev);
+}
+
static int qeth_l2_stop(struct net_device *dev)
{
struct qeth_card *card = dev->ml_priv;
@@ -1046,7 +1060,7 @@ contin:
if (recover_flag == CARD_STATE_RECOVER) {
if (recovery_mode &&
card->info.type != QETH_CARD_TYPE_OSN) {
- qeth_l2_open(card->dev);
+ __qeth_l2_open(card->dev);
} else {
rtnl_lock();
dev_open(card->dev);
--- a/drivers/s390/net/qeth_l3_main.c
+++ b/drivers/s390/net/qeth_l3_main.c
@@ -3240,12 +3240,14 @@ tx_drop:
return NETDEV_TX_OK;
}
-static int qeth_l3_open(struct net_device *dev)
+static int __qeth_l3_open(struct net_device *dev)
{
struct qeth_card *card = dev->ml_priv;
int rc = 0;
QETH_CARD_TEXT(card, 4, "qethopen");
+ if (card->state == CARD_STATE_UP)
+ return rc;
if (card->state != CARD_STATE_SOFTSETUP)
return -ENODEV;
card->data.state = CH_STATE_UP;
@@ -3260,6 +3262,18 @@ static int qeth_l3_open(struct net_devic
return rc;
}
+static int qeth_l3_open(struct net_device *dev)
+{
+ struct qeth_card *card = dev->ml_priv;
+
+ QETH_CARD_TEXT(card, 5, "qethope_");
+ if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
+ QETH_CARD_TEXT(card, 3, "openREC");
+ return -ERESTARTSYS;
+ }
+ return __qeth_l3_open(dev);
+}
+
static int qeth_l3_stop(struct net_device *dev)
{
struct qeth_card *card = dev->ml_priv;
@@ -3564,7 +3578,7 @@ contin:
netif_carrier_off(card->dev);
if (recover_flag == CARD_STATE_RECOVER) {
if (recovery_mode)
- qeth_l3_open(card->dev);
+ __qeth_l3_open(card->dev);
else {
rtnl_lock();
dev_open(card->dev);
^ permalink raw reply [flat|nested] 6+ messages in thread
* [patch 2/2] [PATCH] qeth: l3 hw tx csum circumvent hw bug
2011-01-13 6:42 [patch 0/2] s390: qeth bug fixes for 2.6.38 next rc frank.blaschka
2011-01-13 6:42 ` [patch 1/2] [PATCH] qeth: postpone open till recovery is finished frank.blaschka
@ 2011-01-13 6:42 ` frank.blaschka
2011-01-13 7:47 ` David Miller
1 sibling, 1 reply; 6+ messages in thread
From: frank.blaschka @ 2011-01-13 6:42 UTC (permalink / raw)
To: davem; +Cc: netdev, linux-s390
[-- Attachment #1: 602-qeth-l3-tx-csum.diff --]
[-- Type: text/plain, Size: 781 bytes --]
From: Frank Blaschka <frank.blaschka@de.ibm.com>
Some OSA level have a bug in the hw tx csum logic. We can circumvent
this bug by turning on IP hw csum also.
Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
---
drivers/s390/net/qeth_l3_main.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
--- a/drivers/s390/net/qeth_l3_main.c
+++ b/drivers/s390/net/qeth_l3_main.c
@@ -2998,7 +2998,9 @@ static inline void qeth_l3_hdr_csum(stru
*/
if (iph->protocol == IPPROTO_UDP)
hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_UDP;
- hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_CSUM_TRANSP_REQ;
+ hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_CSUM_TRANSP_REQ |
+ QETH_HDR_EXT_CSUM_HDR_REQ;
+ iph->check = 0;
if (card->options.performance_stats)
card->perf_stats.tx_csum++;
}
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [patch 2/2] [PATCH] qeth: l3 hw tx csum circumvent hw bug
2011-01-13 6:42 ` [patch 2/2] [PATCH] qeth: l3 hw tx csum circumvent hw bug frank.blaschka
@ 2011-01-13 7:47 ` David Miller
2011-01-13 8:23 ` Frank Blaschka
0 siblings, 1 reply; 6+ messages in thread
From: David Miller @ 2011-01-13 7:47 UTC (permalink / raw)
To: frank.blaschka; +Cc: netdev, linux-s390
From: frank.blaschka@de.ibm.com
Date: Thu, 13 Jan 2011 07:42:25 +0100
> --- a/drivers/s390/net/qeth_l3_main.c
> +++ b/drivers/s390/net/qeth_l3_main.c
> @@ -2998,7 +2998,9 @@ static inline void qeth_l3_hdr_csum(stru
> */
> if (iph->protocol == IPPROTO_UDP)
> hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_UDP;
> - hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_CSUM_TRANSP_REQ;
> + hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_CSUM_TRANSP_REQ |
> + QETH_HDR_EXT_CSUM_HDR_REQ;
> + iph->check = 0;
> if (card->options.performance_stats)
> card->perf_stats.tx_csum++;
> }
You may not change the packet header contents blindly like this.
Otherwise unpredictable contents will be seen by tcpdump and any
other code path which has a clone of this packet.
Thus, you'll need to guard this change with something like:
if (skb_header_cloned(skb) &&
pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
dev_kfree_skb(skb);
goto tx_fail;
}
Please fix this and resubmit your two patches.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [patch 2/2] [PATCH] qeth: l3 hw tx csum circumvent hw bug
2011-01-13 7:47 ` David Miller
@ 2011-01-13 8:23 ` Frank Blaschka
2011-01-16 4:46 ` David Miller
0 siblings, 1 reply; 6+ messages in thread
From: Frank Blaschka @ 2011-01-13 8:23 UTC (permalink / raw)
To: David Miller; +Cc: netdev, linux-s390
On Wed, Jan 12, 2011 at 11:47:35PM -0800, David Miller wrote:
> From: frank.blaschka@de.ibm.com
> Date: Thu, 13 Jan 2011 07:42:25 +0100
>
> > --- a/drivers/s390/net/qeth_l3_main.c
> > +++ b/drivers/s390/net/qeth_l3_main.c
> > @@ -2998,7 +2998,9 @@ static inline void qeth_l3_hdr_csum(stru
> > */
> > if (iph->protocol == IPPROTO_UDP)
> > hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_UDP;
> > - hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_CSUM_TRANSP_REQ;
> > + hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_CSUM_TRANSP_REQ |
> > + QETH_HDR_EXT_CSUM_HDR_REQ;
> > + iph->check = 0;
> > if (card->options.performance_stats)
> > card->perf_stats.tx_csum++;
> > }
>
> You may not change the packet header contents blindly like this.
> Otherwise unpredictable contents will be seen by tcpdump and any
> other code path which has a clone of this packet.
>
> Thus, you'll need to guard this change with something like:
>
> if (skb_header_cloned(skb) &&
> pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
> dev_kfree_skb(skb);
> goto tx_fail;
> }
Yes I know. Because of the suboptimal l3 driver design :-) we already have
a private copy of the skb at this place. Thx!
>
> Please fix this and resubmit your two patches.
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [patch 2/2] [PATCH] qeth: l3 hw tx csum circumvent hw bug
2011-01-13 8:23 ` Frank Blaschka
@ 2011-01-16 4:46 ` David Miller
0 siblings, 0 replies; 6+ messages in thread
From: David Miller @ 2011-01-16 4:46 UTC (permalink / raw)
To: frank.blaschka; +Cc: netdev, linux-s390
From: Frank Blaschka <frank.blaschka@de.ibm.com>
Date: Thu, 13 Jan 2011 09:23:59 +0100
> On Wed, Jan 12, 2011 at 11:47:35PM -0800, David Miller wrote:
>> From: frank.blaschka@de.ibm.com
>> Date: Thu, 13 Jan 2011 07:42:25 +0100
>>
>> > --- a/drivers/s390/net/qeth_l3_main.c
>> > +++ b/drivers/s390/net/qeth_l3_main.c
>> > @@ -2998,7 +2998,9 @@ static inline void qeth_l3_hdr_csum(stru
>> > */
>> > if (iph->protocol == IPPROTO_UDP)
>> > hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_UDP;
>> > - hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_CSUM_TRANSP_REQ;
>> > + hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_CSUM_TRANSP_REQ |
>> > + QETH_HDR_EXT_CSUM_HDR_REQ;
>> > + iph->check = 0;
>> > if (card->options.performance_stats)
>> > card->perf_stats.tx_csum++;
>> > }
>>
>> You may not change the packet header contents blindly like this.
>> Otherwise unpredictable contents will be seen by tcpdump and any
>> other code path which has a clone of this packet.
>>
>> Thus, you'll need to guard this change with something like:
>>
>> if (skb_header_cloned(skb) &&
>> pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
>> dev_kfree_skb(skb);
>> goto tx_fail;
>> }
> Yes I know. Because of the suboptimal l3 driver design :-) we already have
> a private copy of the skb at this place. Thx!
I see, thanks for explaining.
Both patches applied, thanks.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2011-01-16 4:45 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-01-13 6:42 [patch 0/2] s390: qeth bug fixes for 2.6.38 next rc frank.blaschka
2011-01-13 6:42 ` [patch 1/2] [PATCH] qeth: postpone open till recovery is finished frank.blaschka
2011-01-13 6:42 ` [patch 2/2] [PATCH] qeth: l3 hw tx csum circumvent hw bug frank.blaschka
2011-01-13 7:47 ` David Miller
2011-01-13 8:23 ` Frank Blaschka
2011-01-16 4:46 ` David Miller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).