librsmwrsm.c revision 00f52bfc16236f42c91b1dd6912115e2609bfe1a
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * CDDL HEADER START
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * The contents of this file are subject to the terms of the
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * Common Development and Distribution License, Version 1.0 only
5f184698e58f31e670c54c12d858a7c7322277b4Christian Maeder * (the "License"). You may not use this file except in compliance
ceee56b395227c495432d0f3baa407730d7a09d2Christian Maeder * with the License.
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * See the License for the specific language governing permissions
87e1c83f10355e0fe80761367b75f83bc682770aTill Mossakowski * and limitations under the License.
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * When distributing Covered Code, include this CDDL HEADER in each
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * If applicable, add the following below this CDDL HEADER, with the
68ae7b41aca2f24dbbc376becc45a7b713cdc48dJens Elkner * fields enclosed by brackets "[]" replaced with your own identifying
ceee56b395227c495432d0f3baa407730d7a09d2Christian Maeder * information: Portions Copyright [yyyy] [name of copyright owner]
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * CDDL HEADER END
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * Use is subject to license terms.
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner#pragma ident "%Z%%M% %I% %E% SMI"
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * this library is the plugin module used by RSMAPI to communicate
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * with the Wildcat RSM driver. The library offers functions to
68ae7b41aca2f24dbbc376becc45a7b713cdc48dJens Elkner * setup a connection with the driver, to enable users of RSMAPI to perform
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * put, get and barrier operations.
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * for debuging:
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * - compile with DEBUG and set environment variable PLUGIN_VERBOSITY.
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * PLUGIN_VERBOSITY = 0x1F to turn all ALL debug options
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * or an OR'ed combination of:
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * PLUGIN_DEBUG 0x0001 -This option is used for messages in all
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * initialization functions and local functions
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * (errors/failures use PLUGIN_WARN)
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * PLUGIN_WARN 0x0002 - This option spans all areas, when ever error,
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * or failure of any sort occurs. Minimally Set THIS ONE!
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * PLUGIN_PUT 0x0004 - This option for all put related request.
68ae7b41aca2f24dbbc376becc45a7b713cdc48dJens Elkner * (errors/failures use PLUGIN_WARN)
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * PLUGIN_GET 0x0008 - This option for all get related request
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * (errors/failures use PLUGIN_WARN)
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * PLUGIN_BARRIER 0x0010- This option for ALL barrier operations (close, open
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * init, destroy, etc)
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * Note, not all possible errors have a corresponding message printed.
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elknerstatic int plugin_debug = 0; /* initialize to 0 */
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner#define DEBUGP(a, b) if (plugin_debug & (a)) plugin_debug_print b
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner#define DEBUGP(a, b) { }
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * the following is based on wci_cluster_error_status_array_u defined
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * in wci_regs.h. The plugin is unable to include wci_regs.h. Not
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * only is wci_regs.h for use by Kernel modules, wci_regs.h can not
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * be used with 32 bit applications.
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elknertypedef union {
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner#define STRIPE_BIT(stripe, i) (((stripe) >> (i)) & (STRIPE_MASK))
947d21ed43ec33fac7c3772470d984479ee5f64aChristian Maeder/* Internal functions */
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elknerstatic int wrsm_memseg_import_connect(rsmapi_controller_handle_t controller,
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner rsm_node_id_t node_id, rsm_memseg_id_t segment_id,
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner rsm_permission_t perm, rsm_memseg_import_handle_t *im_memseg);
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elknerstatic int wrsm_memseg_import_disconnect(rsm_memseg_import_handle_t im_memseg);
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elknerstatic int wrsm_memseg_import_get8(rsm_memseg_import_handle_t im_memseg,
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner off_t offset, uint8_t *datap, ulong_t rep_cnt, boolean_t swap);
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elknerstatic int wrsm_memseg_import_get16(rsm_memseg_import_handle_t im_memseg,
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner off_t offset, uint16_t *datap, ulong_t rep_cnt, boolean_t swap);
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elknerstatic int wrsm_memseg_import_get32(rsm_memseg_import_handle_t im_memseg,
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner off_t offset, uint32_t *datap, ulong_t rep_cnt, boolean_t swap);
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elknerstatic int wrsm_memseg_import_get64(rsm_memseg_import_handle_t im_memseg,
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner off_t offset, uint64_t *datap, ulong_t rep_cnt, boolean_t swap);
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elknerstatic int wrsm_memseg_import_get(rsm_memseg_import_handle_t im_memseg,
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elknerstatic int wrsm_memseg_import_put8(rsm_memseg_import_handle_t im_memseg,
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner off_t offset, uint8_t *data, ulong_t rep_cnt, boolean_t swap);
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elknerstatic int wrsm_memseg_import_put16(rsm_memseg_import_handle_t im_memseg,
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner off_t offset, uint16_t *data, ulong_t rep_cnt, boolean_t swap);
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elknerstatic int wrsm_memseg_import_put32(rsm_memseg_import_handle_t im_memseg,
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner off_t offset, uint32_t *data, ulong_t rep_cnt, boolean_t swap);
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elknerstatic int wrsm_memseg_import_put64(rsm_memseg_import_handle_t im_memseg,
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner off_t offset, uint64_t *data, ulong_t rep_cnt, boolean_t swap);
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elknerstatic int wrsm_memseg_import_put(rsm_memseg_import_handle_t im_memseg,
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elknerstatic int wrsm_memseg_import_init_barrier(rsm_memseg_import_handle_t
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner im_memseg, rsm_barrier_type_t type, rsm_barrier_handle_t barrier);
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elknerstatic int wrsm_memseg_import_open_barrier(rsm_barrier_handle_t barrier);
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elknerstatic int wrsm_memseg_import_order_barrier(rsm_barrier_handle_t barrier);
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elknerstatic int wrsm_memseg_import_close_barrier(rsm_barrier_handle_t barrier);
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elknerstatic int wrsm_memseg_import_destroy_barrier(rsm_barrier_handle_t barrier);
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elknerstatic int wrsm_memseg_import_get_mode(rsm_memseg_import_handle_t im_memseg,
afd59fd120e5e150bf726ddd25a7e2a4bb6e8908Jens Elknerstatic int wrsm_memseg_import_set_mode(rsm_memseg_import_handle_t im_memseg,
afd59fd120e5e150bf726ddd25a7e2a4bb6e8908Jens Elknerstatic int wrsm_memseg_import_putv(rsm_scat_gath_t *sg_io);
afd59fd120e5e150bf726ddd25a7e2a4bb6e8908Jens Elknerstatic int wrsm_memseg_import_getv(rsm_scat_gath_t *sg_io);
afd59fd120e5e150bf726ddd25a7e2a4bb6e8908Jens Elknerstatic int wrsm_create_localmemory_handle(rsmapi_controller_handle_t controller,
afd59fd120e5e150bf726ddd25a7e2a4bb6e8908Jens Elkner rsm_localmemory_handle_t *local_handle_p, caddr_t local_vaddr, size_t len);
afd59fd120e5e150bf726ddd25a7e2a4bb6e8908Jens Elknerstatic int wrsm_free_localmemory_handle(rsm_localmemory_handle_t local_handle);
afd59fd120e5e150bf726ddd25a7e2a4bb6e8908Jens Elknerstatic int wrsm_register_lib_funcs(rsm_lib_funcs_t *libfuncs);
afd59fd120e5e150bf726ddd25a7e2a4bb6e8908Jens Elknerstatic int wrsm_get_lib_attr(rsm_ndlib_attr_t **libattr);
afd59fd120e5e150bf726ddd25a7e2a4bb6e8908Jens Elknerstatic int wrsm_closedevice(rsmapi_controller_handle_t controller);
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner/* list of file descriptors */
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elknerstatic opened_controllers_t opened_ctrls_fd[MAXCONTROLLERS] =
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner{{0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1},
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner{0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1},
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner{0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1},
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner{0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1},
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner{0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1},
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner{0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1},
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner{0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1},
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner{0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1},
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner{0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1},
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner{0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1},
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner{0, -1, -1}, {0, -1, -1}, {0, -1, -1}, {0, -1, -1}};
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elknerstatic wrsmlib_raw_message_t cachelinebufscratch; /* write/read barrier use */
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * local function used to return a page aligned aligned structure
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elknerstatic void *
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner DEBUGP(PLUGIN_DEBUG, ("librsmwrsm: wrsmlib_align\n"));
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner addr = (void *)(((uintptr_t)raw_msg + (uintptr_t)WRSMLIB_ALIGN) &
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * writes and then reads to barrier scractchpage up to two way link striping
2f0e7c8caf8083c9634f64c4bf22765c46e9a51eJens Elkner * and 4 way wci striping during the close_barrier that is called for
2f0e7c8caf8083c9634f64c4bf22765c46e9a51eJens Elkner * a put routine. It is needed to flush out the buffer
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner * to assure that the transaction has made it to the remote node.
2f0e7c8caf8083c9634f64c4bf22765c46e9a51eJens Elkner * wrsmlib_blkcopy does a membar sync before, during and after
2f0e7c8caf8083c9634f64c4bf22765c46e9a51eJens Elkner DEBUGP(PLUGIN_BARRIER, ("librsmwrsm: write_read_scratchpage\n "));
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner /* No need to check data, since we check wci_error_cluster_count */
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner aligned_cacheline = (caddr_t)wrsmlib_align(&cachelinebufscratch);
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner /* write all request */
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner if (STRIPE_BIT(*bar->importsegp->stripingp, i)) {
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner scratch_addr = bar->importsegp->barrier_scratch_addr +
68ae7b41aca2f24dbbc376becc45a7b713cdc48dJens Elkner "write_read_scratchpage write for %dth stripe "
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner wrsmlib_blkcopy(aligned_cacheline, scratch_addr, 1);
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner /* read all request */
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner if (STRIPE_BIT(*bar->importsegp->stripingp, i)) {
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner scratch_addr = bar->importsegp->barrier_scratch_addr +
0490829cf473c66c1f2e06d09dd5bc1937121198Jens Elkner "write_read_scratchpag read for %dth stripe "
ceee56b395227c495432d0f3baa407730d7a09d2Christian Maeder wrsmlib_blkcopy(scratch_addr, aligned_cacheline, 1);
*total = 0;
for (i = 0; i < MAXWCISTRIPING; i++) {
return (RSM_SUCCESS);
return (RSM_SUCCESS);
return (RSMERR_BARRIER_FAILURE);
return (RSMERR_BARRIER_NOT_OPENED);
if (flag) {
return (RSMERR_BARRIER_FAILURE);
return (RSMERR_BARRIER_FAILURE);
return (RSM_SUCCESS);
return (RSM_SUCCESS);
return (RSM_SUCCESS);
return (RSM_SUCCESS);
int tmpfd;
#ifdef DEBUG
char *env;
plugin_debug = (int)
plugin_debug = 0;
plugin_debug));
return (RSM_SUCCESS);
return (RSMERR_BAD_CTLR_HNDL);
return (RSMERR_CTLR_NOT_PRESENT);
return (RSMERR_CTLR_NOT_PRESENT);
return (RSM_SUCCESS);
seterr()
int retval;
switch (errno) {
case ENXIO:
case EINVAL:
case ENODEV:
case EACCES:
case ENOMEM:
case EPROTO:
case EHOSTUNREACH:
case ENOTSUP:
case EOVERFLOW:
case EAGAIN:
case EBADF:
errno));
return (retval);
int prot;
int ctrl_num;
int err = 0;
return (err);
return (RSMERR_INSUFFICIENT_MEM);
== MAP_FAILED) {
return (seterr());
== MAP_FAILED) {
return (seterr());
== MAP_FAILED) {
return (seterr());
importsegp));
return (RSMERR_INSUFFICIENT_MEM);
return (RSM_SUCCESS);
return (error);
return (RSMERR_BAD_MEM_ALIGNMENT);
return (RSMERR_BAD_MEM_ALIGNMENT);
return (RSMERR_BAD_MEM_ALIGNMENT);
int err = 0;
#ifdef DEBUG
if (len == 0) {
return (RSM_SUCCESS);
#ifdef DEBUG
return (err);
!= RSM_SUCCESS) {
return (err);
if (len == 0) {
return (RSM_SUCCESS);
if (num_cachelines) {
while (num_cachelines) {
if (len) {
!= RSM_SUCCESS) {
return (err);
return (err);
return (RSMERR_BAD_MEM_ALIGNMENT);
return (RSMERR_BAD_MEM_ALIGNMENT);
return (RSMERR_BAD_MEM_ALIGNMENT);
int err = 0;
int ctrl_num;
if (length == 0) {
return (RSM_SUCCESS);
RSM_SUCCESS) {
return (err);
B_TRUE);
return (RSMERR_BARRIER_FAILURE);
if (length == 0) {
return (RSM_SUCCESS);
if (num_cachelines) {
length));
if (length) {
B_TRUE);
return (RSMERR_BARRIER_FAILURE);
return (RSM_SUCCESS);
return (RSMERR_INSUFFICIENT_RESOURCES);
return (RSM_SUCCESS);
int err = 0;
return (err);
int err = 0;
return (err);
int err = 0;
return (err);
if (bar)
return (RSM_SUCCESS);
return (RSM_SUCCESS);
return (RSM_SUCCESS);
int64_t i;
int err = 0;
return (err);
iovec++;
return (err);
int64_t i;
int err = 0;
return (err);
iovec++;
return (err);
return (RSM_SUCCESS);
return (RSM_SUCCESS);
return (RSM_SUCCESS);
return (RSM_SUCCESS);
int ctrl_num;
return (RSM_SUCCESS);