From patchwork Thu Mar 31 06:29:22 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shamir Rabinovitch X-Patchwork-Id: 604161 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3qbRnm5ltKz9sDC for ; Fri, 1 Apr 2016 01:33:16 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757075AbcCaOdP (ORCPT ); Thu, 31 Mar 2016 10:33:15 -0400 Received: from userp1040.oracle.com ([156.151.31.81]:36753 "EHLO userp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753530AbcCaOdO (ORCPT ); Thu, 31 Mar 2016 10:33:14 -0400 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u2VEXBB7013180 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 31 Mar 2016 14:33:11 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u2VEXAsP016079 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 31 Mar 2016 14:33:10 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u2VEXAVk017699; Thu, 31 Mar 2016 14:33:10 GMT Received: from shamir-net-srv.us.oracle.com (/10.211.3.142) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 31 Mar 2016 07:33:09 -0700 From: shamir rabinovitch To: rds-devel@oss.oracle.com, netdev@vger.kernel.org Cc: davem@davemloft.net, shamir.rabinovitch@oracle.com Subject: [PATCH v2] rds: rds-stress show all zeros after few minutes Date: Thu, 31 Mar 2016 02:29:22 -0400 Message-Id: <1459405762-29778-1-git-send-email-shamir.rabinovitch@oracle.com> X-Mailer: git-send-email 1.7.1 X-Source-IP: userv0022.oracle.com [156.151.31.74] Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Issue can be seen on platforms that use 8K and above page size while rds fragment size is 4K. On those platforms single page is shared between 2 or more rds fragments. Each fragment has its own offset and rds congestion map code need to take this offset to account. Not taking this offset to account lead to reading the data fragment as congestion map fragment and hang of the rds transmit due to far congestion map corruption. Signed-off-by: shamir rabinovitch Reviewed-by: Wengang Wang Reviewed-by: Ajaykumar Hotchandani Acked-by: Santosh Shilimkar Tested-by: Anand Bibhuti --- net/rds/ib_recv.c | 2 +- net/rds/iw_recv.c | 2 +- net/rds/page.c | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/net/rds/ib_recv.c b/net/rds/ib_recv.c index 977fb86..abc8cc8 100644 --- a/net/rds/ib_recv.c +++ b/net/rds/ib_recv.c @@ -796,7 +796,7 @@ static void rds_ib_cong_recv(struct rds_connection *conn, addr = kmap_atomic(sg_page(&frag->f_sg)); - src = addr + frag_off; + src = addr + frag->f_sg.offset + frag_off; dst = (void *)map->m_page_addrs[map_page] + map_off; for (k = 0; k < to_copy; k += 8) { /* Record ports that became uncongested, ie diff --git a/net/rds/iw_recv.c b/net/rds/iw_recv.c index a66d179..62a1738 100644 --- a/net/rds/iw_recv.c +++ b/net/rds/iw_recv.c @@ -585,7 +585,7 @@ static void rds_iw_cong_recv(struct rds_connection *conn, addr = kmap_atomic(frag->f_page); - src = addr + frag_off; + src = addr + frag->f_offset + frag_off; dst = (void *)map->m_page_addrs[map_page] + map_off; for (k = 0; k < to_copy; k += 8) { /* Record ports that became uncongested, ie diff --git a/net/rds/page.c b/net/rds/page.c index 5a14e6d..715cbaa 100644 --- a/net/rds/page.c +++ b/net/rds/page.c @@ -135,8 +135,9 @@ int rds_page_remainder_alloc(struct scatterlist *scat, unsigned long bytes, if (rem->r_offset != 0) rds_stats_inc(s_page_remainder_hit); - rem->r_offset += bytes; - if (rem->r_offset == PAGE_SIZE) { + /* some hw (e.g. sparc) require aligned memory */ + rem->r_offset += ALIGN(bytes, 8); + if (rem->r_offset >= PAGE_SIZE) { __free_page(rem->r_page); rem->r_page = NULL; }