diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-27 19:52:32 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-27 19:52:32 -0400 |
commit | de8856d2c11f562c60ed9340a83db4a4f829a6e6 (patch) | |
tree | 0b871e5f4cf3204c4c6243c7622c4787d56d48ee /drivers | |
parent | 66f03c614c0902ccf7d6160459362a9352f33271 (diff) | |
parent | 94f826b8076e2cb92242061e92f21b5baa3eccc2 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller:
1) Name string overrun fix in gianfar driver from Joe Perches.
2) VHOST bug fixes from Michael S. Tsirkin and Nadav Har'El
3) Fix dependencies on xt_LOG netfilter module, from Pablo Neira Ayuso.
4) Fix RCU locking in xt_CT, also from Pablo Neira Ayuso.
5) Add a parameter to skb_add_rx_frag() so we can fix the truesize
adjustments in the drivers that use it. The individual drivers
aren't fixed by this commit, but will be dealt with using follow-on
commits. From Eric Dumazet.
6) Add some device IDs to qmi_wwan driver, from Andrew Bird.
7) Fix a potential rcu_read_lock() imbalancein rt6_fill_node(). From
Eric Dumazet.
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net:
net: fix a potential rcu_read_lock() imbalance in rt6_fill_node()
net: add a truesize parameter to skb_add_rx_frag()
gianfar: Fix possible overrun and simplify interrupt name field creation
USB: qmi_wwan: Add ZTE (Vodafone) K3570-Z and K3571-Z net interfaces
USB: option: Ignore ZTE (Vodafone) K3570/71 net interfaces
USB: qmi_wwan: Add ZTE (Vodafone) K3565-Z and K4505-Z net interfaces
qlcnic: Bug fix for LRO
netfilter: nf_conntrack: permanently attach timeout policy to conntrack
netfilter: xt_CT: fix assignation of the generic protocol tracker
netfilter: xt_CT: missing rcu_read_lock section in timeout assignment
netfilter: cttimeout: fix dependency with l4protocol conntrack module
netfilter: xt_LOG: use CONFIG_IP6_NF_IPTABLES instead of CONFIG_IPV6
vhost: fix release path lockdep checks
vhost: don't forget to schedule()
tools/virtio: stub out strong barriers
tools/virtio: add linux/hrtimer.h stub
tools/virtio: add linux/module.h stub
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/ethernet/freescale/gianfar.c | 39 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/gianfar.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 4 | ||||
-rw-r--r-- | drivers/net/usb/cdc-phonet.c | 6 | ||||
-rw-r--r-- | drivers/net/usb/qmi_wwan.c | 36 | ||||
-rw-r--r-- | drivers/net/wireless/iwlegacy/3945.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/iwlegacy/4965-mac.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn-rx.c | 2 | ||||
-rw-r--r-- | drivers/usb/gadget/f_phonet.c | 2 | ||||
-rw-r--r-- | drivers/usb/serial/option.c | 6 | ||||
-rw-r--r-- | drivers/vhost/net.c | 2 | ||||
-rw-r--r-- | drivers/vhost/vhost.c | 11 | ||||
-rw-r--r-- | drivers/vhost/vhost.h | 2 |
14 files changed, 72 insertions, 50 deletions
diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c index d9428f0e738a..e7bed5303997 100644 --- a/drivers/net/ethernet/freescale/gianfar.c +++ b/drivers/net/ethernet/freescale/gianfar.c | |||
@@ -968,7 +968,6 @@ static int gfar_probe(struct platform_device *ofdev) | |||
968 | struct gfar_private *priv = NULL; | 968 | struct gfar_private *priv = NULL; |
969 | struct gfar __iomem *regs = NULL; | 969 | struct gfar __iomem *regs = NULL; |
970 | int err = 0, i, grp_idx = 0; | 970 | int err = 0, i, grp_idx = 0; |
971 | int len_devname; | ||
972 | u32 rstat = 0, tstat = 0, rqueue = 0, tqueue = 0; | 971 | u32 rstat = 0, tstat = 0, rqueue = 0, tqueue = 0; |
973 | u32 isrg = 0; | 972 | u32 isrg = 0; |
974 | u32 __iomem *baddr; | 973 | u32 __iomem *baddr; |
@@ -1169,40 +1168,16 @@ static int gfar_probe(struct platform_device *ofdev) | |||
1169 | priv->device_flags & FSL_GIANFAR_DEV_HAS_MAGIC_PACKET); | 1168 | priv->device_flags & FSL_GIANFAR_DEV_HAS_MAGIC_PACKET); |
1170 | 1169 | ||
1171 | /* fill out IRQ number and name fields */ | 1170 | /* fill out IRQ number and name fields */ |
1172 | len_devname = strlen(dev->name); | ||
1173 | for (i = 0; i < priv->num_grps; i++) { | 1171 | for (i = 0; i < priv->num_grps; i++) { |
1174 | strncpy(&priv->gfargrp[i].int_name_tx[0], dev->name, | ||
1175 | len_devname); | ||
1176 | if (priv->device_flags & FSL_GIANFAR_DEV_HAS_MULTI_INTR) { | 1172 | if (priv->device_flags & FSL_GIANFAR_DEV_HAS_MULTI_INTR) { |
1177 | strncpy(&priv->gfargrp[i].int_name_tx[len_devname], | 1173 | sprintf(priv->gfargrp[i].int_name_tx, "%s%s%c%s", |
1178 | "_g", sizeof("_g")); | 1174 | dev->name, "_g", '0' + i, "_tx"); |
1179 | priv->gfargrp[i].int_name_tx[ | 1175 | sprintf(priv->gfargrp[i].int_name_rx, "%s%s%c%s", |
1180 | strlen(priv->gfargrp[i].int_name_tx)] = i+48; | 1176 | dev->name, "_g", '0' + i, "_rx"); |
1181 | strncpy(&priv->gfargrp[i].int_name_tx[strlen( | 1177 | sprintf(priv->gfargrp[i].int_name_er, "%s%s%c%s", |
1182 | priv->gfargrp[i].int_name_tx)], | 1178 | dev->name, "_g", '0' + i, "_er"); |
1183 | "_tx", sizeof("_tx") + 1); | ||
1184 | |||
1185 | strncpy(&priv->gfargrp[i].int_name_rx[0], dev->name, | ||
1186 | len_devname); | ||
1187 | strncpy(&priv->gfargrp[i].int_name_rx[len_devname], | ||
1188 | "_g", sizeof("_g")); | ||
1189 | priv->gfargrp[i].int_name_rx[ | ||
1190 | strlen(priv->gfargrp[i].int_name_rx)] = i+48; | ||
1191 | strncpy(&priv->gfargrp[i].int_name_rx[strlen( | ||
1192 | priv->gfargrp[i].int_name_rx)], | ||
1193 | "_rx", sizeof("_rx") + 1); | ||
1194 | |||
1195 | strncpy(&priv->gfargrp[i].int_name_er[0], dev->name, | ||
1196 | len_devname); | ||
1197 | strncpy(&priv->gfargrp[i].int_name_er[len_devname], | ||
1198 | "_g", sizeof("_g")); | ||
1199 | priv->gfargrp[i].int_name_er[strlen( | ||
1200 | priv->gfargrp[i].int_name_er)] = i+48; | ||
1201 | strncpy(&priv->gfargrp[i].int_name_er[strlen(\ | ||
1202 | priv->gfargrp[i].int_name_er)], | ||
1203 | "_er", sizeof("_er") + 1); | ||
1204 | } else | 1179 | } else |
1205 | priv->gfargrp[i].int_name_tx[len_devname] = '\0'; | 1180 | strcpy(priv->gfargrp[i].int_name_tx, dev->name); |
1206 | } | 1181 | } |
1207 | 1182 | ||
1208 | /* Initialize the filer table */ | 1183 | /* Initialize the filer table */ |
diff --git a/drivers/net/ethernet/freescale/gianfar.h b/drivers/net/ethernet/freescale/gianfar.h index fc2488adca36..4c9f8d487dbb 100644 --- a/drivers/net/ethernet/freescale/gianfar.h +++ b/drivers/net/ethernet/freescale/gianfar.h | |||
@@ -517,7 +517,7 @@ extern const char gfar_driver_version[]; | |||
517 | #define RXFCB_PERR_MASK 0x000c | 517 | #define RXFCB_PERR_MASK 0x000c |
518 | #define RXFCB_PERR_BADL3 0x0008 | 518 | #define RXFCB_PERR_BADL3 0x0008 |
519 | 519 | ||
520 | #define GFAR_INT_NAME_MAX IFNAMSIZ + 4 | 520 | #define GFAR_INT_NAME_MAX (IFNAMSIZ + 6) /* '_g#_xx' */ |
521 | 521 | ||
522 | struct txbd8 | 522 | struct txbd8 |
523 | { | 523 | { |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h index 2b5af22419a5..385a4d5c7c25 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | |||
@@ -36,8 +36,8 @@ | |||
36 | 36 | ||
37 | #define _QLCNIC_LINUX_MAJOR 5 | 37 | #define _QLCNIC_LINUX_MAJOR 5 |
38 | #define _QLCNIC_LINUX_MINOR 0 | 38 | #define _QLCNIC_LINUX_MINOR 0 |
39 | #define _QLCNIC_LINUX_SUBVERSION 25 | 39 | #define _QLCNIC_LINUX_SUBVERSION 27 |
40 | #define QLCNIC_LINUX_VERSIONID "5.0.26" | 40 | #define QLCNIC_LINUX_VERSIONID "5.0.27" |
41 | #define QLCNIC_DRV_IDC_VER 0x01 | 41 | #define QLCNIC_DRV_IDC_VER 0x01 |
42 | #define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\ | 42 | #define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\ |
43 | (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION)) | 43 | (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION)) |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c index 81bb1a69e69f..75c32e875fef 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | |||
@@ -1458,8 +1458,10 @@ qlcnic_reset_context(struct qlcnic_adapter *adapter) | |||
1458 | 1458 | ||
1459 | if (netif_running(netdev)) { | 1459 | if (netif_running(netdev)) { |
1460 | err = qlcnic_attach(adapter); | 1460 | err = qlcnic_attach(adapter); |
1461 | if (!err) | 1461 | if (!err) { |
1462 | __qlcnic_up(adapter, netdev); | 1462 | __qlcnic_up(adapter, netdev); |
1463 | qlcnic_restore_indev_addr(netdev, NETDEV_UP); | ||
1464 | } | ||
1463 | } | 1465 | } |
1464 | 1466 | ||
1465 | netif_device_attach(netdev); | 1467 | netif_device_attach(netdev); |
diff --git a/drivers/net/usb/cdc-phonet.c b/drivers/net/usb/cdc-phonet.c index 790cbdea7392..3886b30ed373 100644 --- a/drivers/net/usb/cdc-phonet.c +++ b/drivers/net/usb/cdc-phonet.c | |||
@@ -164,12 +164,14 @@ static void rx_complete(struct urb *req) | |||
164 | /* Can't use pskb_pull() on page in IRQ */ | 164 | /* Can't use pskb_pull() on page in IRQ */ |
165 | memcpy(skb_put(skb, 1), page_address(page), 1); | 165 | memcpy(skb_put(skb, 1), page_address(page), 1); |
166 | skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, | 166 | skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, |
167 | page, 1, req->actual_length); | 167 | page, 1, req->actual_length, |
168 | req->actual_length); | ||
168 | page = NULL; | 169 | page = NULL; |
169 | } | 170 | } |
170 | } else { | 171 | } else { |
171 | skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, | 172 | skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, |
172 | page, 0, req->actual_length); | 173 | page, 0, req->actual_length, |
174 | req->actual_length); | ||
173 | page = NULL; | 175 | page = NULL; |
174 | } | 176 | } |
175 | if (req->actual_length < PAGE_SIZE) | 177 | if (req->actual_length < PAGE_SIZE) |
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index aac68f5195c0..552d24bf862e 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c | |||
@@ -409,6 +409,42 @@ static const struct usb_device_id products[] = { | |||
409 | .bInterfaceProtocol = 0xff, | 409 | .bInterfaceProtocol = 0xff, |
410 | .driver_info = (unsigned long)&qmi_wwan_force_int4, | 410 | .driver_info = (unsigned long)&qmi_wwan_force_int4, |
411 | }, | 411 | }, |
412 | { /* ZTE (Vodafone) K3565-Z */ | ||
413 | .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, | ||
414 | .idVendor = 0x19d2, | ||
415 | .idProduct = 0x0063, | ||
416 | .bInterfaceClass = 0xff, | ||
417 | .bInterfaceSubClass = 0xff, | ||
418 | .bInterfaceProtocol = 0xff, | ||
419 | .driver_info = (unsigned long)&qmi_wwan_force_int4, | ||
420 | }, | ||
421 | { /* ZTE (Vodafone) K3570-Z */ | ||
422 | .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, | ||
423 | .idVendor = 0x19d2, | ||
424 | .idProduct = 0x1008, | ||
425 | .bInterfaceClass = 0xff, | ||
426 | .bInterfaceSubClass = 0xff, | ||
427 | .bInterfaceProtocol = 0xff, | ||
428 | .driver_info = (unsigned long)&qmi_wwan_force_int4, | ||
429 | }, | ||
430 | { /* ZTE (Vodafone) K3571-Z */ | ||
431 | .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, | ||
432 | .idVendor = 0x19d2, | ||
433 | .idProduct = 0x1010, | ||
434 | .bInterfaceClass = 0xff, | ||
435 | .bInterfaceSubClass = 0xff, | ||
436 | .bInterfaceProtocol = 0xff, | ||
437 | .driver_info = (unsigned long)&qmi_wwan_force_int4, | ||
438 | }, | ||
439 | { /* ZTE (Vodafone) K4505-Z */ | ||
440 | .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, | ||
441 | .idVendor = 0x19d2, | ||
442 | .idProduct = 0x0104, | ||
443 | .bInterfaceClass = 0xff, | ||
444 | .bInterfaceSubClass = 0xff, | ||
445 | .bInterfaceProtocol = 0xff, | ||
446 | .driver_info = (unsigned long)&qmi_wwan_force_int4, | ||
447 | }, | ||
412 | {QMI_GOBI_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */ | 448 | {QMI_GOBI_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */ |
413 | {QMI_GOBI_DEVICE(0x03f0, 0x1f1d)}, /* HP un2400 Gobi Modem Device */ | 449 | {QMI_GOBI_DEVICE(0x03f0, 0x1f1d)}, /* HP un2400 Gobi Modem Device */ |
414 | {QMI_GOBI_DEVICE(0x03f0, 0x371d)}, /* HP un2430 Mobile Broadband Module */ | 450 | {QMI_GOBI_DEVICE(0x03f0, 0x371d)}, /* HP un2430 Mobile Broadband Module */ |
diff --git a/drivers/net/wireless/iwlegacy/3945.c b/drivers/net/wireless/iwlegacy/3945.c index c5b1d199e0bc..b25c01be0d90 100644 --- a/drivers/net/wireless/iwlegacy/3945.c +++ b/drivers/net/wireless/iwlegacy/3945.c | |||
@@ -499,7 +499,8 @@ il3945_pass_packet_to_mac80211(struct il_priv *il, struct il_rx_buf *rxb, | |||
499 | le32_to_cpu(rx_end->status), stats); | 499 | le32_to_cpu(rx_end->status), stats); |
500 | 500 | ||
501 | skb_add_rx_frag(skb, 0, rxb->page, | 501 | skb_add_rx_frag(skb, 0, rxb->page, |
502 | (void *)rx_hdr->payload - (void *)pkt, len); | 502 | (void *)rx_hdr->payload - (void *)pkt, len, |
503 | len); | ||
503 | 504 | ||
504 | il_update_stats(il, false, fc, len); | 505 | il_update_stats(il, false, fc, len); |
505 | memcpy(IEEE80211_SKB_RXCB(skb), stats, sizeof(*stats)); | 506 | memcpy(IEEE80211_SKB_RXCB(skb), stats, sizeof(*stats)); |
diff --git a/drivers/net/wireless/iwlegacy/4965-mac.c b/drivers/net/wireless/iwlegacy/4965-mac.c index 7b54dbb338be..17f1c6853182 100644 --- a/drivers/net/wireless/iwlegacy/4965-mac.c +++ b/drivers/net/wireless/iwlegacy/4965-mac.c | |||
@@ -596,7 +596,8 @@ il4965_pass_packet_to_mac80211(struct il_priv *il, struct ieee80211_hdr *hdr, | |||
596 | return; | 596 | return; |
597 | } | 597 | } |
598 | 598 | ||
599 | skb_add_rx_frag(skb, 0, rxb->page, (void *)hdr - rxb_addr(rxb), len); | 599 | skb_add_rx_frag(skb, 0, rxb->page, (void *)hdr - rxb_addr(rxb), len, |
600 | len); | ||
600 | 601 | ||
601 | il_update_stats(il, false, fc, len); | 602 | il_update_stats(il, false, fc, len); |
602 | memcpy(IEEE80211_SKB_RXCB(skb), stats, sizeof(*stats)); | 603 | memcpy(IEEE80211_SKB_RXCB(skb), stats, sizeof(*stats)); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rx.c b/drivers/net/wireless/iwlwifi/iwl-agn-rx.c index 44c6f712b77d..f4b84d1596e3 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-rx.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rx.c | |||
@@ -796,7 +796,7 @@ static void iwlagn_pass_packet_to_mac80211(struct iwl_priv *priv, | |||
796 | 796 | ||
797 | offset = (void *)hdr - rxb_addr(rxb); | 797 | offset = (void *)hdr - rxb_addr(rxb); |
798 | p = rxb_steal_page(rxb); | 798 | p = rxb_steal_page(rxb); |
799 | skb_add_rx_frag(skb, 0, p, offset, len); | 799 | skb_add_rx_frag(skb, 0, p, offset, len, len); |
800 | 800 | ||
801 | iwl_update_stats(priv, false, fc, len); | 801 | iwl_update_stats(priv, false, fc, len); |
802 | 802 | ||
diff --git a/drivers/usb/gadget/f_phonet.c b/drivers/usb/gadget/f_phonet.c index 7cdcb63b21ff..85a5cebe96b3 100644 --- a/drivers/usb/gadget/f_phonet.c +++ b/drivers/usb/gadget/f_phonet.c | |||
@@ -345,7 +345,7 @@ static void pn_rx_complete(struct usb_ep *ep, struct usb_request *req) | |||
345 | } | 345 | } |
346 | 346 | ||
347 | skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, page, | 347 | skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, page, |
348 | skb->len <= 1, req->actual); | 348 | skb->len <= 1, req->actual, req->actual); |
349 | page = NULL; | 349 | page = NULL; |
350 | 350 | ||
351 | if (req->actual < req->length) { /* Last fragment */ | 351 | if (req->actual < req->length) { /* Last fragment */ |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 6815701cf656..836cfa9a515f 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -903,8 +903,10 @@ static const struct usb_device_id option_ids[] = { | |||
903 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0165, 0xff, 0xff, 0xff) }, | 903 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0165, 0xff, 0xff, 0xff) }, |
904 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0167, 0xff, 0xff, 0xff), | 904 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0167, 0xff, 0xff, 0xff), |
905 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | 905 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
906 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff) }, | 906 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff), |
907 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff) }, | 907 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
908 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff), | ||
909 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
908 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff) }, | 910 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff) }, |
909 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1057, 0xff, 0xff, 0xff) }, | 911 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1057, 0xff, 0xff, 0xff) }, |
910 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1058, 0xff, 0xff, 0xff) }, | 912 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1058, 0xff, 0xff, 0xff) }, |
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index 9dab1f51dd43..f0da2c32fbde 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c | |||
@@ -588,7 +588,7 @@ static int vhost_net_release(struct inode *inode, struct file *f) | |||
588 | 588 | ||
589 | vhost_net_stop(n, &tx_sock, &rx_sock); | 589 | vhost_net_stop(n, &tx_sock, &rx_sock); |
590 | vhost_net_flush(n); | 590 | vhost_net_flush(n); |
591 | vhost_dev_cleanup(&n->dev); | 591 | vhost_dev_cleanup(&n->dev, false); |
592 | if (tx_sock) | 592 | if (tx_sock) |
593 | fput(tx_sock->file); | 593 | fput(tx_sock->file); |
594 | if (rx_sock) | 594 | if (rx_sock) |
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c index bdb2d6436b2b..947f00d8e091 100644 --- a/drivers/vhost/vhost.c +++ b/drivers/vhost/vhost.c | |||
@@ -222,6 +222,8 @@ static int vhost_worker(void *data) | |||
222 | if (work) { | 222 | if (work) { |
223 | __set_current_state(TASK_RUNNING); | 223 | __set_current_state(TASK_RUNNING); |
224 | work->fn(work); | 224 | work->fn(work); |
225 | if (need_resched()) | ||
226 | schedule(); | ||
225 | } else | 227 | } else |
226 | schedule(); | 228 | schedule(); |
227 | 229 | ||
@@ -403,7 +405,7 @@ long vhost_dev_reset_owner(struct vhost_dev *dev) | |||
403 | if (!memory) | 405 | if (!memory) |
404 | return -ENOMEM; | 406 | return -ENOMEM; |
405 | 407 | ||
406 | vhost_dev_cleanup(dev); | 408 | vhost_dev_cleanup(dev, true); |
407 | 409 | ||
408 | memory->nregions = 0; | 410 | memory->nregions = 0; |
409 | RCU_INIT_POINTER(dev->memory, memory); | 411 | RCU_INIT_POINTER(dev->memory, memory); |
@@ -434,8 +436,8 @@ int vhost_zerocopy_signal_used(struct vhost_virtqueue *vq) | |||
434 | return j; | 436 | return j; |
435 | } | 437 | } |
436 | 438 | ||
437 | /* Caller should have device mutex */ | 439 | /* Caller should have device mutex if and only if locked is set */ |
438 | void vhost_dev_cleanup(struct vhost_dev *dev) | 440 | void vhost_dev_cleanup(struct vhost_dev *dev, bool locked) |
439 | { | 441 | { |
440 | int i; | 442 | int i; |
441 | 443 | ||
@@ -472,7 +474,8 @@ void vhost_dev_cleanup(struct vhost_dev *dev) | |||
472 | dev->log_file = NULL; | 474 | dev->log_file = NULL; |
473 | /* No one will access memory at this point */ | 475 | /* No one will access memory at this point */ |
474 | kfree(rcu_dereference_protected(dev->memory, | 476 | kfree(rcu_dereference_protected(dev->memory, |
475 | lockdep_is_held(&dev->mutex))); | 477 | locked == |
478 | lockdep_is_held(&dev->mutex))); | ||
476 | RCU_INIT_POINTER(dev->memory, NULL); | 479 | RCU_INIT_POINTER(dev->memory, NULL); |
477 | WARN_ON(!list_empty(&dev->work_list)); | 480 | WARN_ON(!list_empty(&dev->work_list)); |
478 | if (dev->worker) { | 481 | if (dev->worker) { |
diff --git a/drivers/vhost/vhost.h b/drivers/vhost/vhost.h index a801e2821d03..8dcf4cca6bf2 100644 --- a/drivers/vhost/vhost.h +++ b/drivers/vhost/vhost.h | |||
@@ -163,7 +163,7 @@ struct vhost_dev { | |||
163 | long vhost_dev_init(struct vhost_dev *, struct vhost_virtqueue *vqs, int nvqs); | 163 | long vhost_dev_init(struct vhost_dev *, struct vhost_virtqueue *vqs, int nvqs); |
164 | long vhost_dev_check_owner(struct vhost_dev *); | 164 | long vhost_dev_check_owner(struct vhost_dev *); |
165 | long vhost_dev_reset_owner(struct vhost_dev *); | 165 | long vhost_dev_reset_owner(struct vhost_dev *); |
166 | void vhost_dev_cleanup(struct vhost_dev *); | 166 | void vhost_dev_cleanup(struct vhost_dev *, bool locked); |
167 | long vhost_dev_ioctl(struct vhost_dev *, unsigned int ioctl, unsigned long arg); | 167 | long vhost_dev_ioctl(struct vhost_dev *, unsigned int ioctl, unsigned long arg); |
168 | int vhost_vq_access_ok(struct vhost_virtqueue *vq); | 168 | int vhost_vq_access_ok(struct vhost_virtqueue *vq); |
169 | int vhost_log_access_ok(struct vhost_dev *); | 169 | int vhost_log_access_ok(struct vhost_dev *); |