Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset b4df8db in mainline


Ignore:
Timestamp:
2013-03-11T19:48:41Z (9 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master
Children:
623bab8f
Parents:
e4d96e9
Message:

Allow user-specified fibril stack sizes.

  • Let the interrupt fibrils in the i8042 task use small stacks.
Location:
uspace
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/char/i8042/main.c

    re4d96e9 rb4df8db  
    3636
    3737#include <libarch/inttypes.h>
     38#include <libarch/config.h>
    3839#include <ddf/driver.h>
    3940#include <device/hw_res_parsed.h>
     
    4243#include <ddf/log.h>
    4344#include <stdio.h>
     45#include <async.h>
    4446#include "i8042.h"
    4547
     
    152154        printf("%s: HelenOS PS/2 driver.\n", NAME);
    153155        ddf_log_init(NAME);
     156       
     157        /*
     158         * Alleviate the virtual memory / page table pressure caused by
     159         * interrupt storms when the default large stacks are used.
     160         */
     161        async_set_interrupt_handler_stack_size(PAGE_SIZE);
     162
    154163        return ddf_driver_main(&i8042_driver);
    155164}
  • uspace/lib/c/generic/async.c

    re4d96e9 rb4df8db  
    350350static async_client_conn_t client_connection = default_client_connection;
    351351static async_interrupt_handler_t interrupt_received = default_interrupt_received;
     352static size_t interrupt_handler_stksz = (size_t) -1;
    352353
    353354/** Setter for client_connection function pointer.
     
    370371{
    371372        interrupt_received = intr;
     373}
     374
     375/** Set the stack size for the interrupt handler notification fibrils.
     376 *
     377 * @param size Stack size. Use -1 to use the system default stack size.
     378 */
     379void async_set_interrupt_handler_stack_size(size_t size)
     380{
     381        interrupt_handler_stksz = size;
    372382}
    373383
     
    587597        msg->call = *call;
    588598       
    589         fid_t fid = fibril_create(notification_fibril, msg);
     599        fid_t fid = fibril_create_generic(notification_fibril, msg,
     600            interrupt_handler_stksz);
    590601        if (fid == 0) {
    591602                free(msg);
  • uspace/lib/c/generic/fibril.c

    re4d96e9 rb4df8db  
    256256 * @param func Implementing function of the new fibril.
    257257 * @param arg Argument to pass to func.
     258 * @param stksz Stack size, -1 for the system default stack size.
    258259 *
    259260 * @return 0 on failure or TLS of the new fibril.
    260261 *
    261262 */
    262 fid_t fibril_create(int (*func)(void *), void *arg)
     263fid_t fibril_create_generic(int (*func)(void *), void *arg, size_t stksz)
    263264{
    264265        fibril_t *fibril;
     
    268269                return 0;
    269270       
    270         size_t stack_size = stack_size_get();
     271        size_t stack_size = (stksz == (size_t) -1) ? stack_size_get() : stksz;
    271272        fibril->stack = as_area_create((void *) -1, stack_size,
    272273            AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE | AS_AREA_GUARD |
  • uspace/lib/c/include/async.h

    re4d96e9 rb4df8db  
    156156extern void async_set_client_connection(async_client_conn_t);
    157157extern void async_set_interrupt_received(async_interrupt_handler_t);
     158extern void async_set_interrupt_handler_stack_size(size_t);
    158159
    159160/*
  • uspace/lib/c/include/fibril.h

    re4d96e9 rb4df8db  
    8686extern void context_restore(context_t *ctx) __attribute__((noreturn));
    8787
    88 extern fid_t fibril_create(int (*func)(void *), void *arg);
     88#define fibril_create(func, arg) \
     89        fibril_create_generic((func), (arg), (size_t) -1)
     90extern fid_t fibril_create_generic(int (*func)(void *), void *arg, size_t);
    8991extern void fibril_destroy(fid_t fid);
    9092extern fibril_t *fibril_setup(void);
Note: See TracChangeset for help on using the changeset viewer.