blob: 8133124cf3bb793ac0c3a61229a31c9083b21d2b [file] [log] [blame]
Darrick J. Wong40786712019-07-03 07:33:26 -07001/* 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
9struct xfs_pwork;
10struct xfs_mount;
11
12typedef int (*xfs_pwork_work_fn)(struct xfs_mount *mp, struct xfs_pwork *pwork);
13
14/*
15 * Parallel work coordination structure.
16 */
17struct xfs_pwork_ctl {
18 struct workqueue_struct *wq;
19 struct xfs_mount *mp;
20 xfs_pwork_work_fn work_fn;
Darrick J. Wong3e5a4282019-07-03 07:33:27 -070021 struct wait_queue_head poll_wait;
22 atomic_t nr_work;
Darrick J. Wong40786712019-07-03 07:33:26 -070023 int error;
24};
25
26/*
27 * Embed this parallel work control item inside your own work structure,
28 * then queue work with it.
29 */
30struct 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? */
38static inline bool
39xfs_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? */
46static inline bool
47xfs_pwork_want_abort(
48 struct xfs_pwork *pwork)
49{
50 return xfs_pwork_ctl_want_abort(pwork->pctl);
51}
52
53int 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);
56void xfs_pwork_queue(struct xfs_pwork_ctl *pctl, struct xfs_pwork *pwork);
57int xfs_pwork_destroy(struct xfs_pwork_ctl *pctl);
Darrick J. Wong3e5a4282019-07-03 07:33:27 -070058void xfs_pwork_poll(struct xfs_pwork_ctl *pctl);
Darrick J. Wong40786712019-07-03 07:33:26 -070059unsigned int xfs_pwork_guess_datadev_parallelism(struct xfs_mount *mp);
60
61#endif /* __XFS_PWORK_H__ */