From: Greg Kroah-Hartman Date: Fri, 1 Jun 2012 09:04:57 +0000 (+0800) Subject: 3.4-stable patches X-Git-Tag: v3.0.34~28 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e6963a0ed9695ebd8b38e58775c5ed00cf1e4eaa;p=thirdparty%2Fkernel%2Fstable-queue.git 3.4-stable patches added patches: drm-i915-adding-tv-out-missing-modes.patch drm-i915-no-lvds-quirk-for-hp-t5740e-thin-client.patch drm-i915-properly-handle-interlaced-bit-for-sdvo-dtd-conversion.patch drm-i915-wait-for-a-vblank-to-pass-after-tv-detect.patch drm-radeon-fix-typo-in-trinity-tiling-setup.patch drm-radeon-fix-xfx-quirk.patch iommu-amd-add-workaround-for-event-log-erratum.patch iommu-amd-check-for-the-right-tlp-prefix-bit.patch sunrpc-fix-loss-of-task-tk_status-after-rpc_delay-call-in-xprt_alloc_slot.patch --- diff --git a/queue-3.4/drm-i915-adding-tv-out-missing-modes.patch b/queue-3.4/drm-i915-adding-tv-out-missing-modes.patch new file mode 100644 index 00000000000..1dea05881bf --- /dev/null +++ b/queue-3.4/drm-i915-adding-tv-out-missing-modes.patch @@ -0,0 +1,93 @@ +From 9589919fb3d269d4202a112b197468c7db1f97a3 Mon Sep 17 00:00:00 2001 +From: Rodrigo Vivi +Date: Tue, 22 May 2012 15:23:24 -0300 +Subject: drm/i915: Adding TV Out Missing modes. + +From: Rodrigo Vivi + +commit 9589919fb3d269d4202a112b197468c7db1f97a3 upstream. + +These 2 modes were removed by mistake during a clean up. +So, now it is time to add them back. For further info about +supported mode and standard timing table please check: +VOL_3_display_registers_updated.pdf at intellinuxgraphics.org. + +Note that this regression has been introduce in + +commit 55a6713b3f30a5024056027e9dbf03ac8f13bfc9 +Author: Rodrigo Vivi +Date: Thu Dec 15 14:47:33 2011 -0200 + + drm/i915: Removing TV Out modes. + +and this commit partially reverts it by re-adding the wrongly removed +modes. + +Reported-by: Robert Lowery +Signed-off-by: Rodrigo Vivi +[danvet: Pimped commit message to cite the commit that introduced this +regression.] +Signed-off-by: Daniel Vetter +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/intel_tv.c | 48 ++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 48 insertions(+) + +--- a/drivers/gpu/drm/i915/intel_tv.c ++++ b/drivers/gpu/drm/i915/intel_tv.c +@@ -674,6 +674,54 @@ static const struct tv_mode tv_modes[] = + .filter_table = filter_table, + }, + { ++ .name = "480p", ++ .clock = 107520, ++ .refresh = 59940, ++ .oversample = TV_OVERSAMPLE_4X, ++ .component_only = 1, ++ ++ .hsync_end = 64, .hblank_end = 122, ++ .hblank_start = 842, .htotal = 857, ++ ++ .progressive = true, .trilevel_sync = false, ++ ++ .vsync_start_f1 = 12, .vsync_start_f2 = 12, ++ .vsync_len = 12, ++ ++ .veq_ena = false, ++ ++ .vi_end_f1 = 44, .vi_end_f2 = 44, ++ .nbr_end = 479, ++ ++ .burst_ena = false, ++ ++ .filter_table = filter_table, ++ }, ++ { ++ .name = "576p", ++ .clock = 107520, ++ .refresh = 50000, ++ .oversample = TV_OVERSAMPLE_4X, ++ .component_only = 1, ++ ++ .hsync_end = 64, .hblank_end = 139, ++ .hblank_start = 859, .htotal = 863, ++ ++ .progressive = true, .trilevel_sync = false, ++ ++ .vsync_start_f1 = 10, .vsync_start_f2 = 10, ++ .vsync_len = 10, ++ ++ .veq_ena = false, ++ ++ .vi_end_f1 = 48, .vi_end_f2 = 48, ++ .nbr_end = 575, ++ ++ .burst_ena = false, ++ ++ .filter_table = filter_table, ++ }, ++ { + .name = "720p@60Hz", + .clock = 148800, + .refresh = 60000, diff --git a/queue-3.4/drm-i915-no-lvds-quirk-for-hp-t5740e-thin-client.patch b/queue-3.4/drm-i915-no-lvds-quirk-for-hp-t5740e-thin-client.patch new file mode 100644 index 00000000000..049c5ed7798 --- /dev/null +++ b/queue-3.4/drm-i915-no-lvds-quirk-for-hp-t5740e-thin-client.patch @@ -0,0 +1,38 @@ +From 3347111999870c37eab1b969e90af9fdaf0334ba Mon Sep 17 00:00:00 2001 +From: Jan-Benedict Glaw +Date: Tue, 22 May 2012 15:21:53 +0200 +Subject: drm/i915: no lvds quirk for HP t5740e Thin Client + +From: Jan-Benedict Glaw + +commit 3347111999870c37eab1b969e90af9fdaf0334ba upstream. + +This box has DisplayPort and VGA, but no LVDS. Product specs are at +http://h10010.www1.hp.com/wwpc/us/en/sm/WF25a/12454-12454-321959-338927-3640406-4282707.html?dnr=1 +and dmidecode output can be found at http://www.getslash.de/bug_attachments/dmidecode-t5740e.txt + +Signed-off-by: Jan-Benedict Glaw +Signed-off-by: Daniel Vetter +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/intel_lvds.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +--- a/drivers/gpu/drm/i915/intel_lvds.c ++++ b/drivers/gpu/drm/i915/intel_lvds.c +@@ -747,6 +747,14 @@ static const struct dmi_system_id intel_ + }, + { + .callback = intel_no_lvds_dmi_callback, ++ .ident = "Hewlett-Packard HP t5740e Thin Client", ++ .matches = { ++ DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "HP t5740e Thin Client"), ++ }, ++ }, ++ { ++ .callback = intel_no_lvds_dmi_callback, + .ident = "Hewlett-Packard t5745", + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), diff --git a/queue-3.4/drm-i915-properly-handle-interlaced-bit-for-sdvo-dtd-conversion.patch b/queue-3.4/drm-i915-properly-handle-interlaced-bit-for-sdvo-dtd-conversion.patch new file mode 100644 index 00000000000..cee9cb2f716 --- /dev/null +++ b/queue-3.4/drm-i915-properly-handle-interlaced-bit-for-sdvo-dtd-conversion.patch @@ -0,0 +1,73 @@ +From 59d92bfa5f0cdf57f82f5181b0ad6af75c3fdf41 Mon Sep 17 00:00:00 2001 +From: Daniel Vetter +Date: Sat, 12 May 2012 22:22:58 +0200 +Subject: drm/i915: properly handle interlaced bit for sdvo dtd conversion + +From: Daniel Vetter + +commit 59d92bfa5f0cdf57f82f5181b0ad6af75c3fdf41 upstream. + +We've simply ignored this, which isn't too great. With this, interlaced +1080i works on my HDMI screen connected through sdvo. For no apparent +reason anything else still doesn't work as it should. + +While at it, give these magic numbers in the dtd proper names and +add a comment that they match with EDID detailed timings. + +v2: Actually use the right bit for interlaced. + +Tested-by: Peter Ross +Reviewed-by: Paulo Zanoni +Signed-Off-by: Daniel Vetter +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/intel_sdvo.c | 12 ++++++++---- + drivers/gpu/drm/i915/intel_sdvo_regs.h | 5 +++++ + 2 files changed, 13 insertions(+), 4 deletions(-) + +--- a/drivers/gpu/drm/i915/intel_sdvo.c ++++ b/drivers/gpu/drm/i915/intel_sdvo.c +@@ -769,10 +769,12 @@ static void intel_sdvo_get_dtd_from_mode + ((v_sync_len & 0x30) >> 4); + + dtd->part2.dtd_flags = 0x18; ++ if (mode->flags & DRM_MODE_FLAG_INTERLACE) ++ dtd->part2.dtd_flags |= DTD_FLAG_INTERLACE; + if (mode->flags & DRM_MODE_FLAG_PHSYNC) +- dtd->part2.dtd_flags |= 0x2; ++ dtd->part2.dtd_flags |= DTD_FLAG_HSYNC_POSITIVE; + if (mode->flags & DRM_MODE_FLAG_PVSYNC) +- dtd->part2.dtd_flags |= 0x4; ++ dtd->part2.dtd_flags |= DTD_FLAG_VSYNC_POSITIVE; + + dtd->part2.sdvo_flags = 0; + dtd->part2.v_sync_off_high = v_sync_offset & 0xc0; +@@ -806,9 +808,11 @@ static void intel_sdvo_get_mode_from_dtd + mode->clock = dtd->part1.clock * 10; + + mode->flags &= ~(DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC); +- if (dtd->part2.dtd_flags & 0x2) ++ if (dtd->part2.dtd_flags & DTD_FLAG_INTERLACE) ++ mode->flags |= DRM_MODE_FLAG_INTERLACE; ++ if (dtd->part2.dtd_flags & DTD_FLAG_HSYNC_POSITIVE) + mode->flags |= DRM_MODE_FLAG_PHSYNC; +- if (dtd->part2.dtd_flags & 0x4) ++ if (dtd->part2.dtd_flags & DTD_FLAG_VSYNC_POSITIVE) + mode->flags |= DRM_MODE_FLAG_PVSYNC; + } + +--- a/drivers/gpu/drm/i915/intel_sdvo_regs.h ++++ b/drivers/gpu/drm/i915/intel_sdvo_regs.h +@@ -61,6 +61,11 @@ struct intel_sdvo_caps { + u16 output_flags; + } __attribute__((packed)); + ++/* Note: SDVO detailed timing flags match EDID misc flags. */ ++#define DTD_FLAG_HSYNC_POSITIVE (1 << 1) ++#define DTD_FLAG_VSYNC_POSITIVE (1 << 2) ++#define DTD_FLAG_INTERLACE (1 << 7) ++ + /** This matches the EDID DTD structure, more or less */ + struct intel_sdvo_dtd { + struct { diff --git a/queue-3.4/drm-i915-wait-for-a-vblank-to-pass-after-tv-detect.patch b/queue-3.4/drm-i915-wait-for-a-vblank-to-pass-after-tv-detect.patch new file mode 100644 index 00000000000..b42c9a9701e --- /dev/null +++ b/queue-3.4/drm-i915-wait-for-a-vblank-to-pass-after-tv-detect.patch @@ -0,0 +1,64 @@ +From bf2125e2f7e931b50a6c76ba0435ba001409ccbf Mon Sep 17 00:00:00 2001 +From: Daniel Vetter +Date: Tue, 22 May 2012 21:41:25 +0200 +Subject: drm/i915: wait for a vblank to pass after tv detect + +From: Daniel Vetter + +commit bf2125e2f7e931b50a6c76ba0435ba001409ccbf upstream. + +Otherwise the hw will get confused and result in a black screen. + +This regression has been most likely introduce in + +commit 974b93315b2213b74a42a87e8a9d4fc8c0dbe90c +Author: Chris Wilson +Date: Sun Sep 5 00:44:20 2010 +0100 + + drm/i915/tv: Poll for DAC state change + +That commit replace the first msleep(20) with a busy-loop, but failed +to keep the 2nd msleep around. Later on we've replaced all these +msleep(20) by proper vblanks. + +For reference also see the commit in xf86-video-intel: + +commit 1142be53eb8d2ee8a9b60ace5d49f0ba27332275 +Author: Jesse Barnes +Date: Mon Jun 9 08:52:59 2008 -0700 + + Fix TV programming: add vblank wait after TV_CTL writes + + Fxies FDO bug #14000; we need to wait for vblank after + writing TV_CTL or following "DPMS on" calls may not actually enable the output. + +v2: As suggested by Chris Wilson, add a small comment to ensure that +no one accidentally removes this vblank wait again - there really +seems to be no sane explanation for why we need it, but it is +required. + +Launchpad: https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-video-intel/+bug/763688 +Reported-and-Tested-by: Robert Lowery +Cc: Rodrigo Vivi +Acked-by: Chris Wilson +Signed-Off-by: Daniel Vetter +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/i915/intel_tv.c | 5 +++++ + 1 file changed, 5 insertions(+) + +--- a/drivers/gpu/drm/i915/intel_tv.c ++++ b/drivers/gpu/drm/i915/intel_tv.c +@@ -1233,6 +1233,11 @@ intel_tv_detect_type(struct intel_tv *in + + I915_WRITE(TV_DAC, save_tv_dac & ~TVDAC_STATE_CHG_EN); + I915_WRITE(TV_CTL, save_tv_ctl); ++ POSTING_READ(TV_CTL); ++ ++ /* For unknown reasons the hw barfs if we don't do this vblank wait. */ ++ intel_wait_for_vblank(intel_tv->base.base.dev, ++ to_intel_crtc(intel_tv->base.base.crtc)->pipe); + + /* Restore interrupt config */ + if (connector->polled & DRM_CONNECTOR_POLL_HPD) { diff --git a/queue-3.4/drm-radeon-fix-typo-in-trinity-tiling-setup.patch b/queue-3.4/drm-radeon-fix-typo-in-trinity-tiling-setup.patch new file mode 100644 index 00000000000..4bec8859ca0 --- /dev/null +++ b/queue-3.4/drm-radeon-fix-typo-in-trinity-tiling-setup.patch @@ -0,0 +1,30 @@ +From 1f73cca799d29df80de3e8f1f1c488485467577a Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Thu, 24 May 2012 22:55:15 -0400 +Subject: drm/radeon: fix typo in trinity tiling setup + +From: Alex Deucher + +commit 1f73cca799d29df80de3e8f1f1c488485467577a upstream. + +Using the wrong union. + +Signed-off-by: Alex Deucher +Signed-off-by: Dave Airlie +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/radeon/ni.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/gpu/drm/radeon/ni.c ++++ b/drivers/gpu/drm/radeon/ni.c +@@ -865,7 +865,7 @@ static void cayman_gpu_init(struct radeo + + /* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */ + if (rdev->flags & RADEON_IS_IGP) +- rdev->config.evergreen.tile_config |= 1 << 4; ++ rdev->config.cayman.tile_config |= 1 << 4; + else + rdev->config.cayman.tile_config |= + ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4; diff --git a/queue-3.4/drm-radeon-fix-xfx-quirk.patch b/queue-3.4/drm-radeon-fix-xfx-quirk.patch new file mode 100644 index 00000000000..ae478dad767 --- /dev/null +++ b/queue-3.4/drm-radeon-fix-xfx-quirk.patch @@ -0,0 +1,38 @@ +From 1ebf169ad4dc68f18cc0dab35163b0f324fc6c41 Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Wed, 23 May 2012 11:48:59 -0400 +Subject: drm/radeon: fix XFX quirk + +From: Alex Deucher + +commit 1ebf169ad4dc68f18cc0dab35163b0f324fc6c41 upstream. + +Only override the ddc bus if the connector doesn't have +a valid one. The existing code overrode the ddc bus for +all connectors even if it had ddc bus. + +Fixes ddc on another XFX card with the same pci ids that +was broken by the quirk overwriting the correct ddc bus. + +Reported-by: Mehdi Aqadjani Memar +Signed-off-by: Alex Deucher +Signed-off-by: Dave Airlie +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/radeon/radeon_atombios.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +--- a/drivers/gpu/drm/radeon/radeon_atombios.c ++++ b/drivers/gpu/drm/radeon/radeon_atombios.c +@@ -444,7 +444,9 @@ static bool radeon_atom_apply_quirks(str + */ + if ((dev->pdev->device == 0x9498) && + (dev->pdev->subsystem_vendor == 0x1682) && +- (dev->pdev->subsystem_device == 0x2452)) { ++ (dev->pdev->subsystem_device == 0x2452) && ++ (i2c_bus->valid == false) && ++ !(supported_device & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT))) { + struct radeon_device *rdev = dev->dev_private; + *i2c_bus = radeon_lookup_i2c_gpio(rdev, 0x93); + } diff --git a/queue-3.4/iommu-amd-add-workaround-for-event-log-erratum.patch b/queue-3.4/iommu-amd-add-workaround-for-event-log-erratum.patch new file mode 100644 index 00000000000..14b37a0e39c --- /dev/null +++ b/queue-3.4/iommu-amd-add-workaround-for-event-log-erratum.patch @@ -0,0 +1,66 @@ +From 3d06fca8d2aa3543030e40b95f1d62f9f5a03540 Mon Sep 17 00:00:00 2001 +From: Joerg Roedel +Date: Thu, 12 Apr 2012 14:12:00 +0200 +Subject: iommu/amd: Add workaround for event log erratum + +From: Joerg Roedel + +commit 3d06fca8d2aa3543030e40b95f1d62f9f5a03540 upstream. + +Due to a recent erratum it can happen that the head pointer +of the event-log is updated before the actual event-log +entry is written. This patch implements the recommended +workaround. + +Signed-off-by: Joerg Roedel +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/iommu/amd_iommu.c | 29 +++++++++++++++++++++++------ + 1 file changed, 23 insertions(+), 6 deletions(-) + +--- a/drivers/iommu/amd_iommu.c ++++ b/drivers/iommu/amd_iommu.c +@@ -450,12 +450,27 @@ static void dump_command(unsigned long p + + static void iommu_print_event(struct amd_iommu *iommu, void *__evt) + { +- u32 *event = __evt; +- int type = (event[1] >> EVENT_TYPE_SHIFT) & EVENT_TYPE_MASK; +- int devid = (event[0] >> EVENT_DEVID_SHIFT) & EVENT_DEVID_MASK; +- int domid = (event[1] >> EVENT_DOMID_SHIFT) & EVENT_DOMID_MASK; +- int flags = (event[1] >> EVENT_FLAGS_SHIFT) & EVENT_FLAGS_MASK; +- u64 address = (u64)(((u64)event[3]) << 32) | event[2]; ++ int type, devid, domid, flags; ++ volatile u32 *event = __evt; ++ int count = 0; ++ u64 address; ++ ++retry: ++ type = (event[1] >> EVENT_TYPE_SHIFT) & EVENT_TYPE_MASK; ++ devid = (event[0] >> EVENT_DEVID_SHIFT) & EVENT_DEVID_MASK; ++ domid = (event[1] >> EVENT_DOMID_SHIFT) & EVENT_DOMID_MASK; ++ flags = (event[1] >> EVENT_FLAGS_SHIFT) & EVENT_FLAGS_MASK; ++ address = (u64)(((u64)event[3]) << 32) | event[2]; ++ ++ if (type == 0) { ++ /* Did we hit the erratum? */ ++ if (++count == LOOP_TIMEOUT) { ++ pr_err("AMD-Vi: No event written to event log\n"); ++ return; ++ } ++ udelay(1); ++ goto retry; ++ } + + printk(KERN_ERR "AMD-Vi: Event logged ["); + +@@ -508,6 +523,8 @@ static void iommu_print_event(struct amd + default: + printk(KERN_ERR "UNKNOWN type=0x%02x]\n", type); + } ++ ++ memset(__evt, 0, 4 * sizeof(u32)); + } + + static void iommu_poll_events(struct amd_iommu *iommu) diff --git a/queue-3.4/iommu-amd-check-for-the-right-tlp-prefix-bit.patch b/queue-3.4/iommu-amd-check-for-the-right-tlp-prefix-bit.patch new file mode 100644 index 00000000000..088e40d6f99 --- /dev/null +++ b/queue-3.4/iommu-amd-check-for-the-right-tlp-prefix-bit.patch @@ -0,0 +1,50 @@ +From a3b93121430c7b46c2895a7744261be107ccdf7f Mon Sep 17 00:00:00 2001 +From: Joerg Roedel +Date: Thu, 12 Apr 2012 12:49:26 +0200 +Subject: iommu/amd: Check for the right TLP prefix bit + +From: Joerg Roedel + +commit a3b93121430c7b46c2895a7744261be107ccdf7f upstream. + +Unfortunatly the PRI spec changed and moved the +TLP-prefix-required bit to a different location. This patch +makes the necessary change in the AMD IOMMU driver. +Regressions are not expected because all hardware +implementing the PRI capability sets this bit to zero +anyway. + +Signed-off-by: Joerg Roedel +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/iommu/amd_iommu.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +--- a/drivers/iommu/amd_iommu.c ++++ b/drivers/iommu/amd_iommu.c +@@ -2035,20 +2035,20 @@ out_err: + } + + /* FIXME: Move this to PCI code */ +-#define PCI_PRI_TLP_OFF (1 << 2) ++#define PCI_PRI_TLP_OFF (1 << 15) + + bool pci_pri_tlp_required(struct pci_dev *pdev) + { +- u16 control; ++ u16 status; + int pos; + + pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_PRI); + if (!pos) + return false; + +- pci_read_config_word(pdev, pos + PCI_PRI_CTRL, &control); ++ pci_read_config_word(pdev, pos + PCI_PRI_STATUS, &status); + +- return (control & PCI_PRI_TLP_OFF) ? true : false; ++ return (status & PCI_PRI_TLP_OFF) ? true : false; + } + + /* diff --git a/queue-3.4/series b/queue-3.4/series index 2f459f94356..6b10d4bd6ca 100644 --- a/queue-3.4/series +++ b/queue-3.4/series @@ -22,3 +22,12 @@ x86-amd-xen-avoid-null-pointer-paravirt-references.patch nfs-kmalloc-doesn-t-return-an-err_ptr.patch nfsv4-map-nfs4err_share_denied-into-an-eacces-error-instead-of-eio.patch hugetlb-fix-resv_map-leak-in-error-path.patch +sunrpc-fix-loss-of-task-tk_status-after-rpc_delay-call-in-xprt_alloc_slot.patch +iommu-amd-check-for-the-right-tlp-prefix-bit.patch +iommu-amd-add-workaround-for-event-log-erratum.patch +drm-radeon-fix-xfx-quirk.patch +drm-radeon-fix-typo-in-trinity-tiling-setup.patch +drm-i915-properly-handle-interlaced-bit-for-sdvo-dtd-conversion.patch +drm-i915-adding-tv-out-missing-modes.patch +drm-i915-wait-for-a-vblank-to-pass-after-tv-detect.patch +drm-i915-no-lvds-quirk-for-hp-t5740e-thin-client.patch diff --git a/queue-3.4/sunrpc-fix-loss-of-task-tk_status-after-rpc_delay-call-in-xprt_alloc_slot.patch b/queue-3.4/sunrpc-fix-loss-of-task-tk_status-after-rpc_delay-call-in-xprt_alloc_slot.patch new file mode 100644 index 00000000000..5353a2e53cb --- /dev/null +++ b/queue-3.4/sunrpc-fix-loss-of-task-tk_status-after-rpc_delay-call-in-xprt_alloc_slot.patch @@ -0,0 +1,58 @@ +From 1afeaf5c29aa07db25760d2fbed5c08a3aec3498 Mon Sep 17 00:00:00 2001 +From: Trond Myklebust +Date: Sat, 19 May 2012 12:12:53 -0400 +Subject: sunrpc: fix loss of task->tk_status after rpc_delay call in xprt_alloc_slot + +From: Trond Myklebust + +commit 1afeaf5c29aa07db25760d2fbed5c08a3aec3498 upstream. + +xprt_alloc_slot will call rpc_delay() to make the task wait a bit before +retrying when it gets back an -ENOMEM error from xprt_dynamic_alloc_slot. +The problem is that rpc_delay will clear the task->tk_status, causing +call_reserveresult to abort the task. + +The solution is simply to let call_reserveresult handle the ENOMEM error +directly. + +Reported-by: Jeff Layton +Signed-off-by: Trond Myklebust +Signed-off-by: Greg Kroah-Hartman + +--- + net/sunrpc/clnt.c | 2 ++ + net/sunrpc/xprt.c | 5 +++-- + 2 files changed, 5 insertions(+), 2 deletions(-) + +--- a/net/sunrpc/clnt.c ++++ b/net/sunrpc/clnt.c +@@ -1288,6 +1288,8 @@ call_reserveresult(struct rpc_task *task + } + + switch (status) { ++ case -ENOMEM: ++ rpc_delay(task, HZ >> 2); + case -EAGAIN: /* woken up; retry */ + task->tk_action = call_reserve; + return; +--- a/net/sunrpc/xprt.c ++++ b/net/sunrpc/xprt.c +@@ -984,15 +984,16 @@ static void xprt_alloc_slot(struct rpc_t + goto out_init_req; + switch (PTR_ERR(req)) { + case -ENOMEM: +- rpc_delay(task, HZ >> 2); + dprintk("RPC: dynamic allocation of request slot " + "failed! Retrying\n"); ++ task->tk_status = -ENOMEM; + break; + case -EAGAIN: + rpc_sleep_on(&xprt->backlog, task, NULL); + dprintk("RPC: waiting for request slot\n"); ++ default: ++ task->tk_status = -EAGAIN; + } +- task->tk_status = -EAGAIN; + return; + out_init_req: + task->tk_status = 0;