diff mbox

[v3,1/2] RDS: fix "Kernel unaligned access" on sparc64

Message ID 1459686244-14939-1-git-send-email-shamir.rabinovitch@oracle.com
State Changes Requested, archived
Delegated to: David Miller
Headers show

Commit Message

Shamir Rabinovitch April 3, 2016, 12:24 p.m. UTC
Sparc64 expect 64 bit types to be aligned to 8. This patch ensure that
memory allocated by 'rds_page_remainder_alloc' will be aligned to 8.
This patch fix issue found in 'rds_ib_cong_recv' when accessing
unaligned memory using uint64_t pointer.

Signed-off-by: Shamir Rabinovitch <shamir.rabinovitch@oracle.com>

Reviewed-by: Wengang Wang <wen.gang.wang@oracle.com>
Reviewed-by: Ajaykumar Hotchandani <ajaykumar.hotchandani@oracle.com>
Acked-by: Santosh Shilimkar <santosh.shilimkar@oracle.com>
Tested-by: Anand Bibhuti <anand.bibhuti@oracle.com>
---
 net/rds/page.c |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

Comments

David Miller April 4, 2016, 7:57 p.m. UTC | #1
From: Shamir Rabinovitch <shamir.rabinovitch@oracle.com>
Date: Sun,  3 Apr 2016 08:24:03 -0400

> @@ -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) {
> +			/* fix 'Kernel unaligned access' on sparc64 */
> +			rem->r_offset += ALIGN(bytes, 8);
> +			if (rem->r_offset >= PAGE_SIZE) {

It is inappropriate to mark things with a comment like this in code
that has nothing at all to do what a specific architecture.

64-bit alignment, and this requirement, is also not sparc64 specific.
Other architectures have the same issue.

Next, comments should aide in the understanding of what the code is
trying to accomplish, when necessary.  So, something more appropriate
would be:

	/* Objects in this memory can countain 64-bit integers, align
	 * in order to accomodate that.
	 */

But it's very close to obvious here what the code is doing, and why
it might be doing so.

So I'd so no comment at all works best here.

I'm sorry, but it's a real pet peeve of mine when people mention
totally irrelevant crap in code comments.  What the heck does sparc64
have to do with aligning memory properly for the data types you will
be storing in that memory?!?!
diff mbox

Patch

diff --git a/net/rds/page.c b/net/rds/page.c
index 616f21f..4813e1f 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) {
+			/* fix 'Kernel unaligned access' on sparc64 */
+			rem->r_offset += ALIGN(bytes, 8);
+			if (rem->r_offset >= PAGE_SIZE) {
 				__free_page(rem->r_page);
 				rem->r_page = NULL;
 			}