From: Greg Kroah-Hartman Date: Tue, 20 Jan 2015 07:23:40 +0000 (+0800) Subject: 3.18-stable patches X-Git-Tag: v3.10.66~47 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=da28182fc32f0357c61403785caa9fab2dd00ff0;p=thirdparty%2Fkernel%2Fstable-queue.git 3.18-stable patches 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 --- 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 index 00000000000..2d996fb83ec --- /dev/null +++ b/queue-3.18/asus-nb-wmi-add-another-wapf-4-quirk.patch @@ -0,0 +1,39 @@ +From 841e11ccdf90c29a7778a5d5d553bc716c3d477a Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Mon, 24 Nov 2014 11:26:32 +0100 +Subject: asus-nb-wmi: Add another wapf=4 quirk + +From: Hans de Goede + +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 +Signed-off-by: Darren Hart +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..ff2459985ce --- /dev/null +++ b/queue-3.18/hp_accel-add-support-for-hp-zbook-15.patch @@ -0,0 +1,31 @@ +From 6583659e0f92e38079a8dd081e0a1181a0f37747 Mon Sep 17 00:00:00 2001 +From: Dominique Leuenberger +Date: Thu, 13 Nov 2014 20:57:37 +0100 +Subject: hp_accel: Add support for HP ZBook 15 + +From: Dominique Leuenberger + +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 +Signed-off-by: Takashi Iwai +Signed-off-by: Darren Hart +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..8452a905ea4 --- /dev/null +++ b/queue-3.18/ib-iser-fix-possible-sq-overflow.patch @@ -0,0 +1,79 @@ +From 6ec9d4d2310e8fc54fc638e4454271d1fcaefa95 Mon Sep 17 00:00:00 2001 +From: Max Gurtovoy +Date: Sun, 7 Dec 2014 16:09:56 +0200 +Subject: IB/iser: Fix possible SQ overflow + +From: Max Gurtovoy + +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 +Signed-off-by: Sagi Grimberg +Signed-off-by: Or Gerlitz +Signed-off-by: Roland Dreier +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..aead6548e6c --- /dev/null +++ b/queue-3.18/rtlwifi-fix-error-when-accessing-unmapped-memory-in-skb.patch @@ -0,0 +1,125 @@ +From e9538cf4f90713eca71b1d6a74b4eae1d445c664 Mon Sep 17 00:00:00 2001 +From: Larry Finger +Date: Tue, 30 Dec 2014 21:33:07 -0600 +Subject: rtlwifi: Fix error when accessing unmapped memory in skb + +From: Larry Finger + +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 +Reported-by: Eric Biggers +Cc: Eric Biggers +Signed-off-by: Kalle Valo +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..2187e840d18 --- /dev/null +++ b/queue-3.18/rtlwifi-rtl8192ce-set-fw_ready-flag.patch @@ -0,0 +1,37 @@ +From 9a1dce3a059111a7289680f4b8c0ec4f8736b6ee Mon Sep 17 00:00:00 2001 +From: Larry Finger +Date: Wed, 10 Dec 2014 14:38:29 -0600 +Subject: rtlwifi: rtl8192ce: Set fw_ready flag + +From: Larry Finger + +commit 9a1dce3a059111a7289680f4b8c0ec4f8736b6ee upstream. + +The setting of this flag was missed in previous modifications. + +Signed-off-by: Larry Finger +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + 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 diff --git a/queue-3.18/series b/queue-3.18/series index b8166b20f12..c1302ae0805 100644 --- a/queue-3.18/series +++ b/queue-3.18/series @@ -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 index 00000000000..6f43fa0804b --- /dev/null +++ b/queue-3.18/tcm_loop-fix-wrong-i_t-nexus-association.patch @@ -0,0 +1,225 @@ +From 506787a2c7daed45f0a213674ca706cbc83a9089 Mon Sep 17 00:00:00 2001 +From: Hannes Reinecke +Date: Wed, 26 Nov 2014 14:58:57 +0100 +Subject: tcm_loop: Fix wrong I_T nexus association + +From: Hannes Reinecke + +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 +Signed-off-by: Nicholas Bellinger +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..c32123bedc5 --- /dev/null +++ b/queue-3.18/tick-powerclamp-remove-tick_nohz_idle-abuse.patch @@ -0,0 +1,86 @@ +From a5fd9733a30d18d7ac23f17080e7e07bb3205b69 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Thu, 18 Dec 2014 11:51:01 +0100 +Subject: tick/powerclamp: Remove tick_nohz_idle abuse + +From: Thomas Gleixner + +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 +Cc: Preeti U Murthy +Cc: Viresh Kumar +Cc: Frederic Weisbecker +Cc: Fengguang Wu +Cc: Frederic Weisbecker +Cc: Pan Jacob jun +Cc: LKP +Cc: Peter Zijlstra +Cc: Zhang Rui +Link: http://lkml.kernel.org/r/alpine.DEB.2.11.1412181110110.17382@nanos +Signed-off-by: Thomas Gleixner +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..5619164560a --- /dev/null +++ b/queue-3.18/uapi-linux-target_core_user.h-fix-headers_install.sh-badness.patch @@ -0,0 +1,38 @@ +From 3875f15207f9ecb3f24a8e91e7ad196899139595 Mon Sep 17 00:00:00 2001 +From: Kyle McMartin +Date: Thu, 18 Dec 2014 12:57:14 -0500 +Subject: uapi/linux/target_core_user.h: fix headers_install.sh badness + +From: Kyle McMartin + +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 +Signed-off-by: Nicholas Bellinger +Signed-off-by: Greg Kroah-Hartman + +--- + 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 + #include + +-#ifndef __packed +-#define __packed __attribute__((packed)) +-#endif +- + #define TCMU_VERSION "1.0" + + /*