isc_buffer_t *buf);
static void
get_clientmctx(ns_clientmgr_t *manager, isc_mem_t **mctxp);
+static void
+get_clienttask(ns_clientmgr_t *manager, isc_task_t **taskp);
void
ns_client_recursing(ns_client_t *client) {
static void
get_clientmctx(ns_clientmgr_t *manager, isc_mem_t **mctxp) {
isc_mem_t *clientmctx;
- unsigned int nextmctx;
MTRACE("clientmctx");
int tid = isc_nm_tid();
tid = isc_random_uniform(manager->ncpus);
}
int rand = isc_random_uniform(CLIENT_NMCTXS_PERCPU);
- nextmctx = (rand * manager->ncpus) + tid;
+ int nextmctx = (rand * manager->ncpus) + tid;
clientmctx = manager->mctxpool[nextmctx];
isc_mem_attach(clientmctx, mctxp);
}
+static void
+get_clienttask(ns_clientmgr_t *manager, isc_task_t **taskp) {
+ MTRACE("clienttask");
+
+ int tid = isc_nm_tid();
+ if (tid < 0) {
+ tid = isc_random_uniform(manager->ncpus);
+ }
+
+ int rand = isc_random_uniform(CLIENT_NMCTXS_PERCPU);
+ int nexttask = (rand * manager->ncpus) + tid;
+ isc_task_attach(manager->taskpool[nexttask], taskp);
+}
+
isc_result_t
ns__client_setup(ns_client_t *client, ns_clientmgr_t *mgr, bool new) {
isc_result_t result;
get_clientmctx(mgr, &client->mctx);
clientmgr_attach(mgr, &client->manager);
ns_server_attach(mgr->sctx, &client->sctx);
- result = isc_task_create(mgr->taskmgr, 20, &client->task);
- if (result != ISC_R_SUCCESS) {
- goto cleanup;
- }
+ get_clienttask(mgr, &client->task);
+
result = dns_message_create(client->mctx,
DNS_MESSAGE_INTENTPARSE,
&client->message);
if (manager->excl != NULL)
isc_task_detach(&manager->excl);
- for (i = 0; i < CLIENT_NTASKS; i++) {
+ for (i = 0; i < manager->ncpus * CLIENT_NTASKS_PERCPU; i++) {
if (manager->taskpool[i] != NULL) {
isc_task_detach(&manager->taskpool[i]);
}
}
isc_mem_put(manager->mctx, manager->taskpool,
- CLIENT_NTASKS * sizeof(isc_task_t *));
+ manager->ncpus * CLIENT_NTASKS_PERCPU *
+ sizeof(isc_task_t *));
ns_server_detach(&manager->sctx);
isc_mem_put(manager->mctx, manager, sizeof(*manager));
manager->mctx = mctx;
manager->taskmgr = taskmgr;
manager->timermgr = timermgr;
+ manager->ncpus = ncpus;
ns_interface_attach(interface, &manager->interface);
manager->exiting = false;
- manager->taskpool =
- isc_mem_get(mctx, CLIENT_NTASKS*sizeof(isc_task_t *));
- for (i = 0; i < CLIENT_NTASKS; i++) {
+ int ntasks = CLIENT_NTASKS_PERCPU * manager->ncpus;
+ manager->taskpool = isc_mem_get(mctx, ntasks * sizeof(isc_task_t *));
+ for (i = 0; i < ntasks; i++) {
manager->taskpool[i] = NULL;
- isc_task_create(manager->taskmgr, 20, &manager->taskpool[i]);
+ result = isc_task_create_bound(manager->taskmgr, 20,
+ &manager->taskpool[i],
+ i % CLIENT_NTASKS_PERCPU);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
}
isc_refcount_init(&manager->references, 1);
manager->sctx = NULL;
ISC_LIST_INIT(manager->recursing);
- manager->ncpus = ncpus;
npools = CLIENT_NMCTXS_PERCPU * manager->ncpus;
manager->mctxpool = isc_mem_get(manager->mctx,
npools * sizeof(isc_mem_t*));