Changes in / [5174c62:b9eb93f] in mainline
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/include/ipc/ipc.h
r5174c62 rb9eb93f 43 43 #define IPC_CALL_LEN 6 44 44 45 /** Maximum active async calls per phone */ 46 #define IPC_MAX_ASYNC_CALLS 4 45 /** Maximum active async calls per thread */ 46 #ifdef CONFIG_DEBUG 47 #define IPC_MAX_ASYNC_CALLS 16 48 #else 49 #define IPC_MAX_ASYNC_CALLS 4000 50 #endif 47 51 48 52 /* Flags for calls */ -
kernel/generic/include/proc/task.h
r5174c62 rb9eb93f 93 93 phone_t phones[IPC_MAX_PHONES]; 94 94 stats_ipc_t ipc_info; /**< IPC statistics */ 95 /** 96 * Active asynchronous messages. It is used for limiting uspace to 97 * certain extent. 98 */ 99 atomic_t active_calls; 95 100 /** List of synchronous answerboxes. */ 96 101 link_t sync_box_head; -
kernel/generic/src/ipc/ipc.c
r5174c62 rb9eb93f 655 655 (call->flags & IPC_CALL_NOTIF)); 656 656 657 /* 658 * Record the receipt of this call in the current task's counter 659 * of active calls. IPC_M_PHONE_HUNGUP calls do not contribute 660 * to this counter so do not record answers to them either. 661 */ 662 if (!(call->flags & IPC_CALL_DISCARD_ANSWER)) 663 atomic_dec(&TASK->active_calls); 664 657 665 ipc_call_free(call); 658 666 } -
kernel/generic/src/ipc/sysipc.c
r5174c62 rb9eb93f 644 644 } 645 645 646 /** Check that the task did not exceed the allowed limit of asynchronous calls 647 * made over a phone. 648 * 649 * @param phone Phone to check the limit against. 646 /** Check that the task did not exceed the allowed limit of asynchronous calls. 647 * 650 648 * @return 0 if limit not reached or -1 if limit exceeded. 651 649 * 652 650 */ 653 static int check_call_limit(phone_t *phone) 654 { 655 if (atomic_get(&phone->active_calls) >= IPC_MAX_ASYNC_CALLS) 651 static int check_call_limit(void) 652 { 653 if (atomic_preinc(&TASK->active_calls) > IPC_MAX_ASYNC_CALLS) { 654 atomic_dec(&TASK->active_calls); 656 655 return -1; 656 } 657 657 658 658 return 0; … … 680 680 unative_t arg1, unative_t arg2, unative_t arg3, unative_t arg4) 681 681 { 682 if (check_call_limit()) 683 return IPC_CALLRET_TEMPORARY; 684 682 685 phone_t *phone; 683 686 if (phone_get(phoneid, &phone) != EOK) 684 687 return IPC_CALLRET_FATAL; 685 686 if (check_call_limit(phone))687 return IPC_CALLRET_TEMPORARY;688 688 689 689 call_t *call = ipc_call_alloc(0); … … 720 720 unative_t sys_ipc_call_async_slow(unative_t phoneid, ipc_data_t *data) 721 721 { 722 if (check_call_limit()) 723 return IPC_CALLRET_TEMPORARY; 724 722 725 phone_t *phone; 723 726 if (phone_get(phoneid, &phone) != EOK) 724 727 return IPC_CALLRET_FATAL; 725 726 if (check_call_limit(phone))727 return IPC_CALLRET_TEMPORARY;728 728 729 729 call_t *call = ipc_call_alloc(0); … … 1046 1046 ipc_call_free(call); 1047 1047 goto restart; 1048 } else { 1049 /* 1050 * Decrement the counter of active calls only if the 1051 * call is not an answer to IPC_M_PHONE_HUNGUP, 1052 * which doesn't contribute to the counter. 1053 */ 1054 atomic_dec(&TASK->active_calls); 1048 1055 } 1049 1056 -
kernel/generic/src/proc/task.c
r5174c62 rb9eb93f 151 151 atomic_set(&task->refcount, 0); 152 152 atomic_set(&task->lifecount, 0); 153 atomic_set(&task->active_calls, 0); 153 154 154 155 irq_spinlock_initialize(&task->lock, "task_t_lock"); … … 477 478 #ifdef __32_BITS__ 478 479 if (*additional) 479 printf("%-8" PRIu64 " %9" PRIua , task->taskid,480 atomic_get(&task->refcount) );480 printf("%-8" PRIu64 " %9" PRIua " %7" PRIua, task->taskid, 481 atomic_get(&task->refcount), atomic_get(&task->active_calls)); 481 482 else 482 483 printf("%-8" PRIu64 " %-14s %-5" PRIu32 " %10p %10p" … … 489 490 if (*additional) 490 491 printf("%-8" PRIu64 " %9" PRIu64 "%c %9" PRIu64 "%c " 491 "%9" PRIua, task->taskid, ucycles, usuffix, kcycles, 492 ksuffix, atomic_get(&task->refcount)); 492 "%9" PRIua " %7" PRIua, 493 task->taskid, ucycles, usuffix, kcycles, ksuffix, 494 atomic_get(&task->refcount), atomic_get(&task->active_calls)); 493 495 else 494 496 printf("%-8" PRIu64 " %-14s %-5" PRIu32 " %18p %18p\n", -
uspace/srv/devman/devman.c
r5174c62 rb9eb93f 686 686 } 687 687 688 static FIBRIL_MUTEX_INITIALIZE(add_device_guard); 689 688 690 /** Pass a device to running driver. 689 691 * … … 693 695 void add_device(int phone, driver_t *drv, node_t *node, dev_tree_t *tree) 694 696 { 697 fibril_mutex_lock(&add_device_guard); 698 695 699 /* 696 700 * We do not expect to have driver's mutex locked as we do not … … 723 727 /* Wait for answer from the driver. */ 724 728 async_wait_for(req, &rc); 729 730 fibril_mutex_unlock(&add_device_guard); 725 731 726 732 switch(rc) {
Note:
See TracChangeset
for help on using the changeset viewer.