[ 
https://issues.apache.org/jira/browse/TS-4233?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Bryan Call updated TS-4233:
---------------------------
    Assignee: Alan M. Carroll

> 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
>            Assignee: Alan M. Carroll
>             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)

Reply via email to