From: Ben Hutchings <ben@decadent.org.uk>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: akpm@linux-foundation.org, "Bang Nguyen" <bang.nguyen@oracle.com>,
"Venkat Venkatsubra" <venkat.x.venkatsubra@oracle.com>,
"David S. Miller" <davem@davemloft.net>,
"Josh Hunt" <joshhunt00@gmail.com>,
"Honggang Li" <honli@redhat.com>
Subject: [PATCH 3.2 02/79] rds: prevent BUG_ON triggered on congestion update to loopback
Date: Wed, 12 Feb 2014 08:10:12 +0000 [thread overview]
Message-ID: <lsq.1392192612.520904147@decadent.org.uk> (raw)
In-Reply-To: <lsq.1392192611.998273004@decadent.org.uk>
3.2.55-rc1 review patch. If anyone has any objections, please let me know.
------------------
From: Venkat Venkatsubra <venkat.x.venkatsubra@oracle.com>
[ Upstream commit 18fc25c94eadc52a42c025125af24657a93638c0 ]
After congestion update on a local connection, when rds_ib_xmit returns
less bytes than that are there in the message, rds_send_xmit calls
back rds_ib_xmit with an offset that causes BUG_ON(off & RDS_FRAG_SIZE)
to trigger.
For a 4Kb PAGE_SIZE rds_ib_xmit returns min(8240,4096)=4096 when actually
the message contains 8240 bytes. rds_send_xmit thinks there is more to send
and calls rds_ib_xmit again with a data offset "off" of 4096-48(rds header)
=4048 bytes thus hitting the BUG_ON(off & RDS_FRAG_SIZE) [RDS_FRAG_SIZE=4k].
The commit 6094628bfd94323fc1cea05ec2c6affd98c18f7f
"rds: prevent BUG_ON triggering on congestion map updates" introduced
this regression. That change was addressing the triggering of a different
BUG_ON in rds_send_xmit() on PowerPC architecture with 64Kbytes PAGE_SIZE:
BUG_ON(ret != 0 &&
conn->c_xmit_sg == rm->data.op_nents);
This was the sequence it was going through:
(rds_ib_xmit)
/* Do not send cong updates to IB loopback */
if (conn->c_loopback
&& rm->m_inc.i_hdr.h_flags & RDS_FLAG_CONG_BITMAP) {
rds_cong_map_updated(conn->c_fcong, ~(u64) 0);
return sizeof(struct rds_header) + RDS_CONG_MAP_BYTES;
}
rds_ib_xmit returns 8240
rds_send_xmit:
c_xmit_data_off = 0 + 8240 - 48 (rds header accounted only the first time)
= 8192
c_xmit_data_off < 65536 (sg->length), so calls rds_ib_xmit again
rds_ib_xmit returns 8240
rds_send_xmit:
c_xmit_data_off = 8192 + 8240 = 16432, calls rds_ib_xmit again
and so on (c_xmit_data_off 24672,32912,41152,49392,57632)
rds_ib_xmit returns 8240
On this iteration this sequence causes the BUG_ON in rds_send_xmit:
while (ret) {
tmp = min_t(int, ret, sg->length - conn->c_xmit_data_off);
[tmp = 65536 - 57632 = 7904]
conn->c_xmit_data_off += tmp;
[c_xmit_data_off = 57632 + 7904 = 65536]
ret -= tmp;
[ret = 8240 - 7904 = 336]
if (conn->c_xmit_data_off == sg->length) {
conn->c_xmit_data_off = 0;
sg++;
conn->c_xmit_sg++;
BUG_ON(ret != 0 &&
conn->c_xmit_sg == rm->data.op_nents);
[c_xmit_sg = 1, rm->data.op_nents = 1]
What the current fix does:
Since the congestion update over loopback is not actually transmitted
as a message, all that rds_ib_xmit needs to do is let the caller think
the full message has been transmitted and not return partial bytes.
It will return 8240 (RDS_CONG_MAP_BYTES+48) when PAGE_SIZE is 4Kb.
And 64Kb+48 when page size is 64Kb.
Reported-by: Josh Hunt <joshhunt00@gmail.com>
Tested-by: Honggang Li <honli@redhat.com>
Acked-by: Bang Nguyen <bang.nguyen@oracle.com>
Signed-off-by: Venkat Venkatsubra <venkat.x.venkatsubra@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
---
net/rds/ib_send.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/net/rds/ib_send.c b/net/rds/ib_send.c
index e590949..37be6e2 100644
--- a/net/rds/ib_send.c
+++ b/net/rds/ib_send.c
@@ -552,9 +552,8 @@ int rds_ib_xmit(struct rds_connection *conn, struct rds_message *rm,
&& rm->m_inc.i_hdr.h_flags & RDS_FLAG_CONG_BITMAP) {
rds_cong_map_updated(conn->c_fcong, ~(u64) 0);
scat = &rm->data.op_sg[sg];
- ret = sizeof(struct rds_header) + RDS_CONG_MAP_BYTES;
- ret = min_t(int, ret, scat->length - conn->c_xmit_data_off);
- return ret;
+ ret = max_t(int, RDS_CONG_MAP_BYTES, scat->length);
+ return sizeof(struct rds_header) + ret;
}
/* FIXME we may overallocate here */
next prev parent reply other threads:[~2014-02-12 8:13 UTC|newest]
Thread overview: 83+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-02-12 8:10 [PATCH 3.2 00/79] 3.2.55-rc1 review Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 72/79] nilfs2: fix segctor bug that causes file system corruption Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 28/79] ceph: cleanup aborted requests when re-sending requests Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 08/79] drivers/net/hamradio: Integer overflow in hdlcdrv_ioctl() Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 66/79] ARM: fix "bad mode in ... handler" message for undefined instructions Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 05/79] tg3: Initialize REG_BASE_ADDR at PCI config offset 120 to 0 Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 78/79] sched: Unthrottle rt runqueues in __disable_runtime() Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 31/79] libata: add ATA_HORKAGE_BROKEN_FPDMA_AA quirk for Seagate Momentus SpinPoint M8 Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 19/79] PCI: Enable ARI if dev and upstream bridge support it; disable otherwise Ben Hutchings
2014-02-12 8:10 ` Ben Hutchings [this message]
2014-02-12 8:10 ` [PATCH 3.2 65/79] ahci: add PCI ID for Marvell 88SE9170 SATA controller Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 16/79] inet_diag: fix inet_diag_dump_icsk() timewait socket state logic Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 68/79] md/raid5: Fix possible confusion when multiple write errors occur Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 54/79] dm9601: fix reception of full size ethernet frames on dm9620/dm9621a Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 70/79] md/raid10: fix bug when raid10 recovery fails to recover a block Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 69/79] md/raid10: fix two bugs in handling of known-bad-blocks Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 12/79] vlan: Fix header ops passthru when doing TX VLAN offload Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 23/79] hpfs: fix warnings when the filesystem fills up Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 56/79] ext4: add explicit casts when masking cluster sizes Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 24/79] ath9k_htc: properly set MAC address and BSSID mask Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 03/79] ipv6: don't count addrconf generated routes against gc limit Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 51/79] cpupower: Fix segfault due to incorrect getopt_long arugments Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 46/79] sched/rt: Fix rq's cpupri leak while enqueue/dequeue child RT entities Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 34/79] ext4: check for overlapping extents in ext4_valid_extent_entries() Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 18/79] xfs: Account log unmount transaction correctly Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 77/79] sched,rt: fix isolated CPUs leaving root_task_group indefinitely throttled Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 44/79] libata: disable a disk via libata.force params Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 55/79] dm9601: work around tx fifo sync issue on dm962x Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 36/79] ext4: fix del_timer() misuse for ->s_err_report Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 53/79] net_dma: mark broken Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 13/79] net: llc: fix use after free in llc_ui_recvmsg Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 74/79] mm: fix aio performance regression for database caused by THP Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 64/79] pci: Add PCI_DEVICE_SUB() macro Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 29/79] ceph: wake up 'safe' waiters when unregistering request Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 27/79] mm: ensure get_unmapped_area() returns higher address than mmap_min_addr Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 32/79] ext4: call ext4_error_inode() if jbd2_journal_dirty_metadata() fails Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 40/79] ALSA: hda - Add enable_msi=0 workaround for four HP machines Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 75/79] mm: hugetlbfs: fix hugetlbfs optimization Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 25/79] KVM: x86: Convert vapic synchronization to _cached functions (CVE-2013-6368) Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 22/79] [IA64] Fix warning from machine_kexec.c Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 35/79] ext2: Fix oops in ext2_get_block() called from ext2_quota_write() Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 63/79] ahci: add an observed PCI ID for Marvell 88se9172 SATA controller Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 30/79] sh: always link in helper functions extracted from libgcc Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 01/79] net: do not pretend FRAGLIST support Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 50/79] ath9k: Fix interrupt handling for the AR9002 family Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 79/79] sched/rt: Avoid updating RT entry timeout twice within one tick period Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 42/79] radiotap: fix bitmap-end-finding buffer overrun Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 04/79] net: drop_monitor: fix the value of maxattr Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 41/79] gpio: msm: Fix irq mask/unmask by writing bits instead of numbers Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 47/79] ALSA: Add SNDRV_PCM_STATE_PAUSED case in wait_for_avail function Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 07/79] net: inet_diag: zero out uninitialized idiag_{src,dst} fields Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 21/79] staging: comedi: cb_pcidio: fix for newer PCI-DIO48H Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 52/79] ASoC: wm8904: fix DSP mode B configuration Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 43/79] ftrace: Initialize the ftrace profiler for each possible cpu Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 17/79] net: avoid reference counter overflows on fib_rules in multicast forwarding Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 26/79] x86, fpu, amd: Clear exceptions in AMD FXSAVE workaround Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 38/79] iscsi-target: Fix-up all zero data-length CDBs with R/W_BIT set Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 73/79] perf/x86/amd/ibs: Fix waking up from S3 for AMD family 10h Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 62/79] ahci: Use PCI_VENDOR_ID_MARVELL_EXT for 0x1b4b Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 15/79] bnx2x: fix DMA unmapping of TSO split BDs Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 71/79] hwmon: (coretemp) Fix truncated name of alarm attributes Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 10/79] rds: prevent dereference of a NULL device Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 39/79] drm/radeon: Fix sideport problems on certain RS690 boards Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 20/79] mm/memory-failure.c: recheck PageHuge() after hugetlb page migrate successfully Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 58/79] selinux: fix broken peer recv check Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 59/79] selinux: selinux_setprocattr()->ptrace_parent() needs rcu_read_lock() Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 33/79] ext4: fix use-after-free in ext4_mb_new_blocks Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 57/79] drm/radeon: 0x9649 is SUMO2 not SUMO Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 48/79] drm/i915: Use the correct GMCH_CTRL register for Sandybridge+ Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 76/79] sched/rt: Fix SCHED_RR across cgroups Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 67/79] SELinux: Fix possible NULL pointer dereference in selinux_inode_permission() Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 14/79] bridge: use spin_lock_bh() in br_multicast_set_hash_max Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 06/79] net: unix: allow bind to fail on mutex lock Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 61/79] powerpc: Fix bad stack check in exception entry Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 60/79] ARM: fix footbridge clockevent device Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 45/79] drm/ttm: Fix accesses through vmas with only partial coverage Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 09/79] hamradio/yam: fix info leak in ioctl Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 37/79] xhci: Limit the spurious wakeup fix only to HP machines Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 11/79] net: rose: restore old recvmsg behavior Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 49/79] rtlwifi: pci: Fix oops on driver unload Ben Hutchings
2014-02-12 8:16 ` [PATCH 3.2 00/79] 3.2.55-rc1 review Ben Hutchings
2014-02-12 11:50 ` Guenter Roeck
2014-02-12 18:14 ` Ben Hutchings
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=lsq.1392192612.520904147@decadent.org.uk \
--to=ben@decadent.org.uk \
--cc=akpm@linux-foundation.org \
--cc=bang.nguyen@oracle.com \
--cc=davem@davemloft.net \
--cc=honli@redhat.com \
--cc=joshhunt00@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=stable@vger.kernel.org \
--cc=venkat.x.venkatsubra@oracle.com \
/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
all inboxes | Powered by JetHome®