ehca_pd.c revision c376222960ae91d5ffb9197ee36771aaed1d9f90
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 41fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick#include <asm/current.h> 42fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 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; 52fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 53c376222960ae91d5ffb9197ee36771aaed1d9f90Robert P. J. Day pd = kmem_cache_zalloc(pd_cache, GFP_KERNEL); 54fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (!pd) { 55fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_err(device, "device=%p context=%p out of memory", 56fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick device, context); 57fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return ERR_PTR(-ENOMEM); 58fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 59fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 60fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick pd->ownpid = current->tgid; 61fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 62fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick /* 63fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * Kernel PD: when device = -1, 0 64fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * User PD: when context != -1 65fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick */ 66fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (!context) { 67fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick /* 68fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * Kernel PDs after init reuses always 69fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * the one created in ehca_shca_reopen() 70fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick */ 71fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ehca_shca *shca = container_of(device, struct ehca_shca, 72fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ib_device); 73fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick pd->fw_pd.value = shca->pd->fw_pd.value; 74fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } else 75fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick pd->fw_pd.value = (u64)pd; 76fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 77fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return &pd->ib_pd; 78fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick} 79fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 80fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickint ehca_dealloc_pd(struct ib_pd *pd) 81fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick{ 82fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick u32 cur_pid = current->tgid; 83fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ehca_pd *my_pd = container_of(pd, struct ehca_pd, ib_pd); 84fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 85fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (my_pd->ib_pd.uobject && my_pd->ib_pd.uobject->context && 86fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick my_pd->ownpid != cur_pid) { 87fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_err(pd->device, "Invalid caller pid=%x ownpid=%x", 88fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick cur_pid, my_pd->ownpid); 89fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return -EINVAL; 90fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 91fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 92fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick kmem_cache_free(pd_cache, 93fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick container_of(pd, struct ehca_pd, ib_pd)); 94fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 95fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return 0; 96fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick} 97fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 98fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickint ehca_init_pd_cache(void) 99fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick{ 100fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick pd_cache = kmem_cache_create("ehca_cache_pd", 101fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick sizeof(struct ehca_pd), 0, 102fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick SLAB_HWCACHE_ALIGN, 103fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick NULL, NULL); 104fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (!pd_cache) 105fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return -ENOMEM; 106fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return 0; 107fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick} 108fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 109fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickvoid ehca_cleanup_pd_cache(void) 110fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick{ 111fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (pd_cache) 112fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick kmem_cache_destroy(pd_cache); 113fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick} 114