4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * CDDL HEADER START
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * The contents of this file are subject to the terms of the
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * Common Development and Distribution License (the "License").
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * You may not use this file except in compliance with the License.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * or http://www.opensolaris.org/os/licensing.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * See the License for the specific language governing permissions
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * and limitations under the License.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * When distributing Covered Code, include this CDDL HEADER in each
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * If applicable, add the following below this CDDL HEADER, with the
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * fields enclosed by brackets "[]" replaced with your own identifying
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * information: Portions Copyright [yyyy] [name of copyright owner]
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * CDDL HEADER END
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore/* Copyright © 2003-2011 Emulex. All rights reserved. */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * Source file containing the implementation of the driver
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * helper functions
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#include <oce_impl.h>
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic void oce_list_del_node(OCE_LIST_NODE_T *prev_node,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OCE_LIST_NODE_T *next_node);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic void oce_list_remove(OCE_LIST_NODE_T *list_node);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic void oce_list_insert_node(OCE_LIST_NODE_T *list_node,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OCE_LIST_NODE_T *prev_node, OCE_LIST_NODE_T *next_node);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to breakup a block of memory into pages and return the address
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * in an array
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dbuf - pointer to structure describing DMA-able memory
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * pa_list - [OUT] pointer to an array to return the PA of pages
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * list_size - number of entries in pa_list
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanvoid
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_page_list(oce_dma_buf_t *dbuf,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct phys_addr *pa_list, int list_size)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int i = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint64_t paddr = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ASSERT(dbuf != NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ASSERT(pa_list != NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan paddr = DBUF_PA(dbuf);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan for (i = 0; i < list_size; i++) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan pa_list[i].lo = ADDR_LO(paddr);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan pa_list[i].hi = ADDR_HI(paddr);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan paddr += PAGE_4K;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_page_list */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanvoid
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanoce_list_link_init(OCE_LIST_NODE_T *list_node)
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan{
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan list_node->next = NULL;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan list_node->prev = NULL;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan}
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic inline void
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_list_insert_node(OCE_LIST_NODE_T *list_node, OCE_LIST_NODE_T *prev_node,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OCE_LIST_NODE_T *next_node)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan next_node->prev = list_node;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan list_node->next = next_node;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan list_node->prev = prev_node;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan prev_node->next = list_node;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic inline void
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_list_del_node(OCE_LIST_NODE_T *prev_node, OCE_LIST_NODE_T *next_node)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan next_node->prev = prev_node;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan prev_node->next = next_node;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic inline void
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_list_remove(OCE_LIST_NODE_T *list_node)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_list_del_node(list_node->prev, list_node->next);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan list_node->next = list_node->prev = NULL;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanvoid
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_list_create(OCE_LIST_T *list_hdr, void *arg)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan list_hdr->head.next = list_hdr->head.prev = &list_hdr->head;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_init(&list_hdr->list_lock, NULL, MUTEX_DRIVER, arg);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan list_hdr->nitems = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanvoid
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_list_destroy(OCE_LIST_T *list_hdr)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ASSERT(list_hdr->nitems == 0);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan list_hdr->head.next = list_hdr->head.prev = NULL;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_destroy(&list_hdr->list_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanvoid
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_list_insert_tail(OCE_LIST_T *list_hdr, OCE_LIST_NODE_T *list_node)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OCE_LIST_NODE_T *head = &list_hdr->head;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ASSERT(list_hdr != NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ASSERT(list_node != NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_enter(&list_hdr->list_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_list_insert_node(list_node, head->prev, head);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan list_hdr->nitems++;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_exit(&list_hdr->list_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanvoid
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_list_insert_head(OCE_LIST_T *list_hdr, OCE_LIST_NODE_T *list_node)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OCE_LIST_NODE_T *head = &list_hdr->head;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ASSERT(list_hdr != NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ASSERT(list_node != NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_enter(&list_hdr->list_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_list_insert_node(list_node, head, head->next);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan list_hdr->nitems++;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_exit(&list_hdr->list_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanvoid *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_list_remove_tail(OCE_LIST_T *list_hdr)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OCE_LIST_NODE_T *list_node;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (list_hdr == NULL) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_enter(&list_hdr->list_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (list_hdr->nitems <= 0) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_exit(&list_hdr->list_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan list_node = list_hdr->head.prev;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_list_remove(list_node);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan list_hdr->nitems--;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_exit(&list_hdr->list_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (list_node);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanvoid *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_list_remove_head(OCE_LIST_T *list_hdr)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OCE_LIST_NODE_T *list_node;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (list_hdr == NULL) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_enter(&list_hdr->list_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (list_hdr->nitems <= 0) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_exit(&list_hdr->list_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan list_node = list_hdr->head.next;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (list_node != NULL) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_list_remove(list_node);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan list_hdr->nitems--;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_exit(&list_hdr->list_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (list_node);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanboolean_t
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_list_is_empty(OCE_LIST_T *list_hdr)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (list_hdr == NULL)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (B_TRUE);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan else
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (list_hdr->nitems <= 0);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_list_items_avail(OCE_LIST_T *list_hdr)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (list_hdr == NULL)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (0);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan else
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (list_hdr->nitems);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanvoid
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_list_remove_node(OCE_LIST_T *list_hdr, OCE_LIST_NODE_T *list_node)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_enter(&list_hdr->list_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_list_remove(list_node);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mutex_exit(&list_hdr->list_lock);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanvoid
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanoce_gen_hkey(char *hkey, int key_size)
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan{
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan int i;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan int nkeys = key_size/sizeof (uint32_t);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan for (i = 0; i < nkeys; i++) {
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan (void) random_get_pseudo_bytes(
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan (uint8_t *)&hkey[i * sizeof (uint32_t)],
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan sizeof (uint32_t));
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan }
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan}
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanint
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanoce_atomic_reserve(uint32_t *count_p, uint32_t n)
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan{
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan uint32_t oldval;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan uint32_t newval;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan /*
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan * ATOMICALLY
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan */
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan do {
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan oldval = *count_p;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan if (oldval < n)
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan return (-1);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan newval = oldval - n;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan } while (atomic_cas_32(count_p, oldval, newval) != oldval);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan return (newval);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan}