1fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick/* 2fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * IBM eServer eHCA Infiniband device driver for Linux on POWER 3fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 4fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * PD functions 5fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 6fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * Authors: Christoph Raisch <raisch@de.ibm.com> 7fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 8fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * Copyright (c) 2005 IBM Corporation 9fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 10fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * All rights reserved. 11fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 12fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * This source code is distributed under a dual license of GPL v2.0 and OpenIB 13fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * BSD. 14fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 15fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * OpenIB BSD License 16fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 17fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * Redistribution and use in source and binary forms, with or without 18fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * modification, are permitted provided that the following conditions are met: 19fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 20fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * Redistributions of source code must retain the above copyright notice, this 21fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * list of conditions and the following disclaimer. 22fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 23fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * Redistributions in binary form must reproduce the above copyright notice, 24fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * this list of conditions and the following disclaimer in the documentation 25fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * and/or other materials 26fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * provided with the distribution. 27fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 28fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 29fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 30fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 31fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 32fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 33fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 34fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 35fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 36fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 37fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 38fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * POSSIBILITY OF SUCH DAMAGE. 39fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick */ 40fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 415a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h> 425a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo 43fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick#include "ehca_tools.h" 44fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick#include "ehca_iverbs.h" 45fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 46fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickstatic struct kmem_cache *pd_cache; 47fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 48fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickstruct ib_pd *ehca_alloc_pd(struct ib_device *device, 49fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ib_ucontext *context, struct ib_udata *udata) 50fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick{ 51fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ehca_pd *pd; 52e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at int i; 53fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 54c376222960ae91d5ffb9197ee36771aaed1d9f90Robert P. J. Day pd = kmem_cache_zalloc(pd_cache, GFP_KERNEL); 55fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (!pd) { 56fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_err(device, "device=%p context=%p out of memory", 57fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick device, context); 58fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return ERR_PTR(-ENOMEM); 59fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 60fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 61e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at for (i = 0; i < 2; i++) { 62e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at INIT_LIST_HEAD(&pd->free[i]); 63e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at INIT_LIST_HEAD(&pd->full[i]); 64e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at } 65e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at mutex_init(&pd->lock); 66fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 67fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick /* 68fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * Kernel PD: when device = -1, 0 69fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * User PD: when context != -1 70fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick */ 71fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (!context) { 72fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick /* 73fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * Kernel PDs after init reuses always 74fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * the one created in ehca_shca_reopen() 75fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick */ 76fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ehca_shca *shca = container_of(device, struct ehca_shca, 77fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ib_device); 78fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick pd->fw_pd.value = shca->pd->fw_pd.value; 79fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } else 80fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick pd->fw_pd.value = (u64)pd; 81fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 82fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return &pd->ib_pd; 83fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick} 84fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 85fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickint ehca_dealloc_pd(struct ib_pd *pd) 86fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick{ 87fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ehca_pd *my_pd = container_of(pd, struct ehca_pd, ib_pd); 88e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at int i, leftovers = 0; 89e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at struct ipz_small_queue_page *page, *tmp; 90fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 91e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at for (i = 0; i < 2; i++) { 92e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at list_splice(&my_pd->full[i], &my_pd->free[i]); 93e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at list_for_each_entry_safe(page, tmp, &my_pd->free[i], list) { 94e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at leftovers = 1; 95e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at free_page(page->page); 96e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at kmem_cache_free(small_qp_cache, page); 97e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at } 98e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at } 99e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at 100e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at if (leftovers) 101e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at ehca_warn(pd->device, 102e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at "Some small queue pages were not freed"); 103e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at 104e2f81daf23efde23d8cac1fc253d41838f0347cfStefan Roscher <stefan.roscher at kmem_cache_free(pd_cache, my_pd); 105fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 106fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return 0; 107fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick} 108fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 109fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickint ehca_init_pd_cache(void) 110fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick{ 111fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick pd_cache = kmem_cache_create("ehca_cache_pd", 112fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick sizeof(struct ehca_pd), 0, 113fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick SLAB_HWCACHE_ALIGN, 11420c2df83d25c6a95affe6157a4c9cac4cf5ffaacPaul Mundt NULL); 115fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (!pd_cache) 116fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return -ENOMEM; 117fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return 0; 118fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick} 119fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 120fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickvoid ehca_cleanup_pd_cache(void) 121fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick{ 122fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (pd_cache) 123fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick kmem_cache_destroy(pd_cache); 124fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick} 125