You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@trafficserver.apache.org by "Bryan Call (JIRA)" <ji...@apache.org> on 2016/08/17 17:39:20 UTC

[jira] [Updated] (TS-4233) ATS on AARCH64 with 64K page kernel crashes

     [ 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)