/*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
- */
-/*
- * Copyright (c) 2011 Whamcloud, Inc.
+ *
+ * Copyright (c) 2011, 2012, Whamcloud, Inc.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#endif
static struct ptlrpcd *ptlrpcds;
-cfs_semaphore_t ptlrpcd_sem;
+cfs_mutex_t ptlrpcd_mutex;
static int ptlrpcd_users = 0;
void ptlrpcd_wake(struct ptlrpc_request *req)
int index = pc->pc_index;
if (index >= 0 && index < cfs_num_possible_cpus()) {
- while (!cfs_cpu_online(index)) {
+ while (!cpu_online(index)) {
if (++index >= cfs_num_possible_cpus())
index = 0;
}
{
struct ptlrpcd_ctl *pc;
int rc = 0;
+#if defined(CONFIG_NUMA) && defined(HAVE_NODE_TO_CPUMASK)
+ struct ptlrpcd_ctl *ppc;
+ int node, i, pidx;
+ cpumask_t mask;
+#endif
ENTRY;
LASSERT(index <= max - 1);
pc->pc_npartners = 1;
break;
case PDB_POLICY_NEIGHBOR:
+#if defined(CONFIG_NUMA) && defined(HAVE_NODE_TO_CPUMASK)
+ node = cpu_to_node(index);
+ mask = node_to_cpumask(node);
+ for (i = max; i < cfs_num_online_cpus(); i++)
+ cpu_clear(i, mask);
+ pc->pc_npartners = cpus_weight(mask) - 1;
+ cfs_set_bit(LIOD_BIND, &pc->pc_flags);
+#else
LASSERT(max >= 3);
pc->pc_npartners = 2;
+#endif
break;
default:
CERROR("unknown ptlrpcd bind policy %d\n", ptlrpcd_bind_policy);
pc->pc_npartners = 0;
rc = -ENOMEM;
} else {
- if (index & 0x1)
- cfs_set_bit(LIOD_BIND, &pc->pc_flags);
-
switch (ptlrpcd_bind_policy) {
case PDB_POLICY_PAIR:
if (index & 0x1) {
+ cfs_set_bit(LIOD_BIND, &pc->pc_flags);
pc->pc_partners[0] = &ptlrpcds->
pd_threads[index - 1];
ptlrpcds->pd_threads[index - 1].
}
break;
case PDB_POLICY_NEIGHBOR:
+#if defined(CONFIG_NUMA) && defined(HAVE_NODE_TO_CPUMASK)
+ /* partners are cores in the same NUMA node.
+ * setup partnership only with ptlrpcd threads
+ * that are already initialized
+ */
+ for (pidx = 0, i = 0; i < index; i++) {
+ if (cpu_isset(i, mask)) {
+ ppc = &ptlrpcds->pd_threads[i];
+ pc->pc_partners[pidx++] = ppc;
+ ppc->pc_partners[ppc->
+ pc_npartners++] = pc;
+ }
+ }
+ /* adjust number of partners to the number
+ * of partnership really setup */
+ pc->pc_npartners = pidx;
+#else
+ if (index & 0x1)
+ cfs_set_bit(LIOD_BIND, &pc->pc_flags);
if (index > 0) {
pc->pc_partners[0] = &ptlrpcds->
pd_threads[index - 1];
pc_partners[0] = pc;
}
}
+#endif
break;
}
}
int rc = 0;
ENTRY;
- cfs_mutex_down(&ptlrpcd_sem);
+ cfs_mutex_lock(&ptlrpcd_mutex);
if (++ptlrpcd_users == 1)
rc = ptlrpcd_init();
- cfs_mutex_up(&ptlrpcd_sem);
+ cfs_mutex_unlock(&ptlrpcd_mutex);
RETURN(rc);
}
void ptlrpcd_decref(void)
{
- cfs_mutex_down(&ptlrpcd_sem);
+ cfs_mutex_lock(&ptlrpcd_mutex);
if (--ptlrpcd_users == 0)
ptlrpcd_fini();
- cfs_mutex_up(&ptlrpcd_sem);
+ cfs_mutex_unlock(&ptlrpcd_mutex);
}
/** @} ptlrpcd */