1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. 23 */ 24 25 /* 26 * Copyright (c) 2006 Oracle. All rights reserved. 27 * 28 * This software is available to you under a choice of one of two 29 * licenses. You may choose to be licensed under the terms of the GNU 30 * General Public License (GPL) Version 2, available from the file 31 * COPYING in the main directory of this source tree, or the 32 * OpenIB.org BSD license below: 33 * 34 * Redistribution and use in source and binary forms, with or 35 * without modification, are permitted provided that the following 36 * conditions are met: 37 * 38 * - Redistributions of source code must retain the above 39 * copyright notice, this list of conditions and the following 40 * disclaimer. 41 * 42 * - Redistributions in binary form must reproduce the above 43 * copyright notice, this list of conditions and the following 44 * disclaimer in the documentation and/or other materials 45 * provided with the distribution. 46 * 47 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 48 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 49 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 50 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 51 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 52 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 53 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 54 * SOFTWARE. 55 * 56 */ 57 #include <sys/rds.h> 58 59 #include <sys/ib/clients/rdsv3/rdsv3.h> 60 #include <sys/ib/clients/rdsv3/rdsv3_debug.h> 61 62 /* 63 * @bytes - the number of bytes needed. 64 * 65 * XXX - This is different from Linux. 66 */ 67 int 68 rdsv3_page_remainder_alloc(struct rdsv3_scatterlist *scat, unsigned long bytes, 69 int gfp) 70 { 71 caddr_t page; 72 int ret; 73 74 ASSERT(rdsv3_sg_page(scat) == NULL); 75 76 if (bytes >= PAGE_SIZE) { 77 page = kmem_alloc(PAGE_SIZE, gfp); 78 if (page == NULL) { 79 ret = -ENOMEM; 80 } else { 81 rdsv3_sg_set_page(scat, page, PAGE_SIZE, 0); 82 ret = 0; 83 } 84 goto out; 85 } 86 87 /* 88 * XXX - This is not same as linux. 89 */ 90 page = kmem_alloc(bytes, KM_NOSLEEP); 91 if (page == NULL) { 92 ret = -ENOMEM; 93 goto out; 94 } 95 96 rdsv3_sg_set_page(scat, page, bytes, 0); 97 ret = 0; 98 out: 99 RDSV3_DPRINTF5("rdsv3_page_remainder_alloc", "bytes %lu %p %u", 100 bytes, rdsv3_sg_page(scat), scat->length); 101 return (ret); 102 } 103