1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. 4*4882a593Smuzhiyun * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #ifndef RXE_TASK_H 8*4882a593Smuzhiyun #define RXE_TASK_H 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun enum { 11*4882a593Smuzhiyun TASK_STATE_START = 0, 12*4882a593Smuzhiyun TASK_STATE_BUSY = 1, 13*4882a593Smuzhiyun TASK_STATE_ARMED = 2, 14*4882a593Smuzhiyun }; 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun /* 17*4882a593Smuzhiyun * data structure to describe a 'task' which is a short 18*4882a593Smuzhiyun * function that returns 0 as long as it needs to be 19*4882a593Smuzhiyun * called again. 20*4882a593Smuzhiyun */ 21*4882a593Smuzhiyun struct rxe_task { 22*4882a593Smuzhiyun void *obj; 23*4882a593Smuzhiyun struct tasklet_struct tasklet; 24*4882a593Smuzhiyun int state; 25*4882a593Smuzhiyun spinlock_t state_lock; /* spinlock for task state */ 26*4882a593Smuzhiyun void *arg; 27*4882a593Smuzhiyun int (*func)(void *arg); 28*4882a593Smuzhiyun int ret; 29*4882a593Smuzhiyun char name[16]; 30*4882a593Smuzhiyun bool destroyed; 31*4882a593Smuzhiyun }; 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /* 34*4882a593Smuzhiyun * init rxe_task structure 35*4882a593Smuzhiyun * arg => parameter to pass to fcn 36*4882a593Smuzhiyun * func => function to call until it returns != 0 37*4882a593Smuzhiyun */ 38*4882a593Smuzhiyun int rxe_init_task(void *obj, struct rxe_task *task, 39*4882a593Smuzhiyun void *arg, int (*func)(void *), char *name); 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun /* cleanup task */ 42*4882a593Smuzhiyun void rxe_cleanup_task(struct rxe_task *task); 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun /* 45*4882a593Smuzhiyun * raw call to func in loop without any checking 46*4882a593Smuzhiyun * can call when tasklets are disabled 47*4882a593Smuzhiyun */ 48*4882a593Smuzhiyun int __rxe_do_task(struct rxe_task *task); 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun /* 51*4882a593Smuzhiyun * common function called by any of the main tasklets 52*4882a593Smuzhiyun * If there is any chance that there is additional 53*4882a593Smuzhiyun * work to do someone must reschedule the task before 54*4882a593Smuzhiyun * leaving 55*4882a593Smuzhiyun */ 56*4882a593Smuzhiyun void rxe_do_task(struct tasklet_struct *t); 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun /* run a task, else schedule it to run as a tasklet, The decision 59*4882a593Smuzhiyun * to run or schedule tasklet is based on the parameter sched. 60*4882a593Smuzhiyun */ 61*4882a593Smuzhiyun void rxe_run_task(struct rxe_task *task, int sched); 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun /* keep a task from scheduling */ 64*4882a593Smuzhiyun void rxe_disable_task(struct rxe_task *task); 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun /* allow task to run */ 67*4882a593Smuzhiyun void rxe_enable_task(struct rxe_task *task); 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun #endif /* RXE_TASK_H */ 70