The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/qat/qat_api/qat_utils/src/QatUtilsServices.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /* SPDX-License-Identifier: BSD-3-Clause */
    2 /* Copyright(c) 2007-2022 Intel Corporation */
    3 /* $FreeBSD$ */
    4 #include "qat_utils.h"
    5 
    6 #include <sys/param.h>
    7 #include <sys/types.h>
    8 #include <sys/systm.h>
    9 #include <sys/kernel.h>
   10 #include <sys/malloc.h>
   11 #include <sys/proc.h>
   12 #include <sys/sched.h>
   13 #include <sys/time.h>
   14 #include <machine/stdarg.h>
   15 #include <vm/vm.h>
   16 #include <vm/pmap.h>
   17 
   18 /**
   19  *
   20  * @brief Private data structure
   21  *
   22  *  Data struct to store the information on the
   23  *  memory allocated. This structure is stored at the beginning of
   24  *  the allocated chunck of memory
   25  *  size is the no of byte passed to the memory allocation functions
   26  *  mSize is the real size of the memory required to the OS
   27  *
   28  *  +----------------------------+--------------------------------+
   29  *  | QatUtilsMemAllocInfoStruct | memory returned to user (size) |
   30  *  +----------------------------+--------------------------------+
   31  *  ^                            ^
   32  *  mAllocMemPtr                 Ptr returned to the caller of MemAlloc*
   33  *
   34  */
   35 
   36 typedef struct _QatUtilsMemAllocInfoStruct {
   37         void *mAllocMemPtr; /* memory addr returned by the kernel */
   38         uint32_t mSize;     /* allocated size */
   39 } QatUtilsMemAllocInfoStruct;
   40 
   41 /**************************************
   42  * Memory functions
   43  *************************************/
   44 void *
   45 qatUtilsMemAllocContiguousNUMA(uint32_t size, uint32_t node, uint32_t alignment)
   46 {
   47         void *ptr = NULL;
   48         void *pRet = NULL;
   49         uint32_t alignment_offset = 0;
   50 
   51         QatUtilsMemAllocInfoStruct memInfo = { 0 };
   52         if (size == 0 || alignment < 1) {
   53                 QAT_UTILS_LOG(
   54                     "QatUtilsMemAllocNUMA: size or alignment are zero.\n");
   55                 return NULL;
   56         }
   57         if (alignment & (alignment - 1)) {
   58                 QAT_UTILS_LOG(
   59                     "QatUtilsMemAllocNUMA: Expecting alignment of a power.\n");
   60                 return NULL;
   61         }
   62 
   63         memInfo.mSize = size + alignment + sizeof(QatUtilsMemAllocInfoStruct);
   64         ptr = contigmalloc(memInfo.mSize, M_QAT, M_WAITOK, 0, ~1UL, 64, 0);
   65 
   66         memInfo.mAllocMemPtr = ptr;
   67         pRet =
   68             (char *)memInfo.mAllocMemPtr + sizeof(QatUtilsMemAllocInfoStruct);
   69 #ifdef __x86_64__
   70         alignment_offset = (uint64_t)pRet % alignment;
   71 #else
   72         alignment_offset = (uint32_t)pRet % alignment;
   73 #endif
   74         pRet = (char *)pRet + (alignment - alignment_offset);
   75         memcpy(((char *)pRet) - sizeof(QatUtilsMemAllocInfoStruct),
   76                &memInfo,
   77                sizeof(QatUtilsMemAllocInfoStruct));
   78 
   79         return pRet;
   80 }
   81 
   82 void
   83 qatUtilsMemFreeNUMA(void *ptr)
   84 {
   85         QatUtilsMemAllocInfoStruct *memInfo = NULL;
   86 
   87         memInfo =
   88             (QatUtilsMemAllocInfoStruct *)((int8_t *)ptr -
   89                                            sizeof(QatUtilsMemAllocInfoStruct));
   90         if (memInfo->mSize == 0 || memInfo->mAllocMemPtr == NULL) {
   91                 QAT_UTILS_LOG(
   92                     "QatUtilsMemAlignedFree: Detected corrupted data: memory leak!\n");
   93                 return;
   94         }
   95         contigfree(memInfo->mAllocMemPtr, memInfo->mSize, M_QAT);
   96 }
   97 
   98 CpaStatus
   99 qatUtilsSleep(uint32_t milliseconds)
  100 {
  101         if (milliseconds != 0) {
  102                 pause("qatUtils sleep", milliseconds * hz / (1000));
  103         } else {
  104                 sched_relinquish(curthread);
  105         }
  106         return CPA_STATUS_SUCCESS;
  107 }
  108 
  109 void
  110 qatUtilsYield(void)
  111 {
  112         sched_relinquish(curthread);
  113 }

Cache object: 7dc937932d25184073fdcf8192d2341a


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.