Changeset 436a0a5 in mainline for kernel/generic/src/ipc


Ignore:
Timestamp:
2018-11-09T22:04:01Z (7 years ago)
Author:
Jiří Zárevúcky <zarevucky.jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
95d45482
Parents:
88e43bc (diff), abf6c01 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

(merge) Reduce the number of blocking allocations in the kernel

Location:
kernel/generic/src/ipc
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/ipc/event.c

    r88e43bc r436a0a5  
    147147        if (event->answerbox != NULL) {
    148148                if (!event->masked) {
    149                         call_t *call = ipc_call_alloc(FRAME_ATOMIC);
     149                        call_t *call = ipc_call_alloc();
    150150
    151151                        if (call) {
  • kernel/generic/src/ipc/ipc.c

    r88e43bc r436a0a5  
    108108 * TASK->answerbox.
    109109 *
    110  * @param flags Parameters for slab_alloc (e.g FRAME_ATOMIC).
    111  *
    112  * @return If flags permit it, return NULL, or initialized kernel
    113  *         call structure with one reference.
    114  *
    115  */
    116 call_t *ipc_call_alloc(unsigned int flags)
    117 {
    118         call_t *call = slab_alloc(call_cache, flags);
     110 * @return Initialized kernel call structure with one reference, or NULL.
     111 *
     112 */
     113call_t *ipc_call_alloc(void)
     114{
     115        // TODO: Allocate call and kobject in single allocation
     116
     117        call_t *call = slab_alloc(call_cache, FRAME_ATOMIC);
    119118        if (!call)
    120119                return NULL;
    121120
    122         kobject_t *kobj;
    123         if (flags & FRAME_ATOMIC)
    124                 kobj = (kobject_t *) malloc(sizeof(kobject_t));
    125         else
    126                 kobj = (kobject_t *) nfmalloc(sizeof(kobject_t));
    127 
     121        kobject_t *kobj = (kobject_t *) malloc(sizeof(kobject_t));
    128122        if (!kobj) {
    129123                slab_free(call_cache, call);
     
    219213errno_t ipc_call_sync(phone_t *phone, call_t *request)
    220214{
    221         answerbox_t *mybox = slab_alloc(answerbox_cache, 0);
     215        answerbox_t *mybox = slab_alloc(answerbox_cache, FRAME_ATOMIC);
     216        if (!mybox)
     217                return ENOMEM;
     218
    222219        ipc_answerbox_init(mybox, TASK);
    223220
     
    483480                kobject_put(phone->kobject);
    484481
    485                 call_t *call = ipc_call_alloc(0);
     482                call_t *call = phone->hangup_call;
     483                phone->hangup_call = NULL;
     484                assert(call);
     485
    486486                IPC_SET_IMETHOD(call->data, IPC_M_PHONE_HUNGUP);
    487487                call->request_method = IPC_M_PHONE_HUNGUP;
     
    685685                         * to exist as soon as we release it.
    686686                         */
    687                         call_t *call = ipc_call_alloc(0);
     687                        call_t *call = phone->hangup_call;
     688                        phone->hangup_call = NULL;
     689                        assert(call);
     690
    688691                        IPC_SET_IMETHOD(call->data, IPC_M_PHONE_HUNGUP);
    689692                        call->request_method = IPC_M_PHONE_HUNGUP;
  • kernel/generic/src/ipc/ipcrsc.c

    r88e43bc r436a0a5  
    4646{
    4747        phone_t *phone = (phone_t *) arg;
     48        if (phone->hangup_call)
     49                kobject_put(phone->hangup_call->kobject);
    4850        slab_free(phone_cache, phone);
    4951}
     
    7981                        return ENOMEM;
    8082                }
     83                call_t *hcall = ipc_call_alloc();
     84                if (!hcall) {
     85                        cap_free(TASK, handle);
     86                        slab_free(phone_cache, phone);
     87                        free(kobj);
     88                        return ENOMEM;
     89                }
    8190
    8291                ipc_phone_init(phone, task);
    8392                phone->state = IPC_PHONE_CONNECTING;
     93                phone->hangup_call = hcall;
    8494
    8595                kobject_initialize(kobj, KOBJECT_TYPE_PHONE, phone,
  • kernel/generic/src/ipc/irq.c

    r88e43bc r436a0a5  
    529529
    530530        if (irq->notif_cfg.answerbox) {
    531                 call_t *call = ipc_call_alloc(FRAME_ATOMIC);
     531                call_t *call = ipc_call_alloc();
    532532                if (!call)
    533533                        return;
     
    565565
    566566        if (irq->notif_cfg.answerbox) {
    567                 call_t *call = ipc_call_alloc(FRAME_ATOMIC);
     567                call_t *call = ipc_call_alloc();
    568568                if (!call) {
    569569                        irq_spinlock_unlock(&irq->lock, true);
  • kernel/generic/src/ipc/sysipc.c

    r88e43bc r436a0a5  
    267267 * @return EOK on success.
    268268 * @return ENOENT if there is no such phone handle.
     269 * @return ENOMEM if not enough memory to make the call
    269270 *
    270271 */
     
    276277                return ENOENT;
    277278
    278         call_t *call = ipc_call_alloc(0);
     279        call_t *call = ipc_call_alloc();
     280        if (!call) {
     281                kobject_put(kobj);
     282                return ENOMEM;
     283        }
     284
    279285        call->priv = priv;
    280286        memcpy(call->data.args, data->args, sizeof(data->args));
     
    373379        }
    374380
    375         call_t *call = ipc_call_alloc(0);
     381        call_t *call = ipc_call_alloc();
     382        if (!call) {
     383                kobject_put(kobj);
     384                return ENOMEM;
     385        }
     386
    376387        IPC_SET_IMETHOD(call->data, imethod);
    377388        IPC_SET_ARG1(call->data, arg1);
     
    420431        }
    421432
    422         call_t *call = ipc_call_alloc(0);
     433        call_t *call = ipc_call_alloc();
     434        if (!call) {
     435                kobject_put(kobj);
     436                return ENOMEM;
     437        }
     438
    423439        errno_t rc = copy_from_uspace(&call->data.args, &data->args,
    424440            sizeof(call->data.args));
Note: See TracChangeset for help on using the changeset viewer.