From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: "Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
stable@vger.kernel.org, "Török Edwin" <edwin@etorok.net>,
"Wei Liu" <wei.liu2@citrix.com>,
"Ian Campbell" <ian.campbell@citrix.com>,
"David Vrabel" <david.vrabel@citrix.com>,
"David S. Miller" <davem@davemloft.net>
Subject: [PATCH 3.14 11/23] xen-netback: disable rogue vif in kthread context
Date: Fri, 11 Apr 2014 09:12:00 -0700 [thread overview]
Message-ID: <20140411161201.785355821@linuxfoundation.org> (raw)
In-Reply-To: <20140411161200.236939691@linuxfoundation.org>
3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Liu <wei.liu2@citrix.com>
[ Upstream commit e9d8b2c2968499c1f96563e6522c56958d5a1d0d ]
When netback discovers frontend is sending malformed packet it will
disables the interface which serves that frontend.
However disabling a network interface involving taking a mutex which
cannot be done in softirq context, so we need to defer this process to
kthread context.
This patch does the following:
1. introduce a flag to indicate the interface is disabled.
2. check that flag in TX path, don't do any work if it's true.
3. check that flag in RX path, turn off that interface if it's true.
The reason to disable it in RX path is because RX uses kthread. After
this change the behavior of netback is still consistent -- it won't do
any TX work for a rogue frontend, and the interface will be eventually
turned off.
Also change a "continue" to "break" after xenvif_fatal_tx_err, as it
doesn't make sense to continue processing packets if frontend is rogue.
This is a fix for XSA-90.
Reported-by: Török Edwin <edwin@etorok.net>
Signed-off-by: Wei Liu <wei.liu2@citrix.com>
Cc: Ian Campbell <ian.campbell@citrix.com>
Reviewed-by: David Vrabel <david.vrabel@citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
drivers/net/xen-netback/common.h | 5 +++++
drivers/net/xen-netback/interface.c | 11 +++++++++++
drivers/net/xen-netback/netback.c | 16 ++++++++++++++--
3 files changed, 30 insertions(+), 2 deletions(-)
--- a/drivers/net/xen-netback/common.h
+++ b/drivers/net/xen-netback/common.h
@@ -113,6 +113,11 @@ struct xenvif {
domid_t domid;
unsigned int handle;
+ /* Is this interface disabled? True when backend discovers
+ * frontend is rogue.
+ */
+ bool disabled;
+
/* Use NAPI for guest TX */
struct napi_struct napi;
/* When feature-split-event-channels = 0, tx_irq = rx_irq. */
--- a/drivers/net/xen-netback/interface.c
+++ b/drivers/net/xen-netback/interface.c
@@ -62,6 +62,15 @@ static int xenvif_poll(struct napi_struc
struct xenvif *vif = container_of(napi, struct xenvif, napi);
int work_done;
+ /* This vif is rogue, we pretend we've there is nothing to do
+ * for this vif to deschedule it from NAPI. But this interface
+ * will be turned off in thread context later.
+ */
+ if (unlikely(vif->disabled)) {
+ napi_complete(napi);
+ return 0;
+ }
+
work_done = xenvif_tx_action(vif, budget);
if (work_done < budget) {
@@ -321,6 +330,8 @@ struct xenvif *xenvif_alloc(struct devic
vif->ip_csum = 1;
vif->dev = dev;
+ vif->disabled = false;
+
vif->credit_bytes = vif->remaining_credit = ~0UL;
vif->credit_usec = 0UL;
init_timer(&vif->credit_timeout);
--- a/drivers/net/xen-netback/netback.c
+++ b/drivers/net/xen-netback/netback.c
@@ -680,7 +680,8 @@ static void xenvif_tx_err(struct xenvif
static void xenvif_fatal_tx_err(struct xenvif *vif)
{
netdev_err(vif->dev, "fatal error; disabling device\n");
- xenvif_carrier_off(vif);
+ vif->disabled = true;
+ xenvif_kick_thread(vif);
}
static int xenvif_count_requests(struct xenvif *vif,
@@ -1151,7 +1152,7 @@ static unsigned xenvif_tx_build_gops(str
vif->tx.sring->req_prod, vif->tx.req_cons,
XEN_NETIF_TX_RING_SIZE);
xenvif_fatal_tx_err(vif);
- continue;
+ break;
}
work_to_do = RING_HAS_UNCONSUMED_REQUESTS(&vif->tx);
@@ -1573,7 +1574,18 @@ int xenvif_kthread(void *data)
while (!kthread_should_stop()) {
wait_event_interruptible(vif->wq,
rx_work_todo(vif) ||
+ vif->disabled ||
kthread_should_stop());
+
+ /* This frontend is found to be rogue, disable it in
+ * kthread context. Currently this is only set when
+ * netback finds out frontend sends malformed packet,
+ * but we cannot disable the interface in softirq
+ * context so we defer it here.
+ */
+ if (unlikely(vif->disabled && netif_carrier_ok(vif->dev)))
+ xenvif_carrier_off(vif);
+
if (kthread_should_stop())
break;
next prev parent reply other threads:[~2014-04-11 16:17 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-04-11 16:11 [PATCH 3.14 00/23] 3.14.1-stable review Greg Kroah-Hartman
2014-04-11 16:11 ` [PATCH 3.14 01/23] Revert "ALSA: hda - Increment default stream numbers for AMD HDMI controllers" Greg Kroah-Hartman
2014-04-11 16:11 ` [PATCH 3.14 02/23] selinux: correctly label /proc inodes in use before the policy is loaded Greg Kroah-Hartman
2014-04-11 16:11 ` [PATCH 3.14 03/23] x86, pageattr: Export page unmapping interface Greg Kroah-Hartman
2014-04-11 16:11 ` [PATCH 3.14 04/23] x86/efi: Make efi virtual runtime map passing more robust Greg Kroah-Hartman
2014-04-11 16:11 ` [PATCH 3.14 05/23] futex: avoid race between requeue and wake Greg Kroah-Hartman
2014-04-11 16:11 ` [PATCH 3.14 06/23] xen-netback: remove pointless clause from if statement Greg Kroah-Hartman
2014-04-11 16:11 ` [PATCH 3.14 07/23] xen-netback: worse-case estimate in xenvif_rx_action is underestimating Greg Kroah-Hartman
2014-04-11 16:11 ` [PATCH 3.14 08/23] xen-netback: BUG_ON in xenvif_rx_action() not catching overflow Greg Kroah-Hartman
2014-04-11 16:11 ` [PATCH 3.14 09/23] ipv6: some ipv6 statistic counters failed to disable bh Greg Kroah-Hartman
2014-04-11 16:11 ` [PATCH 3.14 10/23] netlink: dont compare the nul-termination in nla_strcmp Greg Kroah-Hartman
2014-04-11 16:12 ` Greg Kroah-Hartman [this message]
2014-04-11 16:12 ` [PATCH 3.14 12/23] Call efx_set_channels() before efx->type->dimension_resources() Greg Kroah-Hartman
2014-04-11 16:12 ` [PATCH 3.14 13/23] net: vxlan: fix crash when interface is created with no group Greg Kroah-Hartman
2014-04-11 16:12 ` [PATCH 3.14 14/23] isdnloop: Validate NUL-terminated strings from user Greg Kroah-Hartman
2014-04-11 16:12 ` [PATCH 3.14 15/23] isdnloop: several buffer overflows Greg Kroah-Hartman
2014-04-11 16:12 ` [PATCH 3.14 16/23] rds: prevent dereference of a NULL device in rds_iw_laddr_check Greg Kroah-Hartman
2014-04-11 16:12 ` [PATCH 3.14 17/23] net/at91_ether: avoid NULL pointer dereference Greg Kroah-Hartman
2014-04-11 16:12 ` [PATCH 3.14 18/23] iwlwifi: mvm: rs: fix search cycle rules Greg Kroah-Hartman
2014-04-11 16:12 ` [PATCH 3.14 19/23] ARC: [nsimosci] Change .dts to use generic 8250 UART Greg Kroah-Hartman
2014-04-11 16:12 ` [PATCH 3.14 20/23] ARC: [nsimosci] Unbork console Greg Kroah-Hartman
2014-04-11 16:12 ` [PATCH 3.14 21/23] futex: Allow architectures to skip futex_atomic_cmpxchg_inatomic() test Greg Kroah-Hartman
2014-04-11 16:12 ` [PATCH 3.14 22/23] m68k: Skip " Greg Kroah-Hartman
2014-04-11 16:12 ` [PATCH 3.14 23/23] crypto: ghash-clmulni-intel - use C implementation for setkey() Greg Kroah-Hartman
2014-04-11 21:49 ` [PATCH 3.14 00/23] 3.14.1-stable review Guenter Roeck
2014-04-12 1:58 ` Greg Kroah-Hartman
2014-04-11 23:46 ` Shuah Khan
2014-04-12 1:59 ` Greg Kroah-Hartman
2014-04-12 5:38 ` Satoru Takeuchi
2014-04-12 15:22 ` Greg Kroah-Hartman
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=20140411161201.785355821@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=davem@davemloft.net \
--cc=david.vrabel@citrix.com \
--cc=edwin@etorok.net \
--cc=ian.campbell@citrix.com \
--cc=linux-kernel@vger.kernel.org \
--cc=stable@vger.kernel.org \
--cc=wei.liu2@citrix.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox