1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * Copyright (C) 2019 Oracle. All Rights Reserved. 4 * Author: Darrick J. Wong <darrick.wong@oracle.com> 5 */ 6 #ifndef __XFS_PWORK_H__ 7 #define __XFS_PWORK_H__ 8 9 struct xfs_pwork; 10 struct xfs_mount; 11 12 typedef int (*xfs_pwork_work_fn)(struct xfs_mount *mp, struct xfs_pwork *pwork); 13 14 /* 15 * Parallel work coordination structure. 16 */ 17 struct xfs_pwork_ctl { 18 struct workqueue_struct *wq; 19 struct xfs_mount *mp; 20 xfs_pwork_work_fn work_fn; 21 struct wait_queue_head poll_wait; 22 atomic_t nr_work; 23 int error; 24 }; 25 26 /* 27 * Embed this parallel work control item inside your own work structure, 28 * then queue work with it. 29 */ 30 struct xfs_pwork { 31 struct work_struct work; 32 struct xfs_pwork_ctl *pctl; 33 }; 34 35 #define XFS_PWORK_SINGLE_THREADED { .pctl = NULL } 36 37 /* Have we been told to abort? */ 38 static inline bool 39 xfs_pwork_ctl_want_abort( 40 struct xfs_pwork_ctl *pctl) 41 { 42 return pctl && pctl->error; 43 } 44 45 /* Have we been told to abort? */ 46 static inline bool 47 xfs_pwork_want_abort( 48 struct xfs_pwork *pwork) 49 { 50 return xfs_pwork_ctl_want_abort(pwork->pctl); 51 } 52 53 int xfs_pwork_init(struct xfs_mount *mp, struct xfs_pwork_ctl *pctl, 54 xfs_pwork_work_fn work_fn, const char *tag, 55 unsigned int nr_threads); 56 void xfs_pwork_queue(struct xfs_pwork_ctl *pctl, struct xfs_pwork *pwork); 57 int xfs_pwork_destroy(struct xfs_pwork_ctl *pctl); 58 void xfs_pwork_poll(struct xfs_pwork_ctl *pctl); 59 unsigned int xfs_pwork_guess_datadev_parallelism(struct xfs_mount *mp); 60 61 #endif /* __XFS_PWORK_H__ */ 62