]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.18-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 20 Jan 2015 07:23:40 +0000 (15:23 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 20 Jan 2015 07:23:40 +0000 (15:23 +0800)
added patches:
asus-nb-wmi-add-another-wapf-4-quirk.patch
hp_accel-add-support-for-hp-zbook-15.patch
ib-iser-fix-possible-sq-overflow.patch
rtlwifi-fix-error-when-accessing-unmapped-memory-in-skb.patch
rtlwifi-rtl8192ce-set-fw_ready-flag.patch
tcm_loop-fix-wrong-i_t-nexus-association.patch
tick-powerclamp-remove-tick_nohz_idle-abuse.patch
uapi-linux-target_core_user.h-fix-headers_install.sh-badness.patch

queue-3.18/asus-nb-wmi-add-another-wapf-4-quirk.patch [new file with mode: 0644]
queue-3.18/hp_accel-add-support-for-hp-zbook-15.patch [new file with mode: 0644]
queue-3.18/ib-iser-fix-possible-sq-overflow.patch [new file with mode: 0644]
queue-3.18/rtlwifi-fix-error-when-accessing-unmapped-memory-in-skb.patch [new file with mode: 0644]
queue-3.18/rtlwifi-rtl8192ce-set-fw_ready-flag.patch [new file with mode: 0644]
queue-3.18/series
queue-3.18/tcm_loop-fix-wrong-i_t-nexus-association.patch [new file with mode: 0644]
queue-3.18/tick-powerclamp-remove-tick_nohz_idle-abuse.patch [new file with mode: 0644]
queue-3.18/uapi-linux-target_core_user.h-fix-headers_install.sh-badness.patch [new file with mode: 0644]

diff --git a/queue-3.18/asus-nb-wmi-add-another-wapf-4-quirk.patch b/queue-3.18/asus-nb-wmi-add-another-wapf-4-quirk.patch
new file mode 100644 (file)
index 0000000..2d996fb
--- /dev/null
@@ -0,0 +1,39 @@
+From 841e11ccdf90c29a7778a5d5d553bc716c3d477a Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede@redhat.com>
+Date: Mon, 24 Nov 2014 11:26:32 +0100
+Subject: asus-nb-wmi: Add another wapf=4 quirk
+
+From: Hans de Goede <hdegoede@redhat.com>
+
+commit 841e11ccdf90c29a7778a5d5d553bc716c3d477a upstream.
+
+Wifi on this laptop does not work unless asus-nb-wmi.wapf=4 is specified on
+the kerne commandline, add a quirk for this.
+
+BugLink: https://bugs.launchpad.net/bugs/1173681
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+Signed-off-by: Darren Hart <dvhart@linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/platform/x86/asus-nb-wmi.c |    9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+--- a/drivers/platform/x86/asus-nb-wmi.c
++++ b/drivers/platform/x86/asus-nb-wmi.c
+@@ -191,6 +191,15 @@ static const struct dmi_system_id asus_q
+       },
+       {
+               .callback = dmi_matched,
++              .ident = "ASUSTeK COMPUTER INC. X551CA",
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "X551CA"),
++              },
++              .driver_data = &quirk_asus_wapf4,
++      },
++      {
++              .callback = dmi_matched,
+               .ident = "ASUSTeK COMPUTER INC. X55A",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
diff --git a/queue-3.18/hp_accel-add-support-for-hp-zbook-15.patch b/queue-3.18/hp_accel-add-support-for-hp-zbook-15.patch
new file mode 100644 (file)
index 0000000..ff24599
--- /dev/null
@@ -0,0 +1,31 @@
+From 6583659e0f92e38079a8dd081e0a1181a0f37747 Mon Sep 17 00:00:00 2001
+From: Dominique Leuenberger <dimstar@opensuse.org>
+Date: Thu, 13 Nov 2014 20:57:37 +0100
+Subject: hp_accel: Add support for HP ZBook 15
+
+From: Dominique Leuenberger <dimstar@opensuse.org>
+
+commit 6583659e0f92e38079a8dd081e0a1181a0f37747 upstream.
+
+HP ZBook 15 laptop needs a non-standard mapping (x_inverted).
+
+BugLink: http://bugzilla.opensuse.org/show_bug.cgi?id=905329
+Signed-off-by: Dominique Leuenberger <dimstar@opensuse.org>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Darren Hart <dvhart@linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/platform/x86/hp_accel.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/platform/x86/hp_accel.c
++++ b/drivers/platform/x86/hp_accel.c
+@@ -246,6 +246,7 @@ static const struct dmi_system_id lis3lv
+       AXIS_DMI_MATCH("HPB64xx", "HP ProBook 64", xy_swap),
+       AXIS_DMI_MATCH("HPB64xx", "HP EliteBook 84", xy_swap),
+       AXIS_DMI_MATCH("HPB65xx", "HP ProBook 65", x_inverted),
++      AXIS_DMI_MATCH("HPZBook15", "HP ZBook 15", x_inverted),
+       { NULL, }
+ /* Laptop models without axis info (yet):
+  * "NC6910" "HP Compaq 6910"
diff --git a/queue-3.18/ib-iser-fix-possible-sq-overflow.patch b/queue-3.18/ib-iser-fix-possible-sq-overflow.patch
new file mode 100644 (file)
index 0000000..8452a90
--- /dev/null
@@ -0,0 +1,79 @@
+From 6ec9d4d2310e8fc54fc638e4454271d1fcaefa95 Mon Sep 17 00:00:00 2001
+From: Max Gurtovoy <maxg@mellanox.com>
+Date: Sun, 7 Dec 2014 16:09:56 +0200
+Subject: IB/iser: Fix possible SQ overflow
+
+From: Max Gurtovoy <maxg@mellanox.com>
+
+commit 6ec9d4d2310e8fc54fc638e4454271d1fcaefa95 upstream.
+
+Fix a regression was introduced in commit 6df5a128f0fd ("IB/iser:
+Suppress scsi command send completions").
+
+The sig_count was wrongly set to be static variable, thus it is
+possible that we won't reach to (sig_count % ISER_SIGNAL_BATCH) == 0
+condition (due to races) and the send queue will be overflowed.
+
+Instead keep sig_count per connection. We don't need it to be atomic
+as we are safe under the iscsi session frwd_lock taken by libiscsi on
+the queuecommand path.
+
+Fixes: 6df5a128f0fd ("IB/iser: Suppress scsi command send completions")
+Signed-off-by: Max Gurtovoy <maxg@mellanox.com>
+Signed-off-by: Sagi Grimberg <sagig@mellanox.com>
+Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
+Signed-off-by: Roland Dreier <roland@purestorage.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/infiniband/ulp/iser/iscsi_iser.h     |    2 ++
+ drivers/infiniband/ulp/iser/iser_initiator.c |    6 +++---
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+--- a/drivers/infiniband/ulp/iser/iscsi_iser.h
++++ b/drivers/infiniband/ulp/iser/iscsi_iser.h
+@@ -432,6 +432,7 @@ struct fast_reg_descriptor {
+  * @cma_id:              rdma_cm connection maneger handle
+  * @qp:                  Connection Queue-pair
+  * @post_recv_buf_count: post receive counter
++ * @sig_count:           send work request signal count
+  * @rx_wr:               receive work request for batch posts
+  * @device:              reference to iser device
+  * @comp:                iser completion context
+@@ -452,6 +453,7 @@ struct ib_conn {
+       struct rdma_cm_id           *cma_id;
+       struct ib_qp                *qp;
+       int                          post_recv_buf_count;
++      u8                           sig_count;
+       struct ib_recv_wr            rx_wr[ISER_MIN_POSTED_RX];
+       struct iser_device          *device;
+       struct iser_comp            *comp;
+--- a/drivers/infiniband/ulp/iser/iser_initiator.c
++++ b/drivers/infiniband/ulp/iser/iser_initiator.c
+@@ -369,7 +369,7 @@ static int iser_post_rx_bufs(struct iscs
+       return 0;
+ }
+-static inline bool iser_signal_comp(int sig_count)
++static inline bool iser_signal_comp(u8 sig_count)
+ {
+       return ((sig_count % ISER_SIGNAL_CMD_COUNT) == 0);
+ }
+@@ -388,7 +388,7 @@ int iser_send_command(struct iscsi_conn
+       struct iscsi_scsi_req *hdr = (struct iscsi_scsi_req *)task->hdr;
+       struct scsi_cmnd *sc  =  task->sc;
+       struct iser_tx_desc *tx_desc = &iser_task->desc;
+-      static unsigned sig_count;
++      u8 sig_count = ++iser_conn->ib_conn.sig_count;
+       edtl = ntohl(hdr->data_length);
+@@ -435,7 +435,7 @@ int iser_send_command(struct iscsi_conn
+       iser_task->status = ISER_TASK_STATUS_STARTED;
+       err = iser_post_send(&iser_conn->ib_conn, tx_desc,
+-                           iser_signal_comp(++sig_count));
++                           iser_signal_comp(sig_count));
+       if (!err)
+               return 0;
diff --git a/queue-3.18/rtlwifi-fix-error-when-accessing-unmapped-memory-in-skb.patch b/queue-3.18/rtlwifi-fix-error-when-accessing-unmapped-memory-in-skb.patch
new file mode 100644 (file)
index 0000000..aead654
--- /dev/null
@@ -0,0 +1,125 @@
+From e9538cf4f90713eca71b1d6a74b4eae1d445c664 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger@lwfinger.net>
+Date: Tue, 30 Dec 2014 21:33:07 -0600
+Subject: rtlwifi: Fix error when accessing unmapped memory in skb
+
+From: Larry Finger <Larry.Finger@lwfinger.net>
+
+commit e9538cf4f90713eca71b1d6a74b4eae1d445c664 upstream.
+
+These drivers use 9100-byte receive buffers, thus allocating an skb requires
+an O(3) memory allocation. Under heavy memory loads and fragmentation, such
+a request can fail. Previous versions of the driver have dropped the packet
+and reused the old buffer; however, the new version introduced a bug in that
+it released the old buffer before trying to allocate a new one. The previous
+method is implemented here. The skb is unmapped before any attempt is made to
+allocate another.
+
+Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
+Reported-by: Eric Biggers <ebiggers3@gmail.com>
+Cc: Eric Biggers <ebiggers3@gmail.com>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/net/wireless/rtlwifi/pci.c |   32 ++++++++++++++++++++++++--------
+ 1 file changed, 24 insertions(+), 8 deletions(-)
+
+--- a/drivers/net/wireless/rtlwifi/pci.c
++++ b/drivers/net/wireless/rtlwifi/pci.c
+@@ -666,7 +666,8 @@ tx_status_ok:
+ }
+ static int _rtl_pci_init_one_rxdesc(struct ieee80211_hw *hw,
+-                                  u8 *entry, int rxring_idx, int desc_idx)
++                                  struct sk_buff *new_skb, u8 *entry,
++                                  int rxring_idx, int desc_idx)
+ {
+       struct rtl_priv *rtlpriv = rtl_priv(hw);
+       struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
+@@ -674,11 +675,15 @@ static int _rtl_pci_init_one_rxdesc(stru
+       u8 tmp_one = 1;
+       struct sk_buff *skb;
++      if (likely(new_skb)) {
++              skb = new_skb;
++              goto remap;
++      }
+       skb = dev_alloc_skb(rtlpci->rxbuffersize);
+       if (!skb)
+               return 0;
+-      rtlpci->rx_ring[rxring_idx].rx_buf[desc_idx] = skb;
++remap:
+       /* just set skb->cb to mapping addr for pci_unmap_single use */
+       *((dma_addr_t *)skb->cb) =
+               pci_map_single(rtlpci->pdev, skb_tail_pointer(skb),
+@@ -686,6 +691,7 @@ static int _rtl_pci_init_one_rxdesc(stru
+       bufferaddress = *((dma_addr_t *)skb->cb);
+       if (pci_dma_mapping_error(rtlpci->pdev, bufferaddress))
+               return 0;
++      rtlpci->rx_ring[rxring_idx].rx_buf[desc_idx] = skb;
+       if (rtlpriv->use_new_trx_flow) {
+               rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false,
+                                           HW_DESC_RX_PREPARE,
+@@ -781,6 +787,7 @@ static void _rtl_pci_rx_interrupt(struct
+               /*rx pkt */
+               struct sk_buff *skb = rtlpci->rx_ring[rxring_idx].rx_buf[
+                                     rtlpci->rx_ring[rxring_idx].idx];
++              struct sk_buff *new_skb;
+               if (rtlpriv->use_new_trx_flow) {
+                       rx_remained_cnt =
+@@ -807,6 +814,13 @@ static void _rtl_pci_rx_interrupt(struct
+               pci_unmap_single(rtlpci->pdev, *((dma_addr_t *)skb->cb),
+                                rtlpci->rxbuffersize, PCI_DMA_FROMDEVICE);
++              /* get a new skb - if fail, old one will be reused */
++              new_skb = dev_alloc_skb(rtlpci->rxbuffersize);
++              if (unlikely(!new_skb)) {
++                      pr_err("Allocation of new skb failed in %s\n",
++                             __func__);
++                      goto no_new;
++              }
+               if (rtlpriv->use_new_trx_flow) {
+                       buffer_desc =
+                         &rtlpci->rx_ring[rxring_idx].buffer_desc
+@@ -911,14 +925,16 @@ static void _rtl_pci_rx_interrupt(struct
+                       schedule_work(&rtlpriv->works.lps_change_work);
+               }
+ end:
++              skb = new_skb;
++no_new:
+               if (rtlpriv->use_new_trx_flow) {
+-                      _rtl_pci_init_one_rxdesc(hw, (u8 *)buffer_desc,
++                      _rtl_pci_init_one_rxdesc(hw, skb, (u8 *)buffer_desc,
+                                                rxring_idx,
+-                                             rtlpci->rx_ring[rxring_idx].idx);
++                                               rtlpci->rx_ring[rxring_idx].idx);
+               } else {
+-                      _rtl_pci_init_one_rxdesc(hw, (u8 *)pdesc, rxring_idx,
++                      _rtl_pci_init_one_rxdesc(hw, skb, (u8 *)pdesc,
++                                               rxring_idx,
+                                                rtlpci->rx_ring[rxring_idx].idx);
+-
+                       if (rtlpci->rx_ring[rxring_idx].idx ==
+                           rtlpci->rxringcount - 1)
+                               rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc,
+@@ -1307,7 +1323,7 @@ static int _rtl_pci_init_rx_ring(struct
+               rtlpci->rx_ring[rxring_idx].idx = 0;
+               for (i = 0; i < rtlpci->rxringcount; i++) {
+                       entry = &rtlpci->rx_ring[rxring_idx].buffer_desc[i];
+-                      if (!_rtl_pci_init_one_rxdesc(hw, (u8 *)entry,
++                      if (!_rtl_pci_init_one_rxdesc(hw, NULL, (u8 *)entry,
+                                                     rxring_idx, i))
+                               return -ENOMEM;
+               }
+@@ -1332,7 +1348,7 @@ static int _rtl_pci_init_rx_ring(struct
+               for (i = 0; i < rtlpci->rxringcount; i++) {
+                       entry = &rtlpci->rx_ring[rxring_idx].desc[i];
+-                      if (!_rtl_pci_init_one_rxdesc(hw, (u8 *)entry,
++                      if (!_rtl_pci_init_one_rxdesc(hw, NULL, (u8 *)entry,
+                                                     rxring_idx, i))
+                               return -ENOMEM;
+               }
diff --git a/queue-3.18/rtlwifi-rtl8192ce-set-fw_ready-flag.patch b/queue-3.18/rtlwifi-rtl8192ce-set-fw_ready-flag.patch
new file mode 100644 (file)
index 0000000..2187e84
--- /dev/null
@@ -0,0 +1,37 @@
+From 9a1dce3a059111a7289680f4b8c0ec4f8736b6ee Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger@lwfinger.net>
+Date: Wed, 10 Dec 2014 14:38:29 -0600
+Subject: rtlwifi: rtl8192ce: Set fw_ready flag
+
+From: Larry Finger <Larry.Finger@lwfinger.net>
+
+commit 9a1dce3a059111a7289680f4b8c0ec4f8736b6ee upstream.
+
+The setting of this flag was missed in previous modifications.
+
+Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
+Signed-off-by: John W. Linville <linville@tuxdriver.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/net/wireless/rtlwifi/rtl8192ce/hw.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
+@@ -955,6 +955,7 @@ int rtl92ce_hw_init(struct ieee80211_hw
+       local_save_flags(flags);
+       local_irq_enable();
++      rtlhal->fw_ready = false;
+       rtlpriv->intf_ops->disable_aspm(hw);
+       rtstatus = _rtl92ce_init_mac(hw);
+       if (!rtstatus) {
+@@ -971,6 +972,7 @@ int rtl92ce_hw_init(struct ieee80211_hw
+               goto exit;
+       }
++      rtlhal->fw_ready = true;
+       rtlhal->last_hmeboxnum = 0;
+       rtl92c_phy_mac_config(hw);
+       /* because last function modify RCR, so we update
index b8166b20f12f27a08374b9bfd468020770a3336d..c1302ae08056c0d85f9dd584bba07fe20fb0fb18 100644 (file)
@@ -58,3 +58,11 @@ nl80211-check-matches-array-length-before-acessing-it.patch
 cfg80211-don-t-warn-about-two-consecutive-country-ie-hint.patch
 cfg80211-avoid-mem-leak-on-driver-hint-set.patch
 cfg80211-fix-160-mhz-channels-with-80-80-and-160-mhz-drivers.patch
+rtlwifi-rtl8192ce-set-fw_ready-flag.patch
+rtlwifi-fix-error-when-accessing-unmapped-memory-in-skb.patch
+asus-nb-wmi-add-another-wapf-4-quirk.patch
+hp_accel-add-support-for-hp-zbook-15.patch
+tick-powerclamp-remove-tick_nohz_idle-abuse.patch
+uapi-linux-target_core_user.h-fix-headers_install.sh-badness.patch
+tcm_loop-fix-wrong-i_t-nexus-association.patch
+ib-iser-fix-possible-sq-overflow.patch
diff --git a/queue-3.18/tcm_loop-fix-wrong-i_t-nexus-association.patch b/queue-3.18/tcm_loop-fix-wrong-i_t-nexus-association.patch
new file mode 100644 (file)
index 0000000..6f43fa0
--- /dev/null
@@ -0,0 +1,225 @@
+From 506787a2c7daed45f0a213674ca706cbc83a9089 Mon Sep 17 00:00:00 2001
+From: Hannes Reinecke <hare@suse.de>
+Date: Wed, 26 Nov 2014 14:58:57 +0100
+Subject: tcm_loop: Fix wrong I_T nexus association
+
+From: Hannes Reinecke <hare@suse.de>
+
+commit 506787a2c7daed45f0a213674ca706cbc83a9089 upstream.
+
+tcm_loop has the I_T nexus associated with the HBA. This causes
+commands to become misdirected if the HBA has more than one
+target portal group; any command is then being sent to the
+first target portal group instead of the correct one.
+
+The nexus needs to be associated with the target portal group
+instead.
+
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/target/loopback/tcm_loop.c |   66 ++++++++++++-------------------------
+ drivers/target/loopback/tcm_loop.h |    7 ---
+ 2 files changed, 24 insertions(+), 49 deletions(-)
+
+--- a/drivers/target/loopback/tcm_loop.c
++++ b/drivers/target/loopback/tcm_loop.c
+@@ -190,7 +190,7 @@ static void tcm_loop_submission_work(str
+               set_host_byte(sc, DID_TRANSPORT_DISRUPTED);
+               goto out_done;
+       }
+-      tl_nexus = tl_hba->tl_nexus;
++      tl_nexus = tl_tpg->tl_nexus;
+       if (!tl_nexus) {
+               scmd_printk(KERN_ERR, sc, "TCM_Loop I_T Nexus"
+                               " does not exist\n");
+@@ -270,16 +270,26 @@ static int tcm_loop_queuecommand(struct
+  * to struct scsi_device
+  */
+ static int tcm_loop_issue_tmr(struct tcm_loop_tpg *tl_tpg,
+-                            struct tcm_loop_nexus *tl_nexus,
+                             int lun, int task, enum tcm_tmreq_table tmr)
+ {
+       struct se_cmd *se_cmd = NULL;
+       struct se_session *se_sess;
+       struct se_portal_group *se_tpg;
++      struct tcm_loop_nexus *tl_nexus;
+       struct tcm_loop_cmd *tl_cmd = NULL;
+       struct tcm_loop_tmr *tl_tmr = NULL;
+       int ret = TMR_FUNCTION_FAILED, rc;
++      /*
++       * Locate the tl_nexus and se_sess pointers
++       */
++      tl_nexus = tl_tpg->tl_nexus;
++      if (!tl_nexus) {
++              pr_err("Unable to perform device reset without"
++                              " active I_T Nexus\n");
++              return ret;
++      }
++
+       tl_cmd = kmem_cache_zalloc(tcm_loop_cmd_cache, GFP_KERNEL);
+       if (!tl_cmd) {
+               pr_err("Unable to allocate memory for tl_cmd\n");
+@@ -295,7 +305,7 @@ static int tcm_loop_issue_tmr(struct tcm
+       se_cmd = &tl_cmd->tl_se_cmd;
+       se_tpg = &tl_tpg->tl_se_tpg;
+-      se_sess = tl_nexus->se_sess;
++      se_sess = tl_tpg->tl_nexus->se_sess;
+       /*
+        * Initialize struct se_cmd descriptor from target_core_mod infrastructure
+        */
+@@ -340,7 +350,6 @@ release:
+ static int tcm_loop_abort_task(struct scsi_cmnd *sc)
+ {
+       struct tcm_loop_hba *tl_hba;
+-      struct tcm_loop_nexus *tl_nexus;
+       struct tcm_loop_tpg *tl_tpg;
+       int ret = FAILED;
+@@ -348,21 +357,8 @@ static int tcm_loop_abort_task(struct sc
+        * Locate the tcm_loop_hba_t pointer
+        */
+       tl_hba = *(struct tcm_loop_hba **)shost_priv(sc->device->host);
+-      /*
+-       * Locate the tl_nexus and se_sess pointers
+-       */
+-      tl_nexus = tl_hba->tl_nexus;
+-      if (!tl_nexus) {
+-              pr_err("Unable to perform device reset without"
+-                              " active I_T Nexus\n");
+-              return FAILED;
+-      }
+-
+-      /*
+-       * Locate the tl_tpg pointer from TargetID in sc->device->id
+-       */
+       tl_tpg = &tl_hba->tl_hba_tpgs[sc->device->id];
+-      ret = tcm_loop_issue_tmr(tl_tpg, tl_nexus, sc->device->lun,
++      ret = tcm_loop_issue_tmr(tl_tpg, sc->device->lun,
+                                sc->request->tag, TMR_ABORT_TASK);
+       return (ret == TMR_FUNCTION_COMPLETE) ? SUCCESS : FAILED;
+ }
+@@ -374,7 +370,6 @@ static int tcm_loop_abort_task(struct sc
+ static int tcm_loop_device_reset(struct scsi_cmnd *sc)
+ {
+       struct tcm_loop_hba *tl_hba;
+-      struct tcm_loop_nexus *tl_nexus;
+       struct tcm_loop_tpg *tl_tpg;
+       int ret = FAILED;
+@@ -382,20 +377,9 @@ static int tcm_loop_device_reset(struct
+        * Locate the tcm_loop_hba_t pointer
+        */
+       tl_hba = *(struct tcm_loop_hba **)shost_priv(sc->device->host);
+-      /*
+-       * Locate the tl_nexus and se_sess pointers
+-       */
+-      tl_nexus = tl_hba->tl_nexus;
+-      if (!tl_nexus) {
+-              pr_err("Unable to perform device reset without"
+-                              " active I_T Nexus\n");
+-              return FAILED;
+-      }
+-      /*
+-       * Locate the tl_tpg pointer from TargetID in sc->device->id
+-       */
+       tl_tpg = &tl_hba->tl_hba_tpgs[sc->device->id];
+-      ret = tcm_loop_issue_tmr(tl_tpg, tl_nexus, sc->device->lun,
++
++      ret = tcm_loop_issue_tmr(tl_tpg, sc->device->lun,
+                                0, TMR_LUN_RESET);
+       return (ret == TMR_FUNCTION_COMPLETE) ? SUCCESS : FAILED;
+ }
+@@ -1005,8 +989,8 @@ static int tcm_loop_make_nexus(
+       struct tcm_loop_nexus *tl_nexus;
+       int ret = -ENOMEM;
+-      if (tl_tpg->tl_hba->tl_nexus) {
+-              pr_debug("tl_tpg->tl_hba->tl_nexus already exists\n");
++      if (tl_tpg->tl_nexus) {
++              pr_debug("tl_tpg->tl_nexus already exists\n");
+               return -EEXIST;
+       }
+       se_tpg = &tl_tpg->tl_se_tpg;
+@@ -1041,7 +1025,7 @@ static int tcm_loop_make_nexus(
+        */
+       __transport_register_session(se_tpg, tl_nexus->se_sess->se_node_acl,
+                       tl_nexus->se_sess, tl_nexus);
+-      tl_tpg->tl_hba->tl_nexus = tl_nexus;
++      tl_tpg->tl_nexus = tl_nexus;
+       pr_debug("TCM_Loop_ConfigFS: Established I_T Nexus to emulated"
+               " %s Initiator Port: %s\n", tcm_loop_dump_proto_id(tl_hba),
+               name);
+@@ -1057,12 +1041,8 @@ static int tcm_loop_drop_nexus(
+ {
+       struct se_session *se_sess;
+       struct tcm_loop_nexus *tl_nexus;
+-      struct tcm_loop_hba *tl_hba = tpg->tl_hba;
+-      if (!tl_hba)
+-              return -ENODEV;
+-
+-      tl_nexus = tl_hba->tl_nexus;
++      tl_nexus = tpg->tl_nexus;
+       if (!tl_nexus)
+               return -ENODEV;
+@@ -1078,13 +1058,13 @@ static int tcm_loop_drop_nexus(
+       }
+       pr_debug("TCM_Loop_ConfigFS: Removing I_T Nexus to emulated"
+-              " %s Initiator Port: %s\n", tcm_loop_dump_proto_id(tl_hba),
++              " %s Initiator Port: %s\n", tcm_loop_dump_proto_id(tpg->tl_hba),
+               tl_nexus->se_sess->se_node_acl->initiatorname);
+       /*
+        * Release the SCSI I_T Nexus to the emulated SAS Target Port
+        */
+       transport_deregister_session(tl_nexus->se_sess);
+-      tpg->tl_hba->tl_nexus = NULL;
++      tpg->tl_nexus = NULL;
+       kfree(tl_nexus);
+       return 0;
+ }
+@@ -1100,7 +1080,7 @@ static ssize_t tcm_loop_tpg_show_nexus(
+       struct tcm_loop_nexus *tl_nexus;
+       ssize_t ret;
+-      tl_nexus = tl_tpg->tl_hba->tl_nexus;
++      tl_nexus = tl_tpg->tl_nexus;
+       if (!tl_nexus)
+               return -ENODEV;
+--- a/drivers/target/loopback/tcm_loop.h
++++ b/drivers/target/loopback/tcm_loop.h
+@@ -27,11 +27,6 @@ struct tcm_loop_tmr {
+ };
+ struct tcm_loop_nexus {
+-      int it_nexus_active;
+-      /*
+-       * Pointer to Linux/SCSI HBA from linux/include/scsi_host.h
+-       */
+-      struct scsi_host *sh;
+       /*
+        * Pointer to TCM session for I_T Nexus
+        */
+@@ -51,6 +46,7 @@ struct tcm_loop_tpg {
+       atomic_t tl_tpg_port_count;
+       struct se_portal_group tl_se_tpg;
+       struct tcm_loop_hba *tl_hba;
++      struct tcm_loop_nexus *tl_nexus;
+ };
+ struct tcm_loop_hba {
+@@ -59,7 +55,6 @@ struct tcm_loop_hba {
+       struct se_hba_s *se_hba;
+       struct se_lun *tl_hba_lun;
+       struct se_port *tl_hba_lun_sep;
+-      struct tcm_loop_nexus *tl_nexus;
+       struct device dev;
+       struct Scsi_Host *sh;
+       struct tcm_loop_tpg tl_hba_tpgs[TL_TPGS_PER_HBA];
diff --git a/queue-3.18/tick-powerclamp-remove-tick_nohz_idle-abuse.patch b/queue-3.18/tick-powerclamp-remove-tick_nohz_idle-abuse.patch
new file mode 100644 (file)
index 0000000..c32123b
--- /dev/null
@@ -0,0 +1,86 @@
+From a5fd9733a30d18d7ac23f17080e7e07bb3205b69 Mon Sep 17 00:00:00 2001
+From: Thomas Gleixner <tglx@linutronix.de>
+Date: Thu, 18 Dec 2014 11:51:01 +0100
+Subject: tick/powerclamp: Remove tick_nohz_idle abuse
+
+From: Thomas Gleixner <tglx@linutronix.de>
+
+commit a5fd9733a30d18d7ac23f17080e7e07bb3205b69 upstream.
+
+commit 4dbd27711cd9 "tick: export nohz tick idle symbols for module
+use" was merged via the thermal tree without an explicit ack from the
+relevant maintainers.
+
+The exports are abused by the intel powerclamp driver which implements
+a fake idle state from a sched FIFO task. This causes all kinds of
+wreckage in the NOHZ core code which rightfully assumes that
+tick_nohz_idle_enter/exit() are only called from the idle task itself.
+
+Recent changes in the NOHZ core lead to a failure of the powerclamp
+driver and now people try to hack completely broken and backwards
+workarounds into the NOHZ core code. This is completely unacceptable
+and just papers over the real problem. There are way more subtle
+issues lurking around the corner.
+
+The real solution is to fix the powerclamp driver by rewriting it with
+a sane concept, but that's beyond the scope of this.
+
+So the only solution for now is to remove the calls into the core NOHZ
+code from the powerclamp trainwreck along with the exports.
+
+Fixes: d6d71ee4a14a "PM: Introduce Intel PowerClamp Driver"
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Cc: Preeti U Murthy <preeti@linux.vnet.ibm.com>
+Cc: Viresh Kumar <viresh.kumar@linaro.org>
+Cc: Frederic Weisbecker <fweisbec@gmail.com>
+Cc: Fengguang Wu <fengguang.wu@intel.com>
+Cc: Frederic Weisbecker <frederic@kernel.org>
+Cc: Pan Jacob jun <jacob.jun.pan@intel.com>
+Cc: LKP <lkp@01.org>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Zhang Rui <rui.zhang@intel.com>
+Link: http://lkml.kernel.org/r/alpine.DEB.2.11.1412181110110.17382@nanos
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/thermal/intel_powerclamp.c |    2 --
+ kernel/time/tick-sched.c           |    2 --
+ 2 files changed, 4 deletions(-)
+
+--- a/drivers/thermal/intel_powerclamp.c
++++ b/drivers/thermal/intel_powerclamp.c
+@@ -435,7 +435,6 @@ static int clamp_thread(void *arg)
+                * allowed. thus jiffies are updated properly.
+                */
+               preempt_disable();
+-              tick_nohz_idle_enter();
+               /* mwait until target jiffies is reached */
+               while (time_before(jiffies, target_jiffies)) {
+                       unsigned long ecx = 1;
+@@ -451,7 +450,6 @@ static int clamp_thread(void *arg)
+                       start_critical_timings();
+                       atomic_inc(&idle_wakeup_counter);
+               }
+-              tick_nohz_idle_exit();
+               preempt_enable();
+       }
+       del_timer_sync(&wakeup_timer);
+--- a/kernel/time/tick-sched.c
++++ b/kernel/time/tick-sched.c
+@@ -847,7 +847,6 @@ void tick_nohz_idle_enter(void)
+       local_irq_enable();
+ }
+-EXPORT_SYMBOL_GPL(tick_nohz_idle_enter);
+ /**
+  * tick_nohz_irq_exit - update next tick event from interrupt exit
+@@ -974,7 +973,6 @@ void tick_nohz_idle_exit(void)
+       local_irq_enable();
+ }
+-EXPORT_SYMBOL_GPL(tick_nohz_idle_exit);
+ static int tick_nohz_reprogram(struct tick_sched *ts, ktime_t now)
+ {
diff --git a/queue-3.18/uapi-linux-target_core_user.h-fix-headers_install.sh-badness.patch b/queue-3.18/uapi-linux-target_core_user.h-fix-headers_install.sh-badness.patch
new file mode 100644 (file)
index 0000000..5619164
--- /dev/null
@@ -0,0 +1,38 @@
+From 3875f15207f9ecb3f24a8e91e7ad196899139595 Mon Sep 17 00:00:00 2001
+From: Kyle McMartin <kyle@redhat.com>
+Date: Thu, 18 Dec 2014 12:57:14 -0500
+Subject: uapi/linux/target_core_user.h: fix headers_install.sh badness
+
+From: Kyle McMartin <kyle@redhat.com>
+
+commit 3875f15207f9ecb3f24a8e91e7ad196899139595 upstream.
+
+scripts/headers_install.sh will transform __packed to
+__attribute__((packed)), so the #ifndef is not necessary.
+(and, in fact, it's problematic, because we'll end up with the header
+ containing:
+#ifndef __attribute__((packed))
+#define __attribu...
+and so forth.)
+
+Signed-off-by: Kyle McMartin <kyle@redhat.com>
+Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ include/uapi/linux/target_core_user.h |    4 ----
+ 1 file changed, 4 deletions(-)
+
+--- a/include/uapi/linux/target_core_user.h
++++ b/include/uapi/linux/target_core_user.h
+@@ -6,10 +6,6 @@
+ #include <linux/types.h>
+ #include <linux/uio.h>
+-#ifndef __packed
+-#define __packed                        __attribute__((packed))
+-#endif
+-
+ #define TCMU_VERSION "1.0"
+ /*