ehca_cq.c revision b9012e0a4255c93e1d81f1ccee591de6414b5955
1fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick/* 2fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * IBM eServer eHCA Infiniband device driver for Linux on POWER 3fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 4fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * Completion queue handling 5fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 6fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * Authors: Waleri Fomin <fomin@de.ibm.com> 7fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * Khadija Souissi <souissi@de.ibm.com> 8fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * Reinhard Ernst <rernst@de.ibm.com> 9fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * Heiko J Schick <schickhj@de.ibm.com> 10fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * Hoang-Nam Nguyen <hnguyen@de.ibm.com> 11fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 12fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 13fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * Copyright (c) 2005 IBM Corporation 14fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 15fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * All rights reserved. 16fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 17fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * This source code is distributed under a dual license of GPL v2.0 and OpenIB 18fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * BSD. 19fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 20fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * OpenIB BSD License 21fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 22fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * Redistribution and use in source and binary forms, with or without 23fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * modification, are permitted provided that the following conditions are met: 24fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 25fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * Redistributions of source code must retain the above copyright notice, this 26fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * list of conditions and the following disclaimer. 27fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 28fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * Redistributions in binary form must reproduce the above copyright notice, 29fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * this list of conditions and the following disclaimer in the documentation 30fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * and/or other materials 31fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * provided with the distribution. 32fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 33fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 34fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 35fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 36fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 37fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 38fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 39fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 40fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 41fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 42fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 43fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * POSSIBILITY OF SUCH DAMAGE. 44fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick */ 45fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 46fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick#include "ehca_iverbs.h" 47fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick#include "ehca_classes.h" 48fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick#include "ehca_irq.h" 49fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick#include "hcp_if.h" 50fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 51fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickstatic struct kmem_cache *cq_cache; 52fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 53fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickint ehca_cq_assign_qp(struct ehca_cq *cq, struct ehca_qp *qp) 54fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick{ 55fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick unsigned int qp_num = qp->real_qp_num; 56fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick unsigned int key = qp_num & (QP_HASHTAB_LEN-1); 579844b71baa60270110eabaa9589d3260443d1a71Joachim Fenkes unsigned long flags; 58fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 599844b71baa60270110eabaa9589d3260443d1a71Joachim Fenkes spin_lock_irqsave(&cq->spinlock, flags); 60fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick hlist_add_head(&qp->list_entries, &cq->qp_hashtab[key]); 619844b71baa60270110eabaa9589d3260443d1a71Joachim Fenkes spin_unlock_irqrestore(&cq->spinlock, flags); 62fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 63fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_dbg(cq->ib_cq.device, "cq_num=%x real_qp_num=%x", 64fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick cq->cq_number, qp_num); 65fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 66fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return 0; 67fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick} 68fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 69fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickint ehca_cq_unassign_qp(struct ehca_cq *cq, unsigned int real_qp_num) 70fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick{ 71fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick int ret = -EINVAL; 72fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick unsigned int key = real_qp_num & (QP_HASHTAB_LEN-1); 73fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct hlist_node *iter; 74fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ehca_qp *qp; 759844b71baa60270110eabaa9589d3260443d1a71Joachim Fenkes unsigned long flags; 76fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 779844b71baa60270110eabaa9589d3260443d1a71Joachim Fenkes spin_lock_irqsave(&cq->spinlock, flags); 78fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick hlist_for_each(iter, &cq->qp_hashtab[key]) { 79fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick qp = hlist_entry(iter, struct ehca_qp, list_entries); 80fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (qp->real_qp_num == real_qp_num) { 81fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick hlist_del(iter); 82fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_dbg(cq->ib_cq.device, 83fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick "removed qp from cq .cq_num=%x real_qp_num=%x", 84fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick cq->cq_number, real_qp_num); 85fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ret = 0; 86fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick break; 87fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 88fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 899844b71baa60270110eabaa9589d3260443d1a71Joachim Fenkes spin_unlock_irqrestore(&cq->spinlock, flags); 90fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (ret) 91fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_err(cq->ib_cq.device, 92fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick "qp not found cq_num=%x real_qp_num=%x", 93fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick cq->cq_number, real_qp_num); 94fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 95fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return ret; 96fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick} 97fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 982b94397adc68c2f0f851539884cc426e03444a26Hoang-Nam Nguyenstruct ehca_qp *ehca_cq_get_qp(struct ehca_cq *cq, int real_qp_num) 99fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick{ 100fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ehca_qp *ret = NULL; 101fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick unsigned int key = real_qp_num & (QP_HASHTAB_LEN-1); 102fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct hlist_node *iter; 103fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ehca_qp *qp; 104fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick hlist_for_each(iter, &cq->qp_hashtab[key]) { 105fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick qp = hlist_entry(iter, struct ehca_qp, list_entries); 106fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (qp->real_qp_num == real_qp_num) { 107fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ret = qp; 108fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick break; 109fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 110fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 111fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return ret; 112fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick} 113fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 114f4fd0b224d60044d2da5ca02f8f2b5150c1d8731Michael S. Tsirkinstruct ib_cq *ehca_create_cq(struct ib_device *device, int cqe, int comp_vector, 115fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ib_ucontext *context, 116fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ib_udata *udata) 117fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick{ 118fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick static const u32 additional_cqe = 20; 119fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ib_cq *cq; 120fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ehca_cq *my_cq; 121fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ehca_shca *shca = 122fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick container_of(device, struct ehca_shca, ib_device); 123fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ipz_adapter_handle adapter_handle; 124fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ehca_alloc_cq_parms param; /* h_call's out parameters */ 125fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct h_galpa gal; 126fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick void *vpage; 127fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick u32 counter; 128fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick u64 rpage, cqx_fec, h_ret; 129fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick int ipz_rc, ret, i; 130fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick unsigned long flags; 131fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 132fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (cqe >= 0xFFFFFFFF - 64 - additional_cqe) 133fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return ERR_PTR(-EINVAL); 134fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 135d227fa7288adebe5ba37fa8e4a589c977d4e4a34Stefan Roscher if (!atomic_add_unless(&shca->num_cqs, 1, ehca_max_cq)) { 136d227fa7288adebe5ba37fa8e4a589c977d4e4a34Stefan Roscher ehca_err(device, "Unable to create CQ, max number of %i " 137d227fa7288adebe5ba37fa8e4a589c977d4e4a34Stefan Roscher "CQs reached.", ehca_max_cq); 138d227fa7288adebe5ba37fa8e4a589c977d4e4a34Stefan Roscher ehca_err(device, "To increase the maximum number of CQs " 139d227fa7288adebe5ba37fa8e4a589c977d4e4a34Stefan Roscher "use the number_of_cqs module parameter.\n"); 140d227fa7288adebe5ba37fa8e4a589c977d4e4a34Stefan Roscher return ERR_PTR(-ENOSPC); 141d227fa7288adebe5ba37fa8e4a589c977d4e4a34Stefan Roscher } 142d227fa7288adebe5ba37fa8e4a589c977d4e4a34Stefan Roscher 143c376222960ae91d5ffb9197ee36771aaed1d9f90Robert P. J. Day my_cq = kmem_cache_zalloc(cq_cache, GFP_KERNEL); 144fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (!my_cq) { 145fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_err(device, "Out of memory for ehca_cq struct device=%p", 146fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick device); 147d227fa7288adebe5ba37fa8e4a589c977d4e4a34Stefan Roscher atomic_dec(&shca->num_cqs); 148fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return ERR_PTR(-ENOMEM); 149fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 150fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 151fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick memset(¶m, 0, sizeof(struct ehca_alloc_cq_parms)); 152fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 153fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick spin_lock_init(&my_cq->spinlock); 154fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick spin_lock_init(&my_cq->cb_lock); 155fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick spin_lock_init(&my_cq->task_lock); 15628db6beb420c756c61dd44d9f2786a0677159e74Joachim Fenkes atomic_set(&my_cq->nr_events, 0); 15731726798bd8fbef6244b28cf962f4a4c45793deaHoang-Nam Nguyen init_waitqueue_head(&my_cq->wait_completion); 158fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 159fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick cq = &my_cq->ib_cq; 160fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 161fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick adapter_handle = shca->ipz_hca_handle; 162fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick param.eq_handle = shca->eq.ipz_eq_handle; 163fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 164fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick do { 165fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (!idr_pre_get(&ehca_cq_idr, GFP_KERNEL)) { 166fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick cq = ERR_PTR(-ENOMEM); 167fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_err(device, "Can't reserve idr nr. device=%p", 168fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick device); 169fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick goto create_cq_exit1; 170fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 171fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 17226ed687fdd541c2542b79dcd75fb2c82eb36f189Joachim Fenkes write_lock_irqsave(&ehca_cq_idr_lock, flags); 173fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ret = idr_get_new(&ehca_cq_idr, my_cq, &my_cq->token); 17426ed687fdd541c2542b79dcd75fb2c82eb36f189Joachim Fenkes write_unlock_irqrestore(&ehca_cq_idr_lock, flags); 175fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } while (ret == -EAGAIN); 176fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 177fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (ret) { 178fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick cq = ERR_PTR(-ENOMEM); 179fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_err(device, "Can't allocate new idr entry. device=%p", 180fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick device); 181fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick goto create_cq_exit1; 182fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 183fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 1845281a4b8a0c6bac0c070913ec25868faa06a3115Stefan Roscher if (my_cq->token > 0x1FFFFFF) { 1855281a4b8a0c6bac0c070913ec25868faa06a3115Stefan Roscher cq = ERR_PTR(-ENOMEM); 1865281a4b8a0c6bac0c070913ec25868faa06a3115Stefan Roscher ehca_err(device, "Invalid number of cq. device=%p", device); 1875281a4b8a0c6bac0c070913ec25868faa06a3115Stefan Roscher goto create_cq_exit2; 1885281a4b8a0c6bac0c070913ec25868faa06a3115Stefan Roscher } 1895281a4b8a0c6bac0c070913ec25868faa06a3115Stefan Roscher 190fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick /* 191fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * CQs maximum depth is 4GB-64, but we need additional 20 as buffer 192fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * for receiving errors CQEs. 193fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick */ 194fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick param.nr_cqe = cqe + additional_cqe; 195fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick h_ret = hipz_h_alloc_resource_cq(adapter_handle, my_cq, ¶m); 196fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 197fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (h_ret != H_SUCCESS) { 198fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_err(device, "hipz_h_alloc_resource_cq() failed " 199e37221928bf685d63ba5319746eafe463d61e330Joachim Fenkes "h_ret=%li device=%p", h_ret, device); 200fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick cq = ERR_PTR(ehca2ib_return_code(h_ret)); 201fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick goto create_cq_exit2; 202fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 203fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 204e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at ipz_rc = ipz_queue_ctor(NULL, &my_cq->ipz_queue, param.act_pages, 205e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at EHCA_PAGESIZE, sizeof(struct ehca_cqe), 0, 0); 206fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (!ipz_rc) { 207e37221928bf685d63ba5319746eafe463d61e330Joachim Fenkes ehca_err(device, "ipz_queue_ctor() failed ipz_rc=%i device=%p", 208fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ipz_rc, device); 209fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick cq = ERR_PTR(-EINVAL); 210fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick goto create_cq_exit3; 211fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 212fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 213fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick for (counter = 0; counter < param.act_pages; counter++) { 214fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick vpage = ipz_qpageit_get_inc(&my_cq->ipz_queue); 215fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (!vpage) { 216fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_err(device, "ipz_qpageit_get_inc() " 217fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick "returns NULL device=%p", device); 218fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick cq = ERR_PTR(-EAGAIN); 219fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick goto create_cq_exit4; 220fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 221fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick rpage = virt_to_abs(vpage); 222fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 223fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick h_ret = hipz_h_register_rpage_cq(adapter_handle, 224fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick my_cq->ipz_cq_handle, 225fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick &my_cq->pf, 226fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 0, 227fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 0, 228fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick rpage, 229fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 1, 230fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick my_cq->galpas. 231fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick kernel); 232fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 233fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (h_ret < H_SUCCESS) { 234fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_err(device, "hipz_h_register_rpage_cq() failed " 235e37221928bf685d63ba5319746eafe463d61e330Joachim Fenkes "ehca_cq=%p cq_num=%x h_ret=%li counter=%i " 236fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick "act_pages=%i", my_cq, my_cq->cq_number, 237fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick h_ret, counter, param.act_pages); 238fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick cq = ERR_PTR(-EINVAL); 239fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick goto create_cq_exit4; 240fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 241fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 242fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (counter == (param.act_pages - 1)) { 243fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick vpage = ipz_qpageit_get_inc(&my_cq->ipz_queue); 244fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if ((h_ret != H_SUCCESS) || vpage) { 245fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_err(device, "Registration of pages not " 246fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick "complete ehca_cq=%p cq_num=%x " 247e37221928bf685d63ba5319746eafe463d61e330Joachim Fenkes "h_ret=%li", my_cq, my_cq->cq_number, 248fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick h_ret); 249fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick cq = ERR_PTR(-EAGAIN); 250fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick goto create_cq_exit4; 251fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 252fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } else { 253fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (h_ret != H_PAGE_REGISTERED) { 254fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_err(device, "Registration of page failed " 255908cf9a565348b5a6d765d120cb189a568ea4883Joe Perches "ehca_cq=%p cq_num=%x h_ret=%li " 256fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick "counter=%i act_pages=%i", 257fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick my_cq, my_cq->cq_number, 258fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick h_ret, counter, param.act_pages); 259fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick cq = ERR_PTR(-ENOMEM); 260fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick goto create_cq_exit4; 261fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 262fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 263fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 264fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 265fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ipz_qeit_reset(&my_cq->ipz_queue); 266fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 267fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick gal = my_cq->galpas.kernel; 268fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick cqx_fec = hipz_galpa_load(gal, CQTEMM_OFFSET(cqx_fec)); 269fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_dbg(device, "ehca_cq=%p cq_num=%x CQX_FEC=%lx", 270fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick my_cq, my_cq->cq_number, cqx_fec); 271fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 272fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick my_cq->ib_cq.cqe = my_cq->nr_of_entries = 273fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick param.act_nr_of_entries - additional_cqe; 274fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick my_cq->cq_number = (my_cq->ipz_cq_handle.handle) & 0xffff; 275fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 276fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick for (i = 0; i < QP_HASHTAB_LEN; i++) 277fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick INIT_HLIST_HEAD(&my_cq->qp_hashtab[i]); 278fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 279b9012e0a4255c93e1d81f1ccee591de6414b5955Alexander Schmidt INIT_LIST_HEAD(&my_cq->sqp_err_list); 280b9012e0a4255c93e1d81f1ccee591de6414b5955Alexander Schmidt INIT_LIST_HEAD(&my_cq->rqp_err_list); 281b9012e0a4255c93e1d81f1ccee591de6414b5955Alexander Schmidt 282fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (context) { 283fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ipz_queue *ipz_queue = &my_cq->ipz_queue; 284fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ehca_create_cq_resp resp; 285fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick memset(&resp, 0, sizeof(resp)); 286fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick resp.cq_number = my_cq->cq_number; 287fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick resp.token = my_cq->token; 288fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick resp.ipz_queue.qe_size = ipz_queue->qe_size; 289fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick resp.ipz_queue.act_nr_of_sg = ipz_queue->act_nr_of_sg; 290fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick resp.ipz_queue.queue_length = ipz_queue->queue_length; 291fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick resp.ipz_queue.pagesize = ipz_queue->pagesize; 292fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick resp.ipz_queue.toggle_state = ipz_queue->toggle_state; 293e390d3b52f791fcea26312ba4982cda82052727bHoang-Nam Nguyen resp.fw_handle_ofs = (u32) 294e390d3b52f791fcea26312ba4982cda82052727bHoang-Nam Nguyen (my_cq->galpas.user.fw_handle & (PAGE_SIZE - 1)); 295fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (ib_copy_to_udata(udata, &resp, sizeof(resp))) { 296fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_err(device, "Copy to udata failed."); 2974c34bdf58c0a3b305ebd9b5e74011ca1fd6d964dHoang-Nam Nguyen goto create_cq_exit4; 298fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 299fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 300fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 301fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return cq; 302fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 303fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickcreate_cq_exit4: 304e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at ipz_queue_dtor(NULL, &my_cq->ipz_queue); 305fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 306fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickcreate_cq_exit3: 307fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick h_ret = hipz_h_destroy_cq(adapter_handle, my_cq, 1); 308fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (h_ret != H_SUCCESS) 309fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_err(device, "hipz_h_destroy_cq() failed ehca_cq=%p " 310e37221928bf685d63ba5319746eafe463d61e330Joachim Fenkes "cq_num=%x h_ret=%li", my_cq, my_cq->cq_number, h_ret); 311fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 312fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickcreate_cq_exit2: 31326ed687fdd541c2542b79dcd75fb2c82eb36f189Joachim Fenkes write_lock_irqsave(&ehca_cq_idr_lock, flags); 314fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick idr_remove(&ehca_cq_idr, my_cq->token); 31526ed687fdd541c2542b79dcd75fb2c82eb36f189Joachim Fenkes write_unlock_irqrestore(&ehca_cq_idr_lock, flags); 316fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 317fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickcreate_cq_exit1: 318fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick kmem_cache_free(cq_cache, my_cq); 319fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 320d227fa7288adebe5ba37fa8e4a589c977d4e4a34Stefan Roscher atomic_dec(&shca->num_cqs); 321fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return cq; 322fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick} 323fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 324fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickint ehca_destroy_cq(struct ib_cq *cq) 325fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick{ 326fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick u64 h_ret; 327fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ehca_cq *my_cq = container_of(cq, struct ehca_cq, ib_cq); 328fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick int cq_num = my_cq->cq_number; 329fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ib_device *device = cq->device; 330fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ehca_shca *shca = container_of(device, struct ehca_shca, 331fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ib_device); 332fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ipz_adapter_handle adapter_handle = shca->ipz_hca_handle; 333fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick unsigned long flags; 334fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 3354c34bdf58c0a3b305ebd9b5e74011ca1fd6d964dHoang-Nam Nguyen if (cq->uobject) { 3364c34bdf58c0a3b305ebd9b5e74011ca1fd6d964dHoang-Nam Nguyen if (my_cq->mm_count_galpa || my_cq->mm_count_queue) { 3374c34bdf58c0a3b305ebd9b5e74011ca1fd6d964dHoang-Nam Nguyen ehca_err(device, "Resources still referenced in " 3384c34bdf58c0a3b305ebd9b5e74011ca1fd6d964dHoang-Nam Nguyen "user space cq_num=%x", my_cq->cq_number); 3394c34bdf58c0a3b305ebd9b5e74011ca1fd6d964dHoang-Nam Nguyen return -EINVAL; 3404c34bdf58c0a3b305ebd9b5e74011ca1fd6d964dHoang-Nam Nguyen } 3414c34bdf58c0a3b305ebd9b5e74011ca1fd6d964dHoang-Nam Nguyen } 3424c34bdf58c0a3b305ebd9b5e74011ca1fd6d964dHoang-Nam Nguyen 34328db6beb420c756c61dd44d9f2786a0677159e74Joachim Fenkes /* 34428db6beb420c756c61dd44d9f2786a0677159e74Joachim Fenkes * remove the CQ from the idr first to make sure 34528db6beb420c756c61dd44d9f2786a0677159e74Joachim Fenkes * no more interrupt tasklets will touch this CQ 34628db6beb420c756c61dd44d9f2786a0677159e74Joachim Fenkes */ 34726ed687fdd541c2542b79dcd75fb2c82eb36f189Joachim Fenkes write_lock_irqsave(&ehca_cq_idr_lock, flags); 348fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick idr_remove(&ehca_cq_idr, my_cq->token); 34926ed687fdd541c2542b79dcd75fb2c82eb36f189Joachim Fenkes write_unlock_irqrestore(&ehca_cq_idr_lock, flags); 350fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 35128db6beb420c756c61dd44d9f2786a0677159e74Joachim Fenkes /* now wait until all pending events have completed */ 35228db6beb420c756c61dd44d9f2786a0677159e74Joachim Fenkes wait_event(my_cq->wait_completion, !atomic_read(&my_cq->nr_events)); 35328db6beb420c756c61dd44d9f2786a0677159e74Joachim Fenkes 35428db6beb420c756c61dd44d9f2786a0677159e74Joachim Fenkes /* nobody's using our CQ any longer -- we can destroy it */ 355fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick h_ret = hipz_h_destroy_cq(adapter_handle, my_cq, 0); 356fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (h_ret == H_R_STATE) { 357fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick /* cq in err: read err data and destroy it forcibly */ 358fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_dbg(device, "ehca_cq=%p cq_num=%x ressource=%lx in err " 359fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick "state. Try to delete it forcibly.", 360fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick my_cq, cq_num, my_cq->ipz_cq_handle.handle); 361fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_error_data(shca, my_cq, my_cq->ipz_cq_handle.handle); 362fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick h_ret = hipz_h_destroy_cq(adapter_handle, my_cq, 1); 363fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (h_ret == H_SUCCESS) 364fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_dbg(device, "cq_num=%x deleted successfully.", 365fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick cq_num); 366fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 367fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (h_ret != H_SUCCESS) { 368e37221928bf685d63ba5319746eafe463d61e330Joachim Fenkes ehca_err(device, "hipz_h_destroy_cq() failed h_ret=%li " 369fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick "ehca_cq=%p cq_num=%x", h_ret, my_cq, cq_num); 370fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return ehca2ib_return_code(h_ret); 371fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 372e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at ipz_queue_dtor(NULL, &my_cq->ipz_queue); 373fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick kmem_cache_free(cq_cache, my_cq); 374fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 375d227fa7288adebe5ba37fa8e4a589c977d4e4a34Stefan Roscher atomic_dec(&shca->num_cqs); 376fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return 0; 377fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick} 378fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 379fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickint ehca_resize_cq(struct ib_cq *cq, int cqe, struct ib_udata *udata) 380fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick{ 381fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick /* TODO: proper resize needs to be done */ 382fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_err(cq->device, "not implemented yet"); 383fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 384fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return -EFAULT; 385fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick} 386fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 387fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickint ehca_init_cq_cache(void) 388fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick{ 389fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick cq_cache = kmem_cache_create("ehca_cache_cq", 390fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick sizeof(struct ehca_cq), 0, 391fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick SLAB_HWCACHE_ALIGN, 39220c2df83d25c6a95affe6157a4c9cac4cf5ffaacPaul Mundt NULL); 393fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (!cq_cache) 394fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return -ENOMEM; 395fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return 0; 396fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick} 397fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 398fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickvoid ehca_cleanup_cq_cache(void) 399fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick{ 400fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (cq_cache) 401fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick kmem_cache_destroy(cq_cache); 402fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick} 403