-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
* GPL HEADER START
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* GPL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright (c) 2012, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#include <lnet/socklnd.h>
typedef struct {
- struct list_head tx_list; /* neccessary to form tx list */
+ struct list_head tx_list; /* neccessary to form tx list */
lnet_msg_t *tx_lnetmsg; /* lnet message for lnet_finalize() */
ksock_msg_t tx_msg; /* buffer for wire header of ksock msg */
int tx_resid; /* # of residual bytes */
struct usock_peer_s;
typedef struct {
- int uc_fd; /* socket */
+ cfs_socket_t *uc_sock; /* socket */
int uc_type; /* conn type */
int uc_activeflag; /* active side of connection? */
int uc_flip; /* is peer other endian? */
struct usock_preq_s *uc_preq; /* preallocated request */
__u32 uc_peer_ip; /* IP address of the peer */
__u16 uc_peer_port; /* port of the peer */
- struct list_head uc_stale_list; /* orphaned connections */
-
+ struct list_head uc_stale_list; /* orphaned connections */
+
/* Receive state */
int uc_rx_state; /* message or hello state */
ksock_hello_msg_t *uc_rx_hello; /* hello buffer */
ksock_msg_t uc_rx_msg; /* message buffer */
/* Send state */
- struct list_head uc_tx_list; /* pending txs */
- struct list_head uc_zcack_list; /* pending zc_acks */
+ struct list_head uc_tx_list; /* pending txs */
+ struct list_head uc_zcack_list; /* pending zc_acks */
cfs_time_t uc_tx_deadline; /* when to time out */
int uc_tx_flag; /* deadline valid? */
int uc_sending; /* send op is in progress */
usock_tx_t *uc_tx_hello; /* fake tx with hello */
-
- cfs_atomic_t uc_refcount; /* # of users */
+
+ mt_atomic_t uc_refcount; /* # of users */
pthread_mutex_t uc_lock; /* serialize */
- int uc_errored; /* a flag for lnet_notify() */
+ int uc_errored; /* a flag for lnet_notify() */
} usock_conn_t;
/* Allowable conn states are: */
#define N_CONN_TYPES 3 /* CONTROL, BULK_IN and BULK_OUT */
typedef struct usock_peer_s {
- struct list_head up_list; /* neccessary to form peer list */
- lnet_process_id_t up_peerid; /* id of remote peer */
+ /* neccessary to form peer list */
+ struct list_head up_list;
+ lnet_process_id_t up_peerid; /* id of remote peer */
usock_conn_t *up_conns[N_CONN_TYPES]; /* conns that connect us
- * us with the peer */
- lnet_ni_t *up_ni; /* pointer to parent NI */
- __u64 up_incarnation; /* peer's incarnation */
- int up_incrn_is_set; /* 0 if peer's incarnation
- * hasn't been set so far */
- cfs_atomic_t up_refcount; /* # of users */
- pthread_mutex_t up_lock; /* serialize */
- int up_errored; /* a flag for lnet_notify() */
- cfs_time_t up_last_alive; /* when the peer was last alive */
+ * us with the peer */
+ lnet_ni_t *up_ni; /* pointer to parent NI */
+ __u64 up_incarnation; /* peer's incarnation */
+ int up_incrn_is_set;/* 0 if peer's incarnation
+ * hasn't been set so far */
+ mt_atomic_t up_refcount; /* # of users */
+ pthread_mutex_t up_lock; /* serialize */
+ int up_errored; /* a flag for lnet_notify() */
+ cfs_time_t up_last_alive; /* when the peer was last alive */
} usock_peer_t;
typedef struct {
- int upt_notifier_fd; /* notifier fd for writing */
- struct pollfd *upt_pollfd; /* poll fds */
- int upt_nfds; /* active poll fds */
- int upt_npollfd; /* allocated poll fds */
- usock_conn_t **upt_idx2conn; /* conns corresponding to
- * upt_pollfd[idx] */
- int *upt_skip; /* skip chain */
- int *upt_fd2idx; /* index into upt_pollfd[]
- * by fd */
- int upt_nfd2idx; /* # of allocated elements
- * of upt_fd2idx[] */
- struct list_head upt_stale_list; /* list of orphaned conns */
- struct list_head upt_pollrequests; /* list of poll requests */
- pthread_mutex_t upt_pollrequests_lock; /* serialize */
- int upt_errno; /* non-zero if errored */
- struct cfs_completion upt_completion; /* wait/signal facility for
- * syncronizing shutdown */
+ cfs_socket_t *upt_notifier[2]; /* notifier sockets: 1st for
+ * writing, 2nd for reading */
+ struct pollfd *upt_pollfd; /* poll fds */
+ int upt_nfds; /* active poll fds */
+ int upt_npollfd; /* allocated poll fds */
+ usock_conn_t **upt_idx2conn; /* conns corresponding to
+ * upt_pollfd[idx] */
+ int *upt_skip; /* skip chain */
+ int *upt_fd2idx; /* index into upt_pollfd[]
+ * by fd */
+ int upt_nfd2idx; /* # of allocated elements
+ * of upt_fd2idx[] */
+ struct list_head upt_stale_list; /* list of orphaned conns */
+ struct list_head upt_pollrequests; /* list of poll requests */
+ pthread_mutex_t upt_pollrequests_lock; /* serialize */
+ int upt_errno; /* non-zero if errored */
+ struct completion upt_completion; /* wait/signal facility for
+ * syncronizing shutdown */
} usock_pollthread_t;
/* Number of elements in upt_pollfd[], upt_idx2conn[] and upt_fd2idx[]
usock_pollthread_t *ud_pollthreads; /* their state */
int ud_shutdown; /* shutdown flag */
int ud_nets_count; /* # of instances */
- struct list_head ud_peers[UD_PEER_HASH_SIZE]; /* peer hash table */
+ struct list_head ud_peers[UD_PEER_HASH_SIZE]; /* peer hash table */
pthread_rwlock_t ud_peers_lock; /* serialize */
} usock_data_t;
pthread_cond_t un_cond; /* condvar to wait for notifications */
pthread_mutex_t un_lock; /* a lock to protect un_cond */
} usock_net_t;
-
+
typedef struct {
int ut_poll_timeout; /* the third arg for poll(2) (seconds) */
int ut_timeout; /* "stuck" socket timeout (seconds) */
extern usock_tunables_t usock_tuns;
typedef struct usock_preq_s {
- int upr_type; /* type of requested action */
+ int upr_type; /* type of requested action */
short upr_value; /* bitmask of POLLIN and POLLOUT bits */
usock_conn_t * upr_conn; /* a conn for the sake of which
* action will be performed */
- struct list_head upr_list; /* neccessary to form list */
+ struct list_head upr_list; /* neccessary to form list */
} usock_pollrequest_t;
/* Allowable poll request types are: */
#define POLL_SET_REQUEST 5
typedef struct {
- struct list_head zc_list; /* neccessary to form zc_ack list */
+ struct list_head zc_list; /* neccessary to form zc_ack list */
__u64 zc_cookie; /* zero-copy cookie */
} usock_zc_ack_t;
static inline void
usocklnd_conn_addref(usock_conn_t *conn)
{
- LASSERT (cfs_atomic_read(&conn->uc_refcount) > 0);
- cfs_atomic_inc(&conn->uc_refcount);
+ LASSERT(mt_atomic_read(&conn->uc_refcount) > 0);
+ mt_atomic_inc(&conn->uc_refcount);
}
void usocklnd_destroy_conn(usock_conn_t *conn);
static inline void
usocklnd_conn_decref(usock_conn_t *conn)
{
- LASSERT (cfs_atomic_read(&conn->uc_refcount) > 0);
- if (cfs_atomic_dec_and_test(&conn->uc_refcount))
+ LASSERT(mt_atomic_read(&conn->uc_refcount) > 0);
+ if (mt_atomic_dec_and_test(&conn->uc_refcount))
usocklnd_destroy_conn(conn);
}
static inline void
usocklnd_peer_addref(usock_peer_t *peer)
{
- LASSERT (cfs_atomic_read(&peer->up_refcount) > 0);
- cfs_atomic_inc(&peer->up_refcount);
+ LASSERT(mt_atomic_read(&peer->up_refcount) > 0);
+ mt_atomic_inc(&peer->up_refcount);
}
void usocklnd_destroy_peer(usock_peer_t *peer);
static inline void
usocklnd_peer_decref(usock_peer_t *peer)
{
- LASSERT (cfs_atomic_read(&peer->up_refcount) > 0);
- if (cfs_atomic_dec_and_test(&peer->up_refcount))
+ LASSERT(mt_atomic_read(&peer->up_refcount) > 0);
+ if (mt_atomic_dec_and_test(&peer->up_refcount))
usocklnd_destroy_peer(peer);
}
int usocklnd_recv(lnet_ni_t *ni, void *private, lnet_msg_t *msg, int delayed,
unsigned int niov, struct iovec *iov, lnet_kiov_t *kiov,
unsigned int offset, unsigned int mlen, unsigned int rlen);
-int usocklnd_accept(lnet_ni_t *ni, int sock_fd);
+int usocklnd_accept(lnet_ni_t *ni, cfs_socket_t *sock);
int usocklnd_poll_thread(void *arg);
int usocklnd_add_pollrequest(usock_conn_t *conn, int type, short value);
int usocklnd_activeconn_hellorecv(usock_conn_t *conn);
int usocklnd_passiveconn_hellorecv(usock_conn_t *conn);
int usocklnd_write_handler(usock_conn_t *conn);
-usock_tx_t * usocklnd_try_piggyback(struct list_head *tx_list_p,
- struct list_head *zcack_list_p);
+usock_tx_t *usocklnd_try_piggyback(struct list_head *tx_list_p,
+ struct list_head *zcack_list_p);
int usocklnd_activeconn_hellosent(usock_conn_t *conn);
int usocklnd_passiveconn_hellosent(usock_conn_t *conn);
int usocklnd_send_tx(usock_conn_t *conn, usock_tx_t *tx);
void usocklnd_conn_free(usock_conn_t *conn);
void usocklnd_tear_peer_conn(usock_conn_t *conn);
void usocklnd_check_peer_stale(lnet_ni_t *ni, lnet_process_id_t id);
-int usocklnd_create_passive_conn(lnet_ni_t *ni, int fd, usock_conn_t **connp);
+int usocklnd_create_passive_conn(lnet_ni_t *ni,
+ cfs_socket_t *sock, usock_conn_t **connp);
int usocklnd_create_active_conn(usock_peer_t *peer, int type,
usock_conn_t **connp);
-int usocklnd_connect_srv_mode(int *fdp, __u32 dst_ip, __u16 dst_port);
-int usocklnd_connect_cli_mode(int *fdp, __u32 dst_ip, __u16 dst_port);
-int usocklnd_set_sock_options(int fd);
+int usocklnd_connect_srv_mode(cfs_socket_t **sockp,
+ __u32 dst_ip, __u16 dst_port);
+int usocklnd_connect_cli_mode(cfs_socket_t **sockp,
+ __u32 dst_ip, __u16 dst_port);
+int usocklnd_set_sock_options(cfs_socket_t *sock);
usock_tx_t *usocklnd_create_noop_tx(__u64 cookie);
usock_tx_t *usocklnd_create_tx(lnet_msg_t *lntmsg);
void usocklnd_init_hello_msg(ksock_hello_msg_t *hello,
int usocklnd_find_or_create_conn(usock_peer_t *peer, int type,
usock_conn_t **connp,
usock_tx_t *tx, usock_zc_ack_t *zc_ack,
- int *send_immediately_flag);
+ int *send_immediately_flag);
void usocklnd_link_conn_to_peer(usock_conn_t *conn, usock_peer_t *peer, int idx);
int usocklnd_invert_type(int type);
void usocklnd_conn_new_state(usock_conn_t *conn, int new_state);