mbox series

[v8,00/14] msvc integration changes

Message ID 1682997341-2271-1-git-send-email-roretzla@linux.microsoft.com (mailing list archive)
Series msvc integration changes |


Tyler Retzlaff May 2, 2023, 3:15 a.m. UTC
  In accordance with draft plan
introduces conditionally compiled code to enable building with MSVC that
_does not_ require C99/C11 meaning it can be integrated now.

This series covers minimal changes for item #2 in draft plan for EAL
dependencies kvargs, telemetry and consumed EAL public headers.

Note if any patch in the series requires in-depth discussion I'll
detach it from this series for separate submission & more focused
discussion so it doesn't block the entire series.

Note other "common" intrinsics were investigated for viability but
were not adopted either because they were not available on older
versions of gcc or because they generate different code for msvc
vs gcc.

  * use waitpkg intrinsics if __WAITPKG__ is defined by the

  * remove patch typedef of rte_cpuflags_t as an int. for now we
    will just allow warning to be emitted to avoid adding conditional

  * convert / expand likely/unlikely macros to _Bool type
  * expand __extension__ empty it's cleaner to do this for now
    instead of modifying the whole tree
  * provide msvc container_of not based on gcc expression
    statement extension
  * add patch that stops defining typeof (C23 keyword) when
    building with msvc

  * remove accidental line removal in barrier patch
  * update prefetch patch to use intrinsics for all toolchains
  * remove x86 specific changes for byte swap patch since
    msvc intrinsics are processor agnostic always use
    intrinsics from generic include
  * expand __rte_packed empty for msvc packing will be addressed
    in a separate series

  * update rdtsc patch to use gcc intrinsics
  * update rtm patch to use gcc intrinsics
  * drop patch disable json print formatting, we will utilize
    series removing VLAs from Bruce
  * added patch using prefetch intrinsics for msvc
  * added patch using byte swap intrinsics for msvc
  * added patch hiding typdefs for msvc using gcc vector
  * added patch defining MSVC as little endian always

  * v3 does not group together conditional blocks when experimented
    with it didn't reduce conditionals enough to make it worth
    while. once msvc tests are at a running point i suggest
    a narrow targeted discussion about code organization without
    blocking this series
  * v3 does not attempt to refactor to use intrinsics for non-msvc
    compilers. again this should be done as a separate follow-up
    series later if desired
  * fix expansion of likely and unlikely macros
  * remove unnecessary define for rte_smp_{r,w}mb it is sufficient
    for these to be compiler barriers on x86
  * add a new patch to use __cpuid and __cpuidex intrinsics when
    building with msvc
  * add a new patch to use _umonitor, _umwait and _tpause intrinsics
    when building with msvc

  * use _mm_{l,s,m}fence intrinsics for rte_smp_{r,w,}mb macros
    are intended to be memory barriers not compiler barriers on

Tyler Retzlaff (14):
  eal: use rdtsc intrinsic
  eal: use rtm and xtest intrinsics
  eal: use barrier intrinsics
  eal: use cpuid and cpuidex intrinsics
  eal: use umonitor umwait and tpause intrinsics
  eal: use prefetch intrinsics
  eal: use byte swap intrinsics
  eal: hide GCC extension based alignment markers
  eal: hide typedefs based on GCC vector extensions
  eal: expand most macros to empty when using MSVC
  eal: exclude exposure of rte atomic APIs for MSVC builds
  telemetry: avoid expanding versioned symbol macros on MSVC
  eal: always define MSVC as little endian
  eal: do not define typeof macro when building with MSVC

 config/x86/meson.build                  |  6 ++++
 lib/eal/include/generic/rte_atomic.h    | 11 ++++++
 lib/eal/include/generic/rte_byteorder.h | 13 +++++++
 lib/eal/include/generic/rte_vect.h      |  4 +++
 lib/eal/include/rte_branch_prediction.h |  8 +++++
 lib/eal/include/rte_common.h            | 60 +++++++++++++++++++++++++++++++++
 lib/eal/include/rte_compat.h            | 20 +++++++++++
 lib/eal/x86/include/rte_atomic.h        |  8 +++++
 lib/eal/x86/include/rte_byteorder.h     |  4 +++
 lib/eal/x86/include/rte_cycles.h        | 14 ++++----
 lib/eal/x86/include/rte_prefetch.h      | 25 +++++++++++---
 lib/eal/x86/include/rte_rtm.h           | 18 +++-------
 lib/eal/x86/rte_cpuflags.c              |  4 +++
 lib/eal/x86/rte_cpuid.h                 |  7 ++++
 lib/eal/x86/rte_cycles.c                | 36 ++++++++++++++++++++
 lib/eal/x86/rte_hypervisor.c            |  4 +++
 lib/eal/x86/rte_power_intrinsics.c      | 12 +++++++
 lib/telemetry/telemetry_data.c          | 16 +++++++++
 18 files changed, 247 insertions(+), 23 deletions(-)