[
https://issues.apache.org/jira/browse/TS-4233?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15170141#comment-15170141
]
ASF GitHub Bot commented on TS-4233:
------------------------------------
GitHub user shaygalon opened a pull request:
https://github.com/apache/trafficserver/pull/502
TS-4233 AARCH64 48b va freelist fix
Tested on linux aarch64 Cavium ThunderX platform, 4.2 kernel configured
with 64K pages.
Crashes during freelist operations when trying to access pointer after sign
extension.
Freelist pointer versioning sign extends upper 16 bits. Does not work well
for 48b va on aarch64.
Patch clears the upper 16 bits instead.
You can merge this pull request into a Git repository by running:
$ git pull https://github.com/shaygalon/trafficserver master
Alternatively you can review and apply these changes as the patch at:
https://github.com/apache/trafficserver/pull/502.patch
To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:
This closes #502
----
commit f304c50a2c00d7d711015c981b2007dacdf159b7
Author: Shay Gal-On <[email protected]>
Date: 2016-02-26T23:46:01Z
TS-4233 AARCH64 48b va freelist fix
----
> ATS on AARCH64 with 64K page kernel crashes
> -------------------------------------------
>
> Key: TS-4233
> URL: https://issues.apache.org/jira/browse/TS-4233
> Project: Traffic Server
> Issue Type: Bug
> Components: Core
> Reporter: Shay Gal-On
> Fix For: sometime
>
>
> Tested on linux aarch64 Cavium ThunderX platform, 4.2 kernel configured with
> 64K pages. Crashes are caused by 2 issues:
> 1. Freelist pointer versioning sign extends upper 16 bits. Does not work well
> for 48b va on aarch64.
> Patch:
> --- orig-trafficserver-5.3.2/lib/ts/ink_queue.h 2015-09-08 13:05:06.000000000
> -0700
> +++ trafficserver-5.3.2/lib/ts/ink_queue.h 2016-02-18 09:02:36.899451000
> -0800
> @@ -135,11 +135,16 @@
> #define SET_FREELIST_POINTER_VERSION(_x, _p, _v) \
> (_x).s.pointer = _p; \
> (_x).s.version = _v
> -#elif defined(__x86_64__) || defined(__ia64__) || defined(__powerpc64__) ||
> defined(__aarch64__)
> +#elif defined(__x86_64__) || defined(__ia64__) || defined(__powerpc64__)
> #define FREELIST_POINTER(_x) \
> ((void *)(((((intptr_t)(_x).data) << 16) >> 16) |
> (((~((((intptr_t)(_x).data) << 16 >> 63) - 1)) >> 48) << 48))) // sign extend
> #define FREELIST_VERSION(_x) (((intptr_t)(_x).data) >> 48)
> #define SET_FREELIST_POINTER_VERSION(_x, _p, _v) (_x).data =
> ((((intptr_t)(_p)) & 0x0000FFFFFFFFFFFFULL) | (((_v)&0xFFFFULL) << 48))
> +#elif defined(__aarch64__)
> +#define FREELIST_POINTER(_x) \
> + ((void *)(((((intptr_t)(_x).data) & 0x0000FFFFFFFFFFFFULL )))) // clear
> the version
> +#define FREELIST_VERSION(_x) (((intptr_t)(_x).data) >> 48)
> +#define SET_FREELIST_POINTER_VERSION(_x, _p, _v) (_x).data =
> ((((intptr_t)(_p)) & 0x0000FFFFFFFFFFFFULL) | (((_v)&0xFFFFULL) << 48))
> #else
> #error "unsupported processor"
> #endif
> 2. The iocore cache sets the STORE_BLOCK_SIZE to 8k. However, in order to
> mmap files, the size has to be a multiple of kernel page size, so that with
> 64K pages it is possible to get bad offsets when remapping the cache blocks.
> Following patch wraps the block size, and adds configure check for 64K pages
> to override it in that case.
> diff -Naur orig-trafficserver-5.3.2/iocore/cache/I_Store.h
> trafficserver-5.3.2/iocore/cache/I_Store.h
> --- orig-trafficserver-5.3.2/iocore/cache/I_Store.h 2015-09-08
> 13:05:06.000000000 -0700
> +++ trafficserver-5.3.2/iocore/cache/I_Store.h 2016-02-18 08:52:32.459451000
> -0800
> @@ -33,7 +33,9 @@
> #include "libts.h"
> +#ifndef STORE_BLOCK_SIZE
> #define STORE_BLOCK_SIZE 8192
> +#endif
> #define STORE_BLOCK_SHIFT 13
> #define DEFAULT_HW_SECTOR_SIZE 512
> --- orig-trafficserver-5.3.2/configure.ac 2015-09-08 13:05:06.000000000
> -0700
> +++ trafficserver-5.3.2/configure.ac 2016-02-26 11:09:12.099451000 -0800
> @@ -1324,6 +1324,14 @@
> TS_ADDTO(CFLAGS, [-mcx16])
> TS_ADDTO(CXXFLAGS, [-mcx16])
> ])
> +AC_MSG_CHECKING([TESTING KERNEL PAGE SIZE])
> +kernel_page_size=`getconf PAGE_SIZE`
> +AS_IF([test "x${kernel_page_size}" = "x65536"],
> +[
> + TS_ADDTO(CXXFLAGS, [-DSTORE_BLOCK_SIZE=65536])
> +]
> +)
> +AC_MSG_RESULT([$kernel_page_size])
> # Check for POSIX capabilities library.
> # If we don't find it, disable checking for header.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)