aboutsummaryrefslogtreecommitdiffstats
path: root/litmus/ikglp_lock.c
diff options
context:
space:
mode:
Diffstat (limited to 'litmus/ikglp_lock.c')
-rw-r--r--litmus/ikglp_lock.c39
1 files changed, 31 insertions, 8 deletions
diff --git a/litmus/ikglp_lock.c b/litmus/ikglp_lock.c
index 023443014d4b..83b708ab85cb 100644
--- a/litmus/ikglp_lock.c
+++ b/litmus/ikglp_lock.c
@@ -1346,6 +1346,10 @@ int ikglp_unlock(struct litmus_lock* l)
1346#ifdef CONFIG_LITMUS_AFFINITY_LOCKING 1346#ifdef CONFIG_LITMUS_AFFINITY_LOCKING
1347 if(sem->aff_obs && sem->aff_obs->relax_max_fifo_len) { 1347 if(sem->aff_obs && sem->aff_obs->relax_max_fifo_len) {
1348 fq_of_new_on_fq = sem->aff_obs->ops->advise_enqueue(sem->aff_obs, new_on_fq); 1348 fq_of_new_on_fq = sem->aff_obs->ops->advise_enqueue(sem->aff_obs, new_on_fq);
1349 if(fq_of_new_on_fq->count == 0) {
1350 // ignore it?
1351// fq_of_new_on_fq = fq;
1352 }
1349 } 1353 }
1350 else { 1354 else {
1351 fq_of_new_on_fq = fq; 1355 fq_of_new_on_fq = fq;
@@ -1383,6 +1387,10 @@ int ikglp_unlock(struct litmus_lock* l)
1383#ifdef CONFIG_LITMUS_AFFINITY_LOCKING 1387#ifdef CONFIG_LITMUS_AFFINITY_LOCKING
1384 if(sem->aff_obs && sem->aff_obs->relax_max_fifo_len) { 1388 if(sem->aff_obs && sem->aff_obs->relax_max_fifo_len) {
1385 fq_of_new_on_fq = sem->aff_obs->ops->advise_enqueue(sem->aff_obs, new_on_fq); 1389 fq_of_new_on_fq = sem->aff_obs->ops->advise_enqueue(sem->aff_obs, new_on_fq);
1390 if(fq_of_new_on_fq->count == 0) {
1391 // ignore it?
1392// fq_of_new_on_fq = fq;
1393 }
1386 } 1394 }
1387 else { 1395 else {
1388 fq_of_new_on_fq = fq; 1396 fq_of_new_on_fq = fq;
@@ -1409,6 +1417,10 @@ int ikglp_unlock(struct litmus_lock* l)
1409#ifdef CONFIG_LITMUS_AFFINITY_LOCKING 1417#ifdef CONFIG_LITMUS_AFFINITY_LOCKING
1410 if(sem->aff_obs && sem->aff_obs->relax_max_fifo_len) { 1418 if(sem->aff_obs && sem->aff_obs->relax_max_fifo_len) {
1411 fq_of_new_on_fq = sem->aff_obs->ops->advise_enqueue(sem->aff_obs, new_on_fq); 1419 fq_of_new_on_fq = sem->aff_obs->ops->advise_enqueue(sem->aff_obs, new_on_fq);
1420 if(fq_of_new_on_fq->count == 0) {
1421 // ignore it?
1422// fq_of_new_on_fq = fq;
1423 }
1412 } 1424 }
1413 else { 1425 else {
1414 fq_of_new_on_fq = fq; 1426 fq_of_new_on_fq = fq;
@@ -1569,7 +1581,7 @@ int ikglp_unlock(struct litmus_lock* l)
1569 } 1581 }
1570 } 1582 }
1571 1583
1572 1584wake_kludge:
1573 if(waitqueue_active(&fq->wait)) 1585 if(waitqueue_active(&fq->wait))
1574 { 1586 {
1575 wait_queue_t *wait = list_entry(fq->wait.task_list.next, wait_queue_t, task_list); 1587 wait_queue_t *wait = list_entry(fq->wait.task_list.next, wait_queue_t, task_list);
@@ -1672,6 +1684,16 @@ int ikglp_unlock(struct litmus_lock* l)
1672 // wake up the new resource holder! 1684 // wake up the new resource holder!
1673 wake_up_process(next); 1685 wake_up_process(next);
1674 } 1686 }
1687 if(fq_of_new_on_fq && fq_of_new_on_fq != fq && fq_of_new_on_fq->count == 1) {
1688 // The guy we promoted when to an empty FQ. (Why didn't stealing pick this up?)
1689 // Wake up the new guy too.
1690
1691 BUG_ON(fq_of_new_on_fq->owner != NULL);
1692
1693 fq = fq_of_new_on_fq;
1694 fq_of_new_on_fq = NULL;
1695 goto wake_kludge;
1696 }
1675 1697
1676 unlock_fine_irqrestore(&sem->lock, flags); 1698 unlock_fine_irqrestore(&sem->lock, flags);
1677 unlock_global_irqrestore(dgl_lock, flags); 1699 unlock_global_irqrestore(dgl_lock, flags);
@@ -1917,7 +1939,7 @@ static struct affinity_observer* ikglp_aff_obs_new(struct affinity_observer_ops*
1917 if(aff_args.nr_simult_users > NV_MAX_SIMULT_USERS) { 1939 if(aff_args.nr_simult_users > NV_MAX_SIMULT_USERS) {
1918 TRACE_CUR("System does not support #simult_users > %d. %d requested.\n", 1940 TRACE_CUR("System does not support #simult_users > %d. %d requested.\n",
1919 NV_MAX_SIMULT_USERS, aff_args.nr_simult_users); 1941 NV_MAX_SIMULT_USERS, aff_args.nr_simult_users);
1920 return(NULL); 1942// return(NULL);
1921 } 1943 }
1922 1944
1923 ikglp_aff = kmalloc(sizeof(*ikglp_aff), GFP_KERNEL); 1945 ikglp_aff = kmalloc(sizeof(*ikglp_aff), GFP_KERNEL);
@@ -2600,8 +2622,8 @@ void gpu_ikglp_notify_acquired(struct ikglp_affinity* aff,
2600 2622
2601 tsk_rt(t)->gpu_migration = gpu_migration_distance(tsk_rt(t)->last_gpu, gpu); // record the type of migration 2623 tsk_rt(t)->gpu_migration = gpu_migration_distance(tsk_rt(t)->last_gpu, gpu); // record the type of migration
2602 2624
2603 TRACE_CUR("%s/%d acquired gpu %d. migration type = %d\n", 2625 TRACE_CUR("%s/%d acquired gpu %d (prev = %d). migration type = %d\n",
2604 t->comm, t->pid, gpu, tsk_rt(t)->gpu_migration); 2626 t->comm, t->pid, gpu, tsk_rt(t)->last_gpu, tsk_rt(t)->gpu_migration);
2605 2627
2606 // count the number or resource holders 2628 // count the number or resource holders
2607 ++(*(aff->q_info[replica].nr_cur_users)); 2629 ++(*(aff->q_info[replica].nr_cur_users));
@@ -2626,8 +2648,6 @@ void gpu_ikglp_notify_freed(struct ikglp_affinity* aff,
2626 2648
2627 est_time = get_gpu_estimate(t, gpu_migration_distance(tsk_rt(t)->last_gpu, gpu)); 2649 est_time = get_gpu_estimate(t, gpu_migration_distance(tsk_rt(t)->last_gpu, gpu));
2628 2650
2629 tsk_rt(t)->last_gpu = gpu;
2630
2631 // count the number or resource holders 2651 // count the number or resource holders
2632 --(*(aff->q_info[replica].nr_cur_users)); 2652 --(*(aff->q_info[replica].nr_cur_users));
2633 2653
@@ -2636,12 +2656,15 @@ void gpu_ikglp_notify_freed(struct ikglp_affinity* aff,
2636 // update estimates 2656 // update estimates
2637 update_gpu_estimate(t, get_gpu_time(t)); 2657 update_gpu_estimate(t, get_gpu_time(t));
2638 2658
2639 TRACE_CUR("%s/%d freed gpu %d. actual time was %llu. " 2659 TRACE_CUR("%s/%d freed gpu %d (prev = %d). mig type = %d. actual time was %llu. "
2640 "estimated was %llu. diff is %d\n", 2660 "estimated was %llu. diff is %d\n",
2641 t->comm, t->pid, gpu, 2661 t->comm, t->pid, gpu, tsk_rt(t)->last_gpu,
2662 tsk_rt(t)->gpu_migration,
2642 get_gpu_time(t), 2663 get_gpu_time(t),
2643 est_time, 2664 est_time,
2644 (long long)get_gpu_time(t) - (long long)est_time); 2665 (long long)get_gpu_time(t) - (long long)est_time);
2666
2667 tsk_rt(t)->last_gpu = gpu;
2645} 2668}
2646 2669
2647struct ikglp_affinity_ops gpu_ikglp_affinity = 2670struct ikglp_affinity_ops gpu_ikglp_affinity =