linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	stable@vger.kernel.org, David Francis <David.Francis@amd.com>,
	Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>,
	Roman Li <Roman.Li@amd.com>,
	Nicholas Kazlauskas <Nicholas.Kazlauskas@amd.com>,
	Alex Deucher <alexander.deucher@amd.com>,
	Sasha Levin <sashal@kernel.org>,
	Bhawanpreet Lakha <BhawanpreetLakha@amd.com>
Subject: [PATCH 4.19 034/113] drm/amd/display: If one stream full updates, full update all planes
Date: Wed, 15 May 2019 12:55:25 +0200	[thread overview]
Message-ID: <20190515090656.174093112@linuxfoundation.org> (raw)
In-Reply-To: <20190515090652.640988966@linuxfoundation.org>

[ Upstream commit c238bfe0be9ef7420f7669a69e27c8c8f4d8a568 ]

[Why]
On some compositors, with two monitors attached, VT terminal
switch can cause a graphical issue by the following means:

There are two streams, one for each monitor. Each stream has one
plane

current state:
	M1:S1->P1
	M2:S2->P2

The user calls for a terminal switch and a commit is made to
change both planes to linear swizzle mode. In atomic check,
a new dc_state is constructed with new planes on each stream

new state:
	M1:S1->P3
	M2:S2->P4

In commit tail, each stream is committed, one at a time. The first
stream (S1) updates properly, triggerring a full update and replacing
the state

current state:
	M1:S1->P3
	M2:S2->P4

The update for S2 comes in, but dc detects that there is no difference
between the stream and plane in the new and current states, and so
triggers a fast update. The fast update does not program swizzle,
so the second monitor is corrupted

[How]
Add a flag to dc_plane_state that forces full updates

When a stream undergoes a full update, set this flag on all changed
planes, then clear it on the current stream

Subsequent streams will get full updates as a result

Signed-off-by: David Francis <David.Francis@amd.com>
Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Reviewed-by: Roman Li <Roman.Li@amd.com>
Acked-by: Bhawanpreet Lakha <Bhawanpreet Lakha@amd.com>
Acked-by: Nicholas Kazlauskas <Nicholas.Kazlauskas@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 drivers/gpu/drm/amd/display/dc/core/dc.c | 19 +++++++++++++++++++
 drivers/gpu/drm/amd/display/dc/dc.h      |  3 +++
 2 files changed, 22 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c
index bb0cda7276058..e3f5e5d6f0c18 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -1213,6 +1213,11 @@ static enum surface_update_type det_surface_update(const struct dc *dc,
 		return UPDATE_TYPE_FULL;
 	}
 
+	if (u->surface->force_full_update) {
+		update_flags->bits.full_update = 1;
+		return UPDATE_TYPE_FULL;
+	}
+
 	type = get_plane_info_update_type(u);
 	elevate_update_type(&overall_type, type);
 
@@ -1467,6 +1472,14 @@ void dc_commit_updates_for_stream(struct dc *dc,
 		}
 
 		dc_resource_state_copy_construct(state, context);
+
+		for (i = 0; i < dc->res_pool->pipe_count; i++) {
+			struct pipe_ctx *new_pipe = &context->res_ctx.pipe_ctx[i];
+			struct pipe_ctx *old_pipe = &dc->current_state->res_ctx.pipe_ctx[i];
+
+			if (new_pipe->plane_state && new_pipe->plane_state != old_pipe->plane_state)
+				new_pipe->plane_state->force_full_update = true;
+		}
 	}
 
 
@@ -1510,6 +1523,12 @@ void dc_commit_updates_for_stream(struct dc *dc,
 		dc->current_state = context;
 		dc_release_state(old);
 
+		for (i = 0; i < dc->res_pool->pipe_count; i++) {
+			struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i];
+
+			if (pipe_ctx->plane_state && pipe_ctx->stream == stream)
+				pipe_ctx->plane_state->force_full_update = false;
+		}
 	}
 	/*let's use current_state to update watermark etc*/
 	if (update_type >= UPDATE_TYPE_FULL)
diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h
index 6c9990bef267e..4094b4f501117 100644
--- a/drivers/gpu/drm/amd/display/dc/dc.h
+++ b/drivers/gpu/drm/amd/display/dc/dc.h
@@ -505,6 +505,9 @@ struct dc_plane_state {
 	struct dc_plane_status status;
 	struct dc_context *ctx;
 
+	/* HACK: Workaround for forcing full reprogramming under some conditions */
+	bool force_full_update;
+
 	/* private to dc_surface.c */
 	enum dc_irq_source irq_source;
 	struct kref refcount;
-- 
2.20.1




  parent reply	other threads:[~2019-05-15 11:22 UTC|newest]

Thread overview: 123+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-05-15 10:54 [PATCH 4.19 000/113] 4.19.44-stable review Greg Kroah-Hartman
2019-05-15 10:54 ` [PATCH 4.19 001/113] bfq: update internal depth state when queue depth changes Greg Kroah-Hartman
2019-05-15 10:54 ` [PATCH 4.19 002/113] platform/x86: sony-laptop: Fix unintentional fall-through Greg Kroah-Hartman
2019-05-15 10:54 ` [PATCH 4.19 003/113] platform/x86: thinkpad_acpi: Disable Bluetooth for some machines Greg Kroah-Hartman
2019-05-15 10:54 ` [PATCH 4.19 004/113] platform/x86: dell-laptop: fix rfkill functionality Greg Kroah-Hartman
2019-05-15 10:54 ` [PATCH 4.19 005/113] hwmon: (pwm-fan) Disable PWM if fetching cooling data fails Greg Kroah-Hartman
2019-05-15 10:54 ` [PATCH 4.19 006/113] kernfs: fix barrier usage in __kernfs_new_node() Greg Kroah-Hartman
2019-05-15 10:54 ` [PATCH 4.19 007/113] virt: vbox: Sanity-check parameter types for hgcm-calls coming from userspace Greg Kroah-Hartman
2019-05-15 10:54 ` [PATCH 4.19 008/113] USB: serial: fix unthrottle races Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 009/113] iio: adc: xilinx: fix potential use-after-free on remove Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 010/113] iio: adc: xilinx: fix potential use-after-free on probe Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 011/113] iio: adc: xilinx: prevent touching unclocked h/w on remove Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 012/113] acpi/nfit: Always dump _DSM output payload Greg Kroah-Hartman
2019-05-17  8:09   ` Pavel Machek
2019-05-15 10:55 ` [PATCH 4.19 013/113] libnvdimm/namespace: Fix a potential NULL pointer dereference Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 014/113] HID: input: add mapping for Expose/Overview key Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 015/113] HID: input: add mapping for keyboard Brightness Up/Down/Toggle keys Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 016/113] HID: input: add mapping for "Toggle Display" key Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 017/113] libnvdimm/btt: Fix a kmemdup failure check Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 018/113] s390/dasd: Fix capacity calculation for large volumes Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 019/113] mac80211: fix unaligned access in mesh table hash function Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 020/113] mac80211: Increase MAX_MSG_LEN Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 021/113] cfg80211: Handle WMM rules in regulatory domain intersection Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 022/113] mac80211: fix memory accounting with A-MSDU aggregation Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 023/113] nl80211: Add NL80211_FLAG_CLEAR_SKB flag for other NL commands Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 024/113] libnvdimm/pmem: fix a possible OOB access when read and write pmem Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 025/113] s390/3270: fix lockdep false positive on view->lock Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 026/113] drm/amd/display: extending AUX SW Timeout Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 027/113] clocksource/drivers/npcm: select TIMER_OF Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 028/113] clocksource/drivers/oxnas: Fix OX820 compatible Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 029/113] selftests: fib_tests: Fix Command line is not complete errors Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 030/113] mISDN: Check address length before reading address family Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 031/113] vxge: fix return of a freed memblock on a failed dma mapping Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 032/113] qede: fix write to freed pointer error and double free of ptp Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 033/113] afs: Unlock pages for __pagevec_release() Greg Kroah-Hartman
2019-05-15 10:55 ` Greg Kroah-Hartman [this message]
2019-05-15 10:55 ` [PATCH 4.19 035/113] s390/pkey: add one more argument space for debug feature entry Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 036/113] x86/build/lto: Fix truncated .bss with -fdata-sections Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 037/113] x86/reboot, efi: Use EFI reboot for Acer TravelMate X514-51T Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 038/113] KVM: fix spectrev1 gadgets Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 039/113] KVM: x86: avoid misreporting level-triggered irqs as edge-triggered in tracing Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 040/113] tools lib traceevent: Fix missing equality check for strcmp Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 041/113] ipmi: ipmi_si_hardcode.c: init si_type array to fix a crash Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 042/113] ocelot: Dont sleep in atomic context (irqs_disabled()) Greg Kroah-Hartman
2019-05-17  8:16   ` Pavel Machek
2019-05-17  9:27     ` Claudiu Manoil
2019-05-17  9:33       ` Pavel Machek
2019-05-15 10:55 ` [PATCH 4.19 043/113] scsi: aic7xxx: fix EISA support Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 044/113] mm: fix inactive list balancing between NUMA nodes and cgroups Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 045/113] init: initialize jump labels before command line option parsing Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 046/113] selftests: netfilter: check icmp pkttoobig errors are set as related Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 047/113] ipvs: do not schedule icmp errors from tunnels Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 048/113] netfilter: ctnetlink: dont use conntrack/expect object addresses as id Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 049/113] netfilter: nf_tables: prevent shift wrap in nft_chain_parse_hook() Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 050/113] MIPS: perf: ath79: Fix perfcount IRQ assignment Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 051/113] s390: ctcm: fix ctcm_new_device error return code Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 052/113] drm/sun4i: Set device driver data at bind time for use in unbind Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 053/113] drm/sun4i: Fix component unbinding and component master deletion Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 054/113] selftests/net: correct the return value for run_netsocktests Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 055/113] netfilter: fix nf_l4proto_log_invalid to log invalid packets Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 056/113] gpu: ipu-v3: dp: fix CSC handling Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 057/113] drm/imx: dont skip DP channel disable for background plane Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 058/113] ARM: 8856/1: NOMMU: Fix CCR register faulty initialization when MPU is disabled Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 059/113] spi: Micrel eth switch: declare missing of table Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 060/113] spi: ST ST95HF NFC: " Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 061/113] drm/sun4i: Unbind components before releasing DRM and memory Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 062/113] Input: synaptics-rmi4 - fix possible double free Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 063/113] RDMA/hns: Bugfix for mapping user db Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 064/113] mm/memory_hotplug.c: drop memory device reference after find_memory_block() Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 065/113] powerpc/smp: Fix NMI IPI timeout Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 066/113] powerpc/smp: Fix NMI IPI xmon timeout Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 067/113] net: dsa: mv88e6xxx: fix few issues in mv88e6390x_port_set_cmode Greg Kroah-Hartman
2019-05-15 10:55 ` [PATCH 4.19 068/113] mm/memory.c: fix modifying of page protection by insert_pfn() Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 069/113] usb: typec: Fix unchecked return value Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 070/113] netfilter: nf_tables: use-after-free in dynamic operations Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 071/113] netfilter: nf_tables: add missing ->release_ops() in error path of newrule() Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 072/113] net: fec: manage ahb clock in runtime pm Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 073/113] mlxsw: spectrum_switchdev: Add MDB entries in prepare phase Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 074/113] mlxsw: core: Do not use WQ_MEM_RECLAIM for EMAD workqueue Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 075/113] mlxsw: core: Do not use WQ_MEM_RECLAIM for mlxsw ordered workqueue Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 076/113] mlxsw: core: Do not use WQ_MEM_RECLAIM for mlxsw workqueue Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 077/113] net/tls: fix the IV leaks Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 078/113] net: strparser: partially revert "strparser: Call skb_unclone conditionally" Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 079/113] NFC: nci: Add some bounds checking in nci_hci_cmd_received() Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 080/113] nfc: nci: Potential off by one in ->pipes[] array Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 081/113] x86/kprobes: Avoid kretprobe recursion bug Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 082/113] cw1200: fix missing unlock on error in cw1200_hw_scan() Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 083/113] mwl8k: Fix rate_idx underflow Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 084/113] rtlwifi: rtl8723ae: Fix missing break in switch statement Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 085/113] Dont jump to compute_result state from check_result state Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 086/113] um: Dont hardcode path as it is architecture dependent Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 087/113] powerpc/64s: Include cpu header Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 088/113] bonding: fix arp_validate toggling in active-backup mode Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 089/113] bridge: Fix error path for kobject_init_and_add() Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 090/113] dpaa_eth: fix SG frame cleanup Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 091/113] fib_rules: return 0 directly if an exactly same rule exists when NLM_F_EXCL not supplied Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 092/113] ipv4: Fix raw socket lookup for local traffic Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 093/113] net: dsa: Fix error cleanup path in dsa_init_module Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 094/113] net: ethernet: stmmac: dwmac-sun8i: enable support of unicast filtering Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 095/113] net: macb: Change interrupt and napi enable order in open Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 096/113] net: seeq: fix crash caused by not set dev.parent Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 097/113] net: ucc_geth - fix Oops when changing number of buffers in the ring Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 098/113] packet: Fix error path in packet_init Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 099/113] selinux: do not report error on connect(AF_UNSPEC) Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 100/113] vlan: disable SIOCSHWTSTAMP in container Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 101/113] vrf: sit mtu should not be updated when vrf netdev is the link Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 102/113] tuntap: fix dividing by zero in ebpf queue selection Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 103/113] tuntap: synchronize through tfiles array instead of tun->numqueues Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 104/113] isdn: bas_gigaset: use usb_fill_int_urb() properly Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 105/113] tipc: fix hanging clients using poll with EPOLLOUT flag Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 106/113] drivers/virt/fsl_hypervisor.c: dereferencing error pointers in ioctl Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 107/113] drivers/virt/fsl_hypervisor.c: prevent integer overflow " Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 108/113] powerpc/book3s/64: check for NULL pointer in pgd_alloc() Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 109/113] powerpc/powernv/idle: Restore IAMR after idle Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 110/113] powerpc/booke64: set RI in default MSR Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 111/113] PCI: hv: Fix a memory leak in hv_eject_device_work() Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 112/113] PCI: hv: Add hv_pci_remove_slots() when we unload the driver Greg Kroah-Hartman
2019-05-15 10:56 ` [PATCH 4.19 113/113] PCI: hv: Add pci_destroy_slot() in pci_devices_present_work(), if necessary Greg Kroah-Hartman
2019-05-15 15:07 ` [PATCH 4.19 000/113] 4.19.44-stable review kernelci.org bot
2019-05-16  3:37 ` Guenter Roeck
2019-05-16  4:38 ` Naresh Kamboju
2019-05-16 11:03 ` Jon Hunter
2019-05-16 13:58 ` shuah

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190515090656.174093112@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=BhawanpreetLakha@amd.com \
    --cc=David.Francis@amd.com \
    --cc=Roman.Li@amd.com \
    --cc=alexander.deucher@amd.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nicholas.kazlauskas@amd.com \
    --cc=sashal@kernel.org \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).