本文整理汇总了C++中cfs_time_current函数的典型用法代码示例。如果您正苦于以下问题:C++ cfs_time_current函数的具体用法?C++ cfs_time_current怎么用?C++ cfs_time_current使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了cfs_time_current函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: lfsck_namespace_checkpoint
static int lfsck_namespace_checkpoint(const struct lu_env *env,
struct lfsck_component *com, bool init)
{
struct lfsck_instance *lfsck = com->lc_lfsck;
struct lfsck_namespace *ns = com->lc_file_ram;
int rc;
if (com->lc_new_checked == 0 && !init)
return 0;
down_write(&com->lc_sem);
if (init) {
ns->ln_pos_latest_start = lfsck->li_pos_current;
} else {
ns->ln_pos_last_checkpoint = lfsck->li_pos_current;
ns->ln_run_time_phase1 += cfs_duration_sec(cfs_time_current() +
HALF_SEC - lfsck->li_time_last_checkpoint);
ns->ln_time_last_checkpoint = cfs_time_current_sec();
ns->ln_items_checked += com->lc_new_checked;
com->lc_new_checked = 0;
}
rc = lfsck_namespace_store(env, com, false);
up_write(&com->lc_sem);
return rc;
}
开发者ID:hejin,项目名称:lustre-stable,代码行数:28,代码来源:lfsck_namespace.c
示例2: ldlm_handle_gl_callback
/**
* Callback handler for receiving incoming glimpse ASTs.
*
* This only can happen on client side. After handling the glimpse AST
* we also consider dropping the lock here if it is unused locally for a
* long time.
*/
static void ldlm_handle_gl_callback(struct ptlrpc_request *req,
struct ldlm_namespace *ns,
struct ldlm_request *dlm_req,
struct ldlm_lock *lock)
{
int rc = -ENOSYS;
LDLM_DEBUG(lock, "client glimpse AST callback handler");
if (lock->l_glimpse_ast != NULL)
rc = lock->l_glimpse_ast(lock, req);
if (req->rq_repmsg != NULL) {
ptlrpc_reply(req);
} else {
req->rq_status = rc;
ptlrpc_error(req);
}
lock_res_and_lock(lock);
if (lock->l_granted_mode == LCK_PW &&
!lock->l_readers && !lock->l_writers &&
cfs_time_after(cfs_time_current(),
cfs_time_add(lock->l_last_used,
cfs_time_seconds(10)))) {
unlock_res_and_lock(lock);
if (ldlm_bl_to_thread_lock(ns, NULL, lock))
ldlm_handle_bl_callback(ns, NULL, lock);
return;
}
unlock_res_and_lock(lock);
LDLM_LOCK_RELEASE(lock);
}
开发者ID:IIosTaJI,项目名称:linux-2.6,代码行数:41,代码来源:ldlm_lockd.c
示例3: osc_object_is_contended
int osc_object_is_contended(struct osc_object *obj)
{
struct osc_device *dev = lu2osc_dev(obj->oo_cl.co_lu.lo_dev);
int osc_contention_time = dev->od_contention_time;
unsigned long cur_time = cfs_time_current();
unsigned long retry_time;
if (OBD_FAIL_CHECK(OBD_FAIL_OSC_OBJECT_CONTENTION))
return 1;
if (!obj->oo_contended)
return 0;
/*
* I like copy-paste. the code is copied from
* ll_file_is_contended.
*/
retry_time = cfs_time_add(obj->oo_contention_time,
cfs_time_seconds(osc_contention_time));
if (cfs_time_after(cur_time, retry_time)) {
osc_object_clear_contended(obj);
return 0;
}
return 1;
}
开发者ID:19Dan01,项目名称:linux,代码行数:25,代码来源:osc_object.c
示例4: cfs_timer_is_armed
int cfs_timer_is_armed(cfs_timer_t *l)
{
if (cfs_time_before(cfs_time_current(), l->expires))
return 1;
else
return 0;
}
开发者ID:chaos,项目名称:lustre-kdmu,代码行数:7,代码来源:user-prim.c
示例5: libcfs_sock_write
int
libcfs_sock_write (cfs_socket_t *sock, void *buffer, int nob, int timeout)
{
int rc;
struct pollfd pfd;
cfs_time_t start_time = cfs_time_current();
pfd.fd = sock->s_fd;
pfd.events = POLLOUT;
pfd.revents = 0;
/* poll(2) measures timeout in msec */
timeout *= 1000;
while (nob != 0 && timeout > 0) {
cfs_time_t current_time;
rc = poll(&pfd, 1, timeout);
if (rc < 0)
return -errno;
if (rc == 0)
return -ETIMEDOUT;
if ((pfd.revents & POLLOUT) == 0)
return -EIO;
rc = write(sock->s_fd, buffer, nob);
if (rc < 0)
return -errno;
if (rc == 0)
return -EIO;
buffer = ((char *)buffer) + rc;
nob -= rc;
current_time = cfs_time_current();
timeout -= 1000 *
cfs_duration_sec(cfs_time_sub(current_time,
start_time));
start_time = current_time;
}
if (nob == 0)
return 0;
else
return -ETIMEDOUT;
}
开发者ID:Lezval,项目名称:lustre,代码行数:46,代码来源:user-tcpip.c
示例6: osp_init_precreate
int osp_init_precreate(struct osp_device *d)
{
struct l_wait_info lwi = { 0 };
struct task_struct *task;
ENTRY;
OBD_ALLOC_PTR(d->opd_pre);
if (d->opd_pre == NULL)
RETURN(-ENOMEM);
/* initially precreation isn't ready */
d->opd_pre_status = -EAGAIN;
fid_zero(&d->opd_pre_used_fid);
d->opd_pre_used_fid.f_oid = 1;
fid_zero(&d->opd_pre_last_created_fid);
d->opd_pre_last_created_fid.f_oid = 1;
d->opd_pre_reserved = 0;
d->opd_got_disconnected = 1;
d->opd_pre_grow_slow = 0;
d->opd_pre_grow_count = OST_MIN_PRECREATE;
d->opd_pre_min_grow_count = OST_MIN_PRECREATE;
d->opd_pre_max_grow_count = OST_MAX_PRECREATE;
spin_lock_init(&d->opd_pre_lock);
init_waitqueue_head(&d->opd_pre_waitq);
init_waitqueue_head(&d->opd_pre_user_waitq);
init_waitqueue_head(&d->opd_pre_thread.t_ctl_waitq);
/*
* Initialize statfs-related things
*/
d->opd_statfs_maxage = 5; /* default update interval */
d->opd_statfs_fresh_till = cfs_time_shift(-1000);
CDEBUG(D_OTHER, "current %llu, fresh till %llu\n",
(unsigned long long)cfs_time_current(),
(unsigned long long)d->opd_statfs_fresh_till);
cfs_timer_init(&d->opd_statfs_timer, osp_statfs_timer_cb, d);
/*
* start thread handling precreation and statfs updates
*/
task = kthread_run(osp_precreate_thread, d,
"osp-pre-%u-%u", d->opd_index, d->opd_group);
if (IS_ERR(task)) {
CERROR("can't start precreate thread %ld\n", PTR_ERR(task));
RETURN(PTR_ERR(task));
}
l_wait_event(d->opd_pre_thread.t_ctl_waitq,
osp_precreate_running(d) || osp_precreate_stopped(d),
&lwi);
RETURN(0);
}
开发者ID:hocks,项目名称:lustre-release,代码行数:55,代码来源:osp_precreate.c
示例7: libcfs_sock_read
ssize_t
libcfs_sock_read(struct lnet_xport *lx, void *buffer, size_t nob,
int timeout)
{
ssize_t rc;
struct pollfd pfd;
cfs_time_t start_time = cfs_time_current();
pfd.fd = lx->lx_fd;
pfd.events = POLLIN;
pfd.revents = 0;
/* poll(2) measures timeout in msec */
timeout *= 1000;
while (nob != 0 && timeout > 0) {
rc = poll(&pfd, 1, timeout);
if (rc < 0)
return -errno;
if (rc == 0)
return -ETIMEDOUT;
if ((pfd.revents & POLLIN) == 0)
return -EIO;
rc = read(lx->lx_fd, buffer, nob);
if (rc < 0)
return -errno;
if (rc == 0)
return -EIO;
buffer = ((char *)buffer) + rc;
nob -= rc;
timeout -= cfs_duration_sec(cfs_time_sub(cfs_time_current(),
start_time));
}
if (nob == 0)
return 0;
else
return -ETIMEDOUT;
}
开发者ID:pscedu,项目名称:pfl,代码行数:42,代码来源:user-tcpip.c
示例8: libcfs_ssl_sock_read
ssize_t
libcfs_ssl_sock_read(struct lnet_xport *lx, void *buf, size_t n,
int timeout)
{
cfs_time_t start_time = cfs_time_current();
struct pollfd pfd;
ssize_t rc;
pfd.fd = lx->lx_fd;
pfd.events = POLLIN;
pfd.revents = 0;
/* poll(2) measures timeout in msec */
timeout *= 1000;
while (n != 0 && timeout > 0) {
rc = poll(&pfd, 1, timeout);
if (rc < 0)
return (-errno);
if (rc == 0)
return (-ETIMEDOUT);
if ((pfd.revents & POLLIN) == 0)
return (-EIO);
rc = SSL_read(lx->lx_ssl, buf, n);
if (rc < 0)
return (-errno);
if (rc == 0)
return (-EIO);
buf = (char *)buf + rc;
n -= rc;
timeout -= cfs_duration_sec(cfs_time_sub(
cfs_time_current(), start_time));
}
if (n == 0)
return (0);
return (-ETIMEDOUT);
}
开发者ID:pscedu,项目名称:slash2-stable,代码行数:41,代码来源:user-tcpip-ssl.c
示例9: osd_read
static ssize_t osd_read(const struct lu_env *env, struct dt_object *dt,
struct lu_buf *buf, loff_t *pos)
{
struct osd_object *obj = osd_dt_obj(dt);
struct osd_device *osd = osd_obj2dev(obj);
uint64_t old_size;
int size = buf->lb_len;
int rc;
unsigned long start;
LASSERT(dt_object_exists(dt));
LASSERT(obj->oo_db);
start = cfs_time_current();
read_lock(&obj->oo_attr_lock);
old_size = obj->oo_attr.la_size;
read_unlock(&obj->oo_attr_lock);
if (*pos + size > old_size) {
if (old_size < *pos)
return 0;
else
size = old_size - *pos;
}
record_start_io(osd, READ, 0);
rc = -dmu_read(osd->od_os, obj->oo_db->db_object, *pos, size,
buf->lb_buf, DMU_READ_PREFETCH);
record_end_io(osd, READ, cfs_time_current() - start, size,
size >> PAGE_CACHE_SHIFT);
if (rc == 0) {
rc = size;
*pos += size;
}
return rc;
}
开发者ID:dinatale2,项目名称:lustre-stable,代码行数:39,代码来源:osd_io.c
示例10: usocklnd_read_data
/* Read from wire as much data as possible.
* Returns 0 or 1 on succsess, <0 if error or EOF.
* 0 means partial read, 1 - complete */
int
usocklnd_read_data(usock_conn_t *conn)
{
struct iovec *iov;
int nob;
cfs_time_t t;
LASSERT (conn->uc_rx_nob_wanted != 0);
do {
usock_peer_t *peer = conn->uc_peer;
LASSERT (conn->uc_rx_niov > 0);
nob = libcfs_sock_readv(conn->uc_sock,
conn->uc_rx_iov, conn->uc_rx_niov);
if (nob <= 0) {/* read nothing or error */
if (nob < 0)
conn->uc_errored = 1;
return nob;
}
LASSERT (nob <= conn->uc_rx_nob_wanted);
conn->uc_rx_nob_wanted -= nob;
conn->uc_rx_nob_left -= nob;
t = cfs_time_current();
conn->uc_rx_deadline = cfs_time_add(t, cfs_time_seconds(usock_tuns.ut_timeout));
if(peer != NULL)
peer->up_last_alive = t;
/* "consume" iov */
iov = conn->uc_rx_iov;
do {
LASSERT (conn->uc_rx_niov > 0);
if (nob < iov->iov_len) {
iov->iov_base = (void *)(((unsigned long)(iov->iov_base)) + nob);
iov->iov_len -= nob;
break;
}
nob -= iov->iov_len;
conn->uc_rx_iov = ++iov;
conn->uc_rx_niov--;
} while (nob != 0);
} while (conn->uc_rx_nob_wanted != 0);
return 1; /* read complete */
}
开发者ID:Lezval,项目名称:lustre,代码行数:54,代码来源:handlers.c
示例11: void
struct lc_watchdog *lc_watchdog_add(int timeout,
void (*callback)(pid_t, void *),
void *data)
{
struct lc_watchdog *lcw = NULL;
ENTRY;
LIBCFS_ALLOC(lcw, sizeof(*lcw));
if (lcw == NULL) {
CDEBUG(D_INFO, "Could not allocate new lc_watchdog\n");
RETURN(ERR_PTR(-ENOMEM));
}
cfs_spin_lock_init(&lcw->lcw_lock);
lcw->lcw_refcount = 1; /* refcount for owner */
lcw->lcw_task = cfs_current();
lcw->lcw_pid = cfs_curproc_pid();
lcw->lcw_callback = (callback != NULL) ? callback : lc_watchdog_dumplog;
lcw->lcw_data = data;
lcw->lcw_state = LC_WATCHDOG_DISABLED;
CFS_INIT_LIST_HEAD(&lcw->lcw_list);
cfs_timer_init(&lcw->lcw_timer, lcw_cb, lcw);
cfs_down(&lcw_refcount_sem);
if (++lcw_refcount == 1)
lcw_dispatch_start();
cfs_up(&lcw_refcount_sem);
/* Keep this working in case we enable them by default */
if (lcw->lcw_state == LC_WATCHDOG_ENABLED) {
lcw->lcw_last_touched = cfs_time_current();
cfs_timer_arm(&lcw->lcw_timer, cfs_time_seconds(timeout) +
cfs_time_current());
}
RETURN(lcw);
}
开发者ID:hpc,项目名称:lustre,代码行数:38,代码来源:watchdog.c
示例12: osp_init_precreate
int osp_init_precreate(struct osp_device *d)
{
struct l_wait_info lwi = { 0 };
int rc;
ENTRY;
/* initially precreation isn't ready */
d->opd_pre_status = -EAGAIN;
fid_zero(&d->opd_pre_used_fid);
d->opd_pre_used_fid.f_oid = 1;
fid_zero(&d->opd_pre_last_created_fid);
d->opd_pre_last_created_fid.f_oid = 1;
d->opd_pre_reserved = 0;
d->opd_got_disconnected = 1;
d->opd_pre_grow_slow = 0;
d->opd_pre_grow_count = OST_MIN_PRECREATE;
d->opd_pre_min_grow_count = OST_MIN_PRECREATE;
d->opd_pre_max_grow_count = OST_MAX_PRECREATE;
spin_lock_init(&d->opd_pre_lock);
cfs_waitq_init(&d->opd_pre_waitq);
cfs_waitq_init(&d->opd_pre_user_waitq);
cfs_waitq_init(&d->opd_pre_thread.t_ctl_waitq);
/*
* Initialize statfs-related things
*/
d->opd_statfs_maxage = 5; /* default update interval */
d->opd_statfs_fresh_till = cfs_time_shift(-1000);
CDEBUG(D_OTHER, "current %llu, fresh till %llu\n",
(unsigned long long)cfs_time_current(),
(unsigned long long)d->opd_statfs_fresh_till);
cfs_timer_init(&d->opd_statfs_timer, osp_statfs_timer_cb, d);
/*
* start thread handling precreation and statfs updates
*/
rc = cfs_create_thread(osp_precreate_thread, d, 0);
if (rc < 0) {
CERROR("can't start precreate thread %d\n", rc);
RETURN(rc);
}
l_wait_event(d->opd_pre_thread.t_ctl_waitq,
osp_precreate_running(d) || osp_precreate_stopped(d),
&lwi);
RETURN(0);
}
开发者ID:mlogic,项目名称:ascar-lustre-2.4-client,代码行数:50,代码来源:osp_precreate.c
示例13: lfsck_namespace_post
static int lfsck_namespace_post(const struct lu_env *env,
struct lfsck_component *com,
int result, bool init)
{
struct lfsck_instance *lfsck = com->lc_lfsck;
struct lfsck_namespace *ns = com->lc_file_ram;
int rc;
down_write(&com->lc_sem);
spin_lock(&lfsck->li_lock);
if (!init)
ns->ln_pos_last_checkpoint = lfsck->li_pos_current;
if (result > 0) {
ns->ln_status = LS_SCANNING_PHASE2;
ns->ln_flags |= LF_SCANNED_ONCE;
ns->ln_flags &= ~LF_UPGRADE;
cfs_list_del_init(&com->lc_link);
cfs_list_del_init(&com->lc_link_dir);
cfs_list_add_tail(&com->lc_link, &lfsck->li_list_double_scan);
} else if (result == 0) {
ns->ln_status = lfsck->li_status;
if (ns->ln_status == 0)
ns->ln_status = LS_STOPPED;
if (ns->ln_status != LS_PAUSED) {
cfs_list_del_init(&com->lc_link);
cfs_list_del_init(&com->lc_link_dir);
cfs_list_add_tail(&com->lc_link, &lfsck->li_list_idle);
}
} else {
ns->ln_status = LS_FAILED;
cfs_list_del_init(&com->lc_link);
cfs_list_del_init(&com->lc_link_dir);
cfs_list_add_tail(&com->lc_link, &lfsck->li_list_idle);
}
spin_unlock(&lfsck->li_lock);
if (!init) {
ns->ln_run_time_phase1 += cfs_duration_sec(cfs_time_current() +
HALF_SEC - lfsck->li_time_last_checkpoint);
ns->ln_time_last_checkpoint = cfs_time_current_sec();
ns->ln_items_checked += com->lc_new_checked;
com->lc_new_checked = 0;
}
rc = lfsck_namespace_store(env, com, false);
up_write(&com->lc_sem);
return rc;
}
开发者ID:hejin,项目名称:lustre-stable,代码行数:50,代码来源:lfsck_namespace.c
示例14: usocklnd_send_tx
/* Send as much tx data as possible.
* Returns 0 or 1 on succsess, <0 if fatal error.
* 0 means partial send or non-fatal error, 1 - complete.
* Rely on libcfs_sock_writev() for differentiating fatal and
* non-fatal errors. An error should be considered as non-fatal if:
* 1) it still makes sense to continue reading &&
* 2) anyway, poll() will set up POLLHUP|POLLERR flags */
int
usocklnd_send_tx(usock_conn_t *conn, usock_tx_t *tx)
{
struct iovec *iov;
int nob;
cfs_time_t t;
LASSERT (tx->tx_resid != 0);
do {
usock_peer_t *peer = conn->uc_peer;
LASSERT (tx->tx_niov > 0);
nob = libcfs_sock_writev(conn->uc_sock,
tx->tx_iov, tx->tx_niov);
if (nob < 0)
conn->uc_errored = 1;
if (nob <= 0) /* write queue is flow-controlled or error */
return nob;
LASSERT (nob <= tx->tx_resid);
tx->tx_resid -= nob;
t = cfs_time_current();
conn->uc_tx_deadline = cfs_time_add(t, cfs_time_seconds(usock_tuns.ut_timeout));
if(peer != NULL)
peer->up_last_alive = t;
/* "consume" iov */
iov = tx->tx_iov;
do {
LASSERT (tx->tx_niov > 0);
if (nob < iov->iov_len) {
iov->iov_base = (void *)(((unsigned long)(iov->iov_base)) + nob);
iov->iov_len -= nob;
break;
}
nob -= iov->iov_len;
tx->tx_iov = ++iov;
tx->tx_niov--;
} while (nob != 0);
} while (tx->tx_resid != 0);
return 1; /* send complete */
}
开发者ID:Lezval,项目名称:lustre,代码行数:56,代码来源:handlers.c
示例15: lc_watchdog_touch
void lc_watchdog_touch(struct lc_watchdog *lcw, int timeout)
{
ENTRY;
LASSERT(lcw != NULL);
lc_watchdog_del_pending(lcw);
lcw_update_time(lcw, "resumed");
lcw->lcw_state = LC_WATCHDOG_ENABLED;
cfs_timer_arm(&lcw->lcw_timer, cfs_time_current() +
cfs_time_seconds(timeout));
EXIT;
}
开发者ID:hpc,项目名称:lustre,代码行数:15,代码来源:watchdog.c
示例16: lcw_dump_stack
static void lcw_dump_stack(struct lc_watchdog *lcw)
{
cfs_time_t current_time;
cfs_duration_t delta_time;
struct timeval timediff;
current_time = cfs_time_current();
delta_time = cfs_time_sub(current_time, lcw->lcw_last_touched);
cfs_duration_usec(delta_time, &timediff);
/*
* Check to see if we should throttle the watchdog timer to avoid
* too many dumps going to the console thus triggering an NMI.
*/
delta_time = cfs_duration_sec(cfs_time_sub(current_time,
lcw_last_watchdog_time));
if (delta_time < libcfs_watchdog_ratelimit &&
lcw_recent_watchdog_count > 3) {
LCONSOLE_WARN("Service thread pid %u was inactive for "
"%lu.%.02lus. Watchdog stack traces are limited "
"to 3 per %d seconds, skipping this one.\n",
(int)lcw->lcw_pid,
timediff.tv_sec,
timediff.tv_usec / 10000,
libcfs_watchdog_ratelimit);
} else {
if (delta_time < libcfs_watchdog_ratelimit) {
lcw_recent_watchdog_count++;
} else {
memcpy(&lcw_last_watchdog_time, ¤t_time,
sizeof(current_time));
lcw_recent_watchdog_count = 0;
}
LCONSOLE_WARN("Service thread pid %u was inactive for "
"%lu.%.02lus. The thread might be hung, or it "
"might only be slow and will resume later. "
"Dumping the stack trace for debugging purposes:"
"\n",
(int)lcw->lcw_pid,
timediff.tv_sec,
timediff.tv_usec / 10000);
lcw_dump(lcw);
}
}
开发者ID:hpc,项目名称:lustre,代码行数:46,代码来源:watchdog.c
示例17: ctx_start_timer_kr
static void ctx_start_timer_kr(struct ptlrpc_cli_ctx *ctx, long timeout)
{
struct gss_cli_ctx_keyring *gctx_kr = ctx2gctx_keyring(ctx);
struct timer_list *timer = gctx_kr->gck_timer;
LASSERT(timer);
CDEBUG(D_SEC, "ctx %p: start timer %lds\n", ctx, timeout);
timeout = msecs_to_jiffies(timeout * MSEC_PER_SEC) +
cfs_time_current();
init_timer(timer);
timer->expires = timeout;
timer->data = (unsigned long ) ctx;
timer->function = ctx_upcall_timeout_kr;
add_timer(timer);
}
开发者ID:dinatale2,项目名称:lustre-stable,代码行数:18,代码来源:gss_keyring.c
示例18: lcw_update_time
static void lcw_update_time(struct lc_watchdog *lcw, const char *message)
{
cfs_time_t newtime = cfs_time_current();;
if (lcw->lcw_state == LC_WATCHDOG_EXPIRED) {
struct timeval timediff;
cfs_time_t delta_time = cfs_time_sub(newtime,
lcw->lcw_last_touched);
cfs_duration_usec(delta_time, &timediff);
LCONSOLE_WARN("Service thread pid %u %s after %lu.%.02lus. "
"This indicates the system was overloaded (too "
"many service threads, or there were not enough "
"hardware resources).\n",
lcw->lcw_pid,
message,
timediff.tv_sec,
timediff.tv_usec / 10000);
}
lcw->lcw_last_touched = newtime;
}
开发者ID:hpc,项目名称:lustre,代码行数:21,代码来源:watchdog.c
示例19: osd_bufs_get_read
/**
* Prepare buffers for read.
*
* The function maps the range described by \a off and \a len to \a lnb array.
* dmu_buf_hold_array_by_bonus() finds/creates appropriate ARC buffers, then
* we fill \a lnb array with the pages storing ARC buffers. Notice the current
* implementationt passes TRUE to dmu_buf_hold_array_by_bonus() to fill ARC
* buffers with actual data, I/O is done in the conext of osd_bufs_get_read().
* A better implementation would just return the buffers (potentially unfilled)
* and subsequent osd_read_prep() would do I/O for many ranges concurrently.
*
* \param[in] env environment
* \param[in] obj object
* \param[in] off offset in bytes
* \param[in] len the number of bytes to access
* \param[out] lnb array of local niobufs pointing to the buffers with data
*
* \retval 0 for success
* \retval negative error number of failure
*/
static int osd_bufs_get_read(const struct lu_env *env, struct osd_object *obj,
loff_t off, ssize_t len, struct niobuf_local *lnb)
{
struct osd_device *osd = osd_obj2dev(obj);
unsigned long start = cfs_time_current();
int rc, i, numbufs, npages = 0;
dmu_buf_t **dbp;
ENTRY;
record_start_io(osd, READ, 0);
/* grab buffers for read:
* OSD API let us to grab buffers first, then initiate IO(s)
* so that all required IOs will be done in parallel, but at the
* moment DMU doesn't provide us with a method to grab buffers.
* If we discover this is a vital for good performance we
* can get own replacement for dmu_buf_hold_array_by_bonus().
*/
while (len > 0) {
rc = -dmu_buf_hold_array_by_bonus(obj->oo_db, off, len, TRUE,
osd_zerocopy_tag, &numbufs,
&dbp);
if (unlikely(rc))
GOTO(err, rc);
for (i = 0; i < numbufs; i++) {
int bufoff, tocpy, thispage;
void *dbf = dbp[i];
LASSERT(len > 0);
atomic_inc(&osd->od_zerocopy_pin);
bufoff = off - dbp[i]->db_offset;
tocpy = min_t(int, dbp[i]->db_size - bufoff, len);
/* kind of trick to differentiate dbuf vs. arcbuf */
LASSERT(((unsigned long)dbp[i] & 1) == 0);
dbf = (void *) ((unsigned long)dbp[i] | 1);
while (tocpy > 0) {
thispage = PAGE_CACHE_SIZE;
thispage -= bufoff & (PAGE_CACHE_SIZE - 1);
thispage = min(tocpy, thispage);
lnb->lnb_rc = 0;
lnb->lnb_file_offset = off;
lnb->lnb_page_offset = bufoff & ~PAGE_MASK;
lnb->lnb_len = thispage;
lnb->lnb_page = kmem_to_page(dbp[i]->db_data +
bufoff);
/* mark just a single slot: we need this
* reference to dbuf to be released once */
lnb->lnb_data = dbf;
dbf = NULL;
tocpy -= thispage;
len -= thispage;
bufoff += thispage;
off += thispage;
npages++;
lnb++;
}
/* steal dbuf so dmu_buf_rele_array() can't release
* it */
dbp[i] = NULL;
}
dmu_buf_rele_array(dbp, numbufs, osd_zerocopy_tag);
}
record_end_io(osd, READ, cfs_time_current() - start,
npages * PAGE_SIZE, npages);
RETURN(npages);
err:
LASSERT(rc < 0);
//.........这里部分代码省略.........
开发者ID:dinatale2,项目名称:lustre-stable,代码行数:101,代码来源:osd_io.c
示例20: usocklnd_passiveconn_hellorecv
/* All actions that we need after receiving hello on passive conn:
* 1) Stash peer's nid, pid, incarnation and conn type
* 2) Cope with easy case: conn[idx] is empty - just save conn there
* 3) Resolve race:
* a) if our nid is higher - reply with CONN_NONE and make us zombie
* b) if peer's nid is higher - postpone race resolution till
* READY state
* 4) Anyhow, send reply hello
*/
int
usocklnd_passiveconn_hellorecv(usock_conn_t *conn)
{
ksock_hello_msg_t *hello = conn->uc_rx_hello;
int type;
int idx;
int rc;
usock_peer_t *peer;
lnet_ni_t *ni = conn->uc_ni;
__u32 peer_ip = conn->uc_peer_ip;
__u16 peer_port = conn->uc_peer_port;
/* don't know parent peer yet and not zombie */
LASSERT (conn->uc_peer == NULL &&
ni != NULL);
/* don't know peer's nid and incarnation yet */
if (peer_port > LNET_ACCEPTOR_MAX_RESERVED_PORT) {
/* do not trust liblustre clients */
conn->uc_peerid.pid = peer_port | LNET_PID_USERFLAG;
conn->uc_peerid.nid = LNET_MKNID(LNET_NIDNET(ni->ni_nid),
peer_ip);
if (hello->kshm_ctype != SOCKLND_CONN_ANY) {
lnet_ni_decref(ni);
conn->uc_ni = NULL;
CERROR("Refusing to accept connection of type=%d from "
"userspace process %u.%u.%u.%u:%d\n", hello->kshm_ctype,
HIPQUAD(peer_ip), peer_port);
return -EINVAL;
}
} else {
conn->uc_peerid.pid = hello->kshm_src_pid;
conn->uc_peerid.nid = hello->kshm_src_nid;
}
conn->uc_type = type = usocklnd_invert_type(hello->kshm_ctype);
rc = usocklnd_find_or_create_peer(ni, conn->uc_peerid, &peer);
if (rc) {
lnet_ni_decref(ni);
conn->uc_ni = NULL;
return rc;
}
peer->up_last_alive = cfs_time_current();
idx = usocklnd_type2idx(conn->uc_type);
/* safely check whether we're first */
pthread_mutex_lock(&peer->up_lock);
usocklnd_cleanup_stale_conns(peer, hello->kshm_src_incarnation, NULL);
if (peer->up_conns[idx] == NULL) {
peer->up_last_alive = cfs_time_current();
conn->uc_peer = peer;
conn->uc_ni = NULL;
usocklnd_link_conn_to_peer(conn, peer, idx);
usocklnd_conn_addref(conn);
} else {
usocklnd_peer_decref(peer);
/* Resolve race in favour of higher NID */
if (conn->uc_peerid.nid < conn->uc_ni->ni_nid) {
/* make us zombie */
conn->uc_ni = NULL;
type = SOCKLND_CONN_NONE;
}
/* if conn->uc_peerid.nid > conn->uc_ni->ni_nid,
* postpone race resolution till READY state
* (hopefully that conn[idx] will die because of
* incoming hello of CONN_NONE type) */
}
pthread_mutex_unlock(&peer->up_lock);
/* allocate and initialize fake tx with hello */
conn->uc_tx_hello = usocklnd_create_hello_tx(ni, type,
conn->uc_peerid.nid);
if (conn->uc_ni == NULL)
lnet_ni_decref(ni);
if (conn->uc_tx_hello == NULL)
return -ENOMEM;
/* rc == 0 */
pthread_mutex_lock(&conn->uc_lock);
if (conn->uc_state == UC_DEAD)
goto passive_hellorecv_done;
conn->uc_state = UC_SENDING_HELLO;
conn->uc_tx_deadline = cfs_time_shift(usock_tuns.ut_timeout);
//.........这里部分代码省略.........
开发者ID:Lezval,项目名称:lustre,代码行数:101,代码来源:handlers.c
注:本文中的cfs_time_current函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论