LCOV - code coverage report
Current view: top level - include/spdk_internal - sgl.h (source / functions) Hit Total Coverage
Test: ut_cov_unit.info Lines: 29 29 100.0 %
Date: 2024-12-15 17:30:36 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /*   SPDX-License-Identifier: BSD-3-Clause
       2             :  *   Copyright (C) 2021 Intel Corporation.
       3             :  *   All rights reserved.
       4             :  */
       5             : 
       6             : #ifndef __SGL_INTERNAL_H__
       7             : #define __SGL_INTERNAL_H__
       8             : 
       9             : #include "spdk/stdinc.h"
      10             : 
      11             : #ifdef __cplusplus
      12             : extern "C" {
      13             : #endif
      14             : 
      15             : struct spdk_iov_sgl {
      16             :         struct iovec    *iov;
      17             :         int             iovcnt;
      18             :         uint32_t        iov_offset;
      19             :         uint32_t        total_size;
      20             : };
      21             : 
      22             : /**
      23             :  * Initialize struct spdk_iov_sgl with iov, iovcnt and iov_offset.
      24             :  *
      25             :  * \param s the spdk_iov_sgl to be filled.
      26             :  * \param iov the io vector to fill the s
      27             :  * \param iovcnt the size the iov
      28             :  * \param iov_offset the current filled iov_offset for s.
      29             :  */
      30             : 
      31             : static inline void
      32          97 : spdk_iov_sgl_init(struct spdk_iov_sgl *s, struct iovec *iov, int iovcnt,
      33             :                   uint32_t iov_offset)
      34             : {
      35          97 :         s->iov = iov;
      36          97 :         s->iovcnt = iovcnt;
      37          97 :         s->iov_offset = iov_offset;
      38          97 :         s->total_size = 0;
      39          97 : }
      40             : 
      41             : /**
      42             :  * Consume the iovs in spdk_iov_sgl with passed bytes
      43             :  *
      44             :  * \param s the spdk_iov_sgl which contains the iov
      45             :  * \param step the bytes_size consumed.
      46             :  */
      47             : 
      48             : static inline void
      49          68 : spdk_iov_sgl_advance(struct spdk_iov_sgl *s, uint32_t step)
      50             : {
      51          68 :         s->iov_offset += step;
      52         123 :         while (s->iovcnt > 0) {
      53         111 :                 assert(s->iov != NULL);
      54         111 :                 if (s->iov_offset < s->iov->iov_len) {
      55          56 :                         break;
      56             :                 }
      57             : 
      58          55 :                 s->iov_offset -= s->iov->iov_len;
      59          55 :                 s->iov++;
      60          55 :                 s->iovcnt--;
      61             :         }
      62          68 : }
      63             : 
      64             : /**
      65             :  * Append the data to the struct spdk_iov_sgl pointed by s
      66             :  *
      67             :  * \param s the address of the struct spdk_iov_sgl
      68             :  * \param data the data buffer to be appended
      69             :  * \param data_len the length of the data.
      70             :  *
      71             :  * \return true if all the data is appended.
      72             :  */
      73             : 
      74             : static inline bool
      75         206 : spdk_iov_sgl_append(struct spdk_iov_sgl *s, uint8_t *data, uint32_t data_len)
      76             : {
      77         206 :         if (s->iov_offset >= data_len) {
      78          18 :                 s->iov_offset -= data_len;
      79             :         } else {
      80         188 :                 assert(s->iovcnt > 0);
      81         188 :                 s->iov->iov_base = data + s->iov_offset;
      82         188 :                 s->iov->iov_len = data_len - s->iov_offset;
      83         188 :                 s->total_size += data_len - s->iov_offset;
      84         188 :                 s->iov_offset = 0;
      85         188 :                 s->iov++;
      86         188 :                 s->iovcnt--;
      87         188 :                 if (s->iovcnt == 0) {
      88           6 :                         return false;
      89             :                 }
      90             :         }
      91             : 
      92         200 :         return true;
      93             : }
      94             : 
      95             : #ifdef __cplusplus
      96             : }
      97             : #endif
      98             : 
      99             : #endif /* __SGL_INTERNAL_H__ */

Generated by: LCOV version 1.15