Previously steam_open.cocci was treating only wait_event_.* - e.g.
wait_event_interruptible - as a blocking operation. However e.g.
wait_for_completion_interruptible is also blocking, and so from this
point of view it would be more logical to treat all wait_.* as a
blocking point.
The logic of this change actually came up for real when
drivers/pci/switch/switchtec.c changed from using
wait_event_interruptible to wait_for_completion_interruptible:
https://lore.kernel.org/linux-pci/[email protected]/
https://lore.kernel.org/linux-pci/[email protected]/
https://lore.kernel.org/linux-pci/[email protected]/
For a driver that uses nonseekable_open with read/write having stream
semantic and read also calling e.g. wait_for_completion_interruptible,
running stream_open.cocci before this patch would produce:
WARNING: <driver>_fops: .read() and .write() have stream semantic; safe to change nonseekable_open -> stream_open.
while after this patch it will report:
ERROR: <driver>_fops: .read() can deadlock .write(); change nonseekable_open -> stream_open to fix.
Cc: Julia Lawall <[email protected]>
Cc: Logan Gunthorpe <[email protected]>
Cc: Sebastian Andrzej Siewior <[email protected]>
Cc: Bjorn Helgaas <[email protected]>
Signed-off-by: Kirill Smelkov <[email protected]>
---
scripts/coccinelle/api/stream_open.cocci | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/scripts/coccinelle/api/stream_open.cocci b/scripts/coccinelle/api/stream_open.cocci
index 350145da7669..12ce18fa6b74 100644
--- a/scripts/coccinelle/api/stream_open.cocci
+++ b/scripts/coccinelle/api/stream_open.cocci
@@ -35,11 +35,11 @@ type loff_t;
// a function that blocks
@ blocks @
identifier block_f;
-identifier wait_event =~ "^wait_event_.*";
+identifier wait =~ "^wait_.*";
@@
block_f(...) {
... when exists
- wait_event(...)
+ wait(...)
... when exists
}
@@ -49,12 +49,12 @@ identifier wait_event =~ "^wait_event_.*";
// XXX currently reader_blocks supports only direct and 1-level indirect cases.
@ reader_blocks_direct @
identifier stream_reader.readstream;
-identifier wait_event =~ "^wait_event_.*";
+identifier wait =~ "^wait_.*";
@@
readstream(...)
{
... when exists
- wait_event(...)
+ wait(...)
... when exists
}
--
2.20.1
This patch continues 10dce8af3422 (fs: stream_open - opener for
stream-like files so that read and write can run simultaneously without
deadlock) and c5bf68fe0c86 (*: convert stream-like files from
nonseekable_open -> stream_open) and teaches steam_open.cocci to
consider files as being stream-like not only if they have
.llseek=no_llseek, but also if they have .llseek=noop_llseek.
This is safe to do: the comment about noop_llseek says
This is an implementation of ->llseek useable for the rare special case when
userspace expects the seek to succeed but the (device) file is actually not
able to perform the seek. In this case you use noop_llseek() instead of
falling back to the default implementation of ->llseek.
and in general noop_llseek was massively added to drivers in 6038f373a3dc
(llseek: automatically add .llseek fop) when changing default for NULL .llseek
from NOP to no_llseek with the idea to avoid breaking compatibility, if
maybe some user-space program was using lseek on a device without caring
about the result, but caring if it was an error or not.
Amended semantic patch produces two changes when applied tree-wide:
drivers/hid/hid-sensor-custom.c:690:8-24: WARNING: hid_sensor_custom_fops: .read() has stream semantic; safe to change nonseekable_open -> stream_open.
drivers/input/mousedev.c:564:1-17: ERROR: mousedev_fops: .read() can deadlock .write(); change nonseekable_open -> stream_open to fix.
Cc: Julia Lawall <[email protected]>
Cc: Jan Blunck <[email protected]>
Cc: Arnd Bergmann <[email protected]>
Cc: Jiri Kosina <[email protected]>
Cc: Jonathan Cameron <[email protected]>
Cc: Srinivas Pandruvada <[email protected]>
Cc: Benjamin Tissoires <[email protected]>
Cc: Dmitry Torokhov <[email protected]>
Signed-off-by: Kirill Smelkov <[email protected]>
---
drivers/hid/hid-sensor-custom.c | 2 +-
drivers/input/mousedev.c | 2 +-
scripts/coccinelle/api/stream_open.cocci | 9 ++++++++-
3 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/drivers/hid/hid-sensor-custom.c b/drivers/hid/hid-sensor-custom.c
index c60f82673cf2..fb827c295842 100644
--- a/drivers/hid/hid-sensor-custom.c
+++ b/drivers/hid/hid-sensor-custom.c
@@ -687,7 +687,7 @@ static int hid_sensor_custom_open(struct inode *inode, struct file *file)
if (test_and_set_bit(0, &sensor_inst->misc_opened))
return -EBUSY;
- return nonseekable_open(inode, file);
+ return stream_open(inode, file);
}
static __poll_t hid_sensor_custom_poll(struct file *file,
diff --git a/drivers/input/mousedev.c b/drivers/input/mousedev.c
index 412fa71245af..58afd5253485 100644
--- a/drivers/input/mousedev.c
+++ b/drivers/input/mousedev.c
@@ -561,7 +561,7 @@ static int mousedev_open(struct inode *inode, struct file *file)
goto err_free_client;
file->private_data = client;
- nonseekable_open(inode, file);
+ stream_open(inode, file);
return 0;
diff --git a/scripts/coccinelle/api/stream_open.cocci b/scripts/coccinelle/api/stream_open.cocci
index 12ce18fa6b74..df00d6619b06 100644
--- a/scripts/coccinelle/api/stream_open.cocci
+++ b/scripts/coccinelle/api/stream_open.cocci
@@ -134,6 +134,13 @@ identifier fops0.fops;
.llseek = no_llseek,
};
+@ has_noop_llseek @
+identifier fops0.fops;
+@@
+ struct file_operations fops = {
+ .llseek = noop_llseek,
+ };
+
@ has_mmap @
identifier fops0.fops;
identifier mmap_f;
@@ -180,7 +187,7 @@ identifier splice_write_f;
//
// XXX for simplicity require no .{read/write}_iter and no .splice_{read/write} for now.
// XXX maybe_steam.fops cannot be used in other rules - it gives "bad rule maybe_stream or bad variable fops".
-@ maybe_stream depends on (!has_llseek || has_no_llseek) && !has_mmap && !has_copy_file_range && !has_remap_file_range && !has_read_iter && !has_write_iter && !has_splice_read && !has_splice_write @
+@ maybe_stream depends on (!has_llseek || has_no_llseek || has_noop_llseek) && !has_mmap && !has_copy_file_range && !has_remap_file_range && !has_read_iter && !has_write_iter && !has_splice_read && !has_splice_write @
identifier fops0.fops;
@@
struct file_operations fops = {
--
2.20.1
On Sun, 23 Jun 2019, Kirill Smelkov wrote:
> Previously steam_open.cocci was treating only wait_event_.* - e.g.
> wait_event_interruptible - as a blocking operation. However e.g.
> wait_for_completion_interruptible is also blocking, and so from this
> point of view it would be more logical to treat all wait_.* as a
> blocking point.
>
> The logic of this change actually came up for real when
> drivers/pci/switch/switchtec.c changed from using
> wait_event_interruptible to wait_for_completion_interruptible:
>
> https://lore.kernel.org/linux-pci/[email protected]/
> https://lore.kernel.org/linux-pci/[email protected]/
> https://lore.kernel.org/linux-pci/[email protected]/
>
> For a driver that uses nonseekable_open with read/write having stream
> semantic and read also calling e.g. wait_for_completion_interruptible,
> running stream_open.cocci before this patch would produce:
>
> WARNING: <driver>_fops: .read() and .write() have stream semantic; safe to change nonseekable_open -> stream_open.
>
> while after this patch it will report:
>
> ERROR: <driver>_fops: .read() can deadlock .write(); change nonseekable_open -> stream_open to fix.
>
> Cc: Julia Lawall <[email protected]>
> Cc: Logan Gunthorpe <[email protected]>
> Cc: Sebastian Andrzej Siewior <[email protected]>
> Cc: Bjorn Helgaas <[email protected]>
> Signed-off-by: Kirill Smelkov <[email protected]>
Acked-by: Julia Lawall <[email protected]>
> ---
> scripts/coccinelle/api/stream_open.cocci | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/scripts/coccinelle/api/stream_open.cocci b/scripts/coccinelle/api/stream_open.cocci
> index 350145da7669..12ce18fa6b74 100644
> --- a/scripts/coccinelle/api/stream_open.cocci
> +++ b/scripts/coccinelle/api/stream_open.cocci
> @@ -35,11 +35,11 @@ type loff_t;
> // a function that blocks
> @ blocks @
> identifier block_f;
> -identifier wait_event =~ "^wait_event_.*";
> +identifier wait =~ "^wait_.*";
> @@
> block_f(...) {
> ... when exists
> - wait_event(...)
> + wait(...)
> ... when exists
> }
>
> @@ -49,12 +49,12 @@ identifier wait_event =~ "^wait_event_.*";
> // XXX currently reader_blocks supports only direct and 1-level indirect cases.
> @ reader_blocks_direct @
> identifier stream_reader.readstream;
> -identifier wait_event =~ "^wait_event_.*";
> +identifier wait =~ "^wait_.*";
> @@
> readstream(...)
> {
> ... when exists
> - wait_event(...)
> + wait(...)
> ... when exists
> }
>
> --
> 2.20.1
>
On Sun, 23 Jun 2019, Kirill Smelkov wrote:
> On Sun, Jun 23, 2019 at 09:35:17AM +0200, Julia Lawall wrote:
> >
> >
> > On Sun, 23 Jun 2019, Kirill Smelkov wrote:
> >
> > > Previously steam_open.cocci was treating only wait_event_.* - e.g.
> > > wait_event_interruptible - as a blocking operation. However e.g.
> > > wait_for_completion_interruptible is also blocking, and so from this
> > > point of view it would be more logical to treat all wait_.* as a
> > > blocking point.
> > >
> > > The logic of this change actually came up for real when
> > > drivers/pci/switch/switchtec.c changed from using
> > > wait_event_interruptible to wait_for_completion_interruptible:
> > >
> > > https://lore.kernel.org/linux-pci/[email protected]/
> > > https://lore.kernel.org/linux-pci/[email protected]/
> > > https://lore.kernel.org/linux-pci/[email protected]/
> > >
> > > For a driver that uses nonseekable_open with read/write having stream
> > > semantic and read also calling e.g. wait_for_completion_interruptible,
> > > running stream_open.cocci before this patch would produce:
> > >
> > > WARNING: <driver>_fops: .read() and .write() have stream semantic; safe to change nonseekable_open -> stream_open.
> > >
> > > while after this patch it will report:
> > >
> > > ERROR: <driver>_fops: .read() can deadlock .write(); change nonseekable_open -> stream_open to fix.
> >
> > Are you really sure that every word that starts with wait_ in the Linux
> > kernel has the property you want? How many of them are there? Would it
> > be reasonable to put the names in the semantic patch explicitly?
>
> We are talking about function calls or macros here only. I think that
> by default every "wait.*()" has blocking semantic, and if there are
> something that does not block, it should be instead white-listed with
> the default still being treated as "all wait.*() blocks".
>
> Here are the list of wait functions & macros (if I read tags format
> correctly). They were generated with `grep -w d tags |grep '^wait'` and
> `grep -w f tags |grep '^wait'`. Offhand they all seem to be of blocking
> kind to me.
OK, thanks for the list.
julia
>
> Kirill
>
> Macros (64)
> -----------
>
> wait_ack_clear drivers/gpu/drm/i915/intel_uncore.c /^wait_ack_clear(const struct drm_i915_private *i915,$/;" f signature:(const struct drm_i915_private *i915, const struct intel_uncore_forcewake_domain *d, const u32 ack)
> wait_ack_set drivers/gpu/drm/i915/intel_uncore.c /^wait_ack_set(const struct drm_i915_private *i915,$/;" f signature:(const struct drm_i915_private *i915, const struct intel_uncore_forcewake_domain *d, const u32 ack)
> wait_capture_start sound/core/pcm_lib.c 2117;" d file:
> wait_capture_start sound/core/pcm_lib.c 2119;" d file:
> wait_event include/linux/wait.h 286;" d
> wait_event_cmd include/linux/wait.h 416;" d
> wait_event_exclusive_cmd include/linux/wait.h 391;" d
> wait_event_freezable include/linux/wait.h 325;" d
> wait_event_freezable_exclusive include/linux/wait.h 593;" d
> wait_event_freezable_timeout include/linux/wait.h 376;" d
> wait_event_freezekillable_unsafe include/linux/freezer.h 251;" d
> wait_event_freezekillable_unsafe include/linux/freezer.h 297;" d
> wait_event_hrtimeout include/linux/wait.h 526;" d
> wait_event_idle include/linux/wait.h 615;" d
> wait_event_idle_exclusive include/linux/wait.h 639;" d
> wait_event_idle_exclusive_timeout include/linux/wait.h 707;" d
> wait_event_idle_timeout include/linux/wait.h 670;" d
> wait_event_interruptible include/linux/wait.h 442;" d
> wait_event_interruptible_exclusive include/linux/wait.h 566;" d
> wait_event_interruptible_exclusive_locked include/linux/wait.h 817;" d
> wait_event_interruptible_exclusive_locked_irq include/linux/wait.h 848;" d
> wait_event_interruptible_hrtimeout include/linux/wait.h 552;" d
> wait_event_interruptible_lock_irq include/linux/wait.h 1046;" d
> wait_event_interruptible_lock_irq_cmd include/linux/wait.h 1015;" d
> wait_event_interruptible_lock_irq_timeout include/linux/wait.h 1086;" d
> wait_event_interruptible_locked include/linux/wait.h 759;" d
> wait_event_interruptible_locked_irq include/linux/wait.h 786;" d
> wait_event_interruptible_timeout include/linux/wait.h 476;" d
> wait_event_killable include/linux/wait.h 871;" d
> wait_event_killable_exclusive include/linux/wait.h 579;" d
> wait_event_killable_timeout include/linux/wait.h 907;" d
> wait_event_lock_irq include/linux/wait.h 975;" d
> wait_event_lock_irq_cmd include/linux/wait.h 948;" d
> wait_event_lock_irq_timeout include/linux/wait.h 1097;" d
> wait_event_timeout include/linux/wait.h 358;" d
> wait_for drivers/gpu/drm/gma500/cdv_intel_display.c 136;" d file:
> wait_for drivers/gpu/drm/gma500/cdv_intel_dp.c 248;" d file:
> wait_for drivers/gpu/drm/gma500/intel_gmbus.c 51;" d file:
> wait_for drivers/gpu/drm/i915/intel_drv.h 79;" d
> wait_for drivers/gpu/drm/v3d/v3d_drv.h 248;" d
> wait_for drivers/gpu/drm/vc4/vc4_drv.h 659;" d
> wait_for_atomic drivers/gpu/drm/gma500/intel_gmbus.c 52;" d file:
> wait_for_atomic drivers/gpu/drm/i915/intel_drv.h 143;" d
> wait_for_atomic_us drivers/gpu/drm/i915/intel_drv.h 136;" d
> wait_for_kprobe_optimizer kernel/kprobes.c 951;" d file:
> wait_for_pll_disable drivers/clk/qcom/clk-alpha-pll.c 169;" d file:
> wait_for_pll_enable_active drivers/clk/qcom/clk-alpha-pll.c 163;" d file:
> wait_for_pll_enable_lock drivers/clk/qcom/clk-alpha-pll.c 166;" d file:
> wait_for_pll_offline drivers/clk/qcom/clk-alpha-pll.c 172;" d file:
> wait_for_pll_update drivers/clk/qcom/clk-alpha-pll.c 175;" d file:
> wait_for_pll_update_ack_clear drivers/clk/qcom/clk-alpha-pll.c 181;" d file:
> wait_for_pll_update_ack_set drivers/clk/qcom/clk-alpha-pll.c 178;" d file:
> wait_for_us drivers/gpu/drm/i915/intel_drv.h 125;" d
> wait_on_command drivers/char/sonypi.c 505;" d file:
> wait_on_command drivers/platform/x86/sony-laptop.c 3613;" d file:
> wait_on_ibf arch/x86/platform/olpc/olpc.c 69;" d file:
> wait_on_obf arch/x86/platform/olpc/olpc.c 89;" d file:
> wait_rcu_gp include/linux/rcupdate_wait.h 32;" d
> wait_timeout drivers/staging/rts5208/rtsx.h 66;" d
> wait_timeout_x drivers/staging/rts5208/rtsx.h 61;" d
> wait_var_event include/linux/wait_bit.h 273;" d
> wait_var_event_killable include/linux/wait_bit.h 285;" d
> wait_var_event_timeout include/linux/wait_bit.h 299;" d
> waiting include/linux/parport.h /^ unsigned long waiting; \/* long req'd for set_bit --RR *\/$/;" m struct:pardevice access:public
>
>
> Functions (382)
> ---------------
>
> wait drivers/char/tpm/tpm_infineon.c /^static int wait(struct tpm_chip *chip, int wait_for_bit)$/;" f signature:(struct tpm_chip *chip, int wait_for_bit)
> wait drivers/net/ethernet/hp/hp100.c /^static void wait(void)$/;" f signature:(void)
> wait4buf drivers/ata/pata_arasan_cf.c /^static inline int wait4buf(struct arasan_cf_dev *acdev)$/;" f signature:(struct arasan_cf_dev *acdev)
> wait_HDO_off drivers/scsi/a100u2w.c /^static u8 wait_HDO_off(struct orc_host * host)$/;" f signature:(struct orc_host * host)
> wait_TBE drivers/input/serio/gscps2.c /^static int wait_TBE(char __iomem *addr)$/;" f signature:(char __iomem *addr)
> wait_ack drivers/gpu/drm/ast/ast_dp501.c /^static bool wait_ack(struct ast_private *ast)$/;" f signature:(struct ast_private *ast)
> wait_ack drivers/i2c/busses/i2c-au1550.c /^static int wait_ack(struct i2c_au1550_data *adap)$/;" f signature:(struct i2c_au1550_data *adap)
> wait_ack_clear drivers/gpu/drm/i915/intel_uncore.c /^wait_ack_clear(const struct drm_i915_private *i915,$/;" f signature:(const struct drm_i915_private *i915, const struct intel_uncore_forcewake_domain *d, const u32 ack)
> wait_ack_set drivers/gpu/drm/i915/intel_uncore.c /^wait_ack_set(const struct drm_i915_private *i915,$/;" f signature:(const struct drm_i915_private *i915, const struct intel_uncore_forcewake_domain *d, const u32 ack)
> wait_and_add_new_range drivers/md/dm-integrity.c /^static void wait_and_add_new_range(struct dm_integrity_c *ic, struct dm_integrity_range *new_range)$/;" f signature:(struct dm_integrity_c *ic, struct dm_integrity_range *new_range)
> wait_and_poll drivers/scsi/megaraid/megaraid_sas_fusion.c /^wait_and_poll(struct megasas_instance *instance, struct megasas_cmd *cmd,$/;" f signature:(struct megasas_instance *instance, struct megasas_cmd *cmd, int seconds)
> wait_and_send drivers/char/tpm/tpm_infineon.c /^static void wait_and_send(struct tpm_chip *chip, u8 sendbyte)$/;" f signature:(struct tpm_chip *chip, u8 sendbyte)
> wait_backlight_on drivers/gpu/drm/i915/intel_dp.c /^static void wait_backlight_on(struct intel_dp *intel_dp)$/;" f signature:(struct intel_dp *intel_dp)
> wait_barrier drivers/md/raid1.c /^static void wait_barrier(struct r1conf *conf, sector_t sector_nr)$/;" f signature:(struct r1conf *conf, sector_t sector_nr)
> wait_barrier drivers/md/raid10.c /^static void wait_barrier(struct r10conf *conf)$/;" f signature:(struct r10conf *conf)
> wait_bit_init kernel/sched/wait_bit.c /^void __init wait_bit_init(void)$/;" f signature:(void)
> wait_block_group_cache_done fs/btrfs/extent-tree.c /^wait_block_group_cache_done(struct btrfs_block_group_cache *cache)$/;" f signature:(struct btrfs_block_group_cache *cache)
> wait_block_group_cache_progress fs/btrfs/extent-tree.c /^wait_block_group_cache_progress(struct btrfs_block_group_cache *cache,$/;" f signature:(struct btrfs_block_group_cache *cache, u64 num_bytes)
> wait_busy drivers/isdn/hisax/hfc4s8s_l1.c /^wait_busy(hfc4s8s_hw *a)$/;" f signature:(hfc4s8s_hw *a)
> wait_caps_flush fs/ceph/mds_client.c /^static void wait_caps_flush(struct ceph_mds_client *mdsc,$/;" f signature:(struct ceph_mds_client *mdsc, u64 want_flush_tid)
> wait_cfg drivers/net/ethernet/i825xx/82596.c /^static inline int wait_cfg(struct net_device *dev, struct i596_cmd *cmd, int delcnt, char *str)$/;" f signature:(struct net_device *dev, struct i596_cmd *cmd, int delcnt, char *str)
> wait_chip_ready drivers/scsi/a100u2w.c /^static u8 wait_chip_ready(struct orc_host * host)$/;" f signature:(struct orc_host * host)
> wait_ci_ready drivers/media/pci/ddbridge/ddbridge-ci.c /^static int wait_ci_ready(struct ddb_ci *ci)$/;" f signature:(struct ddb_ci *ci)
> wait_clean_list_grace net/rds/ib_rdma.c /^static inline void wait_clean_list_grace(void)$/;" f signature:(void)
> wait_clear_underrun_bit sound/x86/intel_hdmi_audio.c /^static void wait_clear_underrun_bit(struct snd_intelhad *intelhaddata)$/;" f signature:(struct snd_intelhad *intelhaddata)
> wait_clear_urbs sound/usb/endpoint.c /^static int wait_clear_urbs(struct snd_usb_endpoint *ep)$/;" f signature:(struct snd_usb_endpoint *ep)
> wait_cmd drivers/net/ethernet/i825xx/82596.c /^static inline int wait_cmd(struct net_device *dev, struct i596_private *lp, int delcnt, char *str)$/;" f signature:(struct net_device *dev, struct i596_private *lp, int delcnt, char *str)
> wait_cmd drivers/net/ethernet/i825xx/lib82596.c /^static inline int wait_cmd(struct net_device *dev, struct i596_dma *dma, int delcnt, char *str)$/;" f signature:(struct net_device *dev, struct i596_dma *dma, int delcnt, char *str)
> wait_cmds_complete_timeout_v2_hw drivers/scsi/hisi_sas/hisi_sas_v2_hw.c /^static void wait_cmds_complete_timeout_v2_hw(struct hisi_hba *hisi_hba,$/;" f signature:(struct hisi_hba *hisi_hba, int delay_ms, int timeout_ms)
> wait_cmds_complete_timeout_v3_hw drivers/scsi/hisi_sas/hisi_sas_v3_hw.c /^static void wait_cmds_complete_timeout_v3_hw(struct hisi_hba *hisi_hba,$/;" f signature:(struct hisi_hba *hisi_hba, int delay_ms, int timeout_ms)
> wait_cmv_ack drivers/usb/atm/ueagle-atm.c /^static inline int wait_cmv_ack(struct uea_softc *sc)$/;" f signature:(struct uea_softc *sc)
> wait_command_complete drivers/char/pcmcia/synclink_cs.c /^static bool wait_command_complete(MGSLPC_INFO *info, unsigned char channel)$/;" f signature:(MGSLPC_INFO *info, unsigned char channel)
> wait_completion drivers/mtd/nand/raw/sh_flctl.c /^static void wait_completion(struct sh_flctl *flctl)$/;" f signature:(struct sh_flctl *flctl)
> wait_consider_task kernel/exit.c /^static int wait_consider_task(struct wait_opts *wo, int ptrace,$/;" f signature:(struct wait_opts *wo, int ptrace, struct task_struct *p)
> wait_controller_finished drivers/mtd/nand/raw/hisi504_nand.c /^static void wait_controller_finished(struct hinfc_host *host)$/;" f signature:(struct hinfc_host *host)
> wait_conversion_complete_gpio drivers/iio/magnetometer/ak8975.c /^static int wait_conversion_complete_gpio(struct ak8975_data *data)$/;" f signature:(struct ak8975_data *data)
> wait_conversion_complete_interrupt drivers/iio/magnetometer/ak8975.c /^static int wait_conversion_complete_interrupt(struct ak8975_data *data)$/;" f signature:(struct ak8975_data *data)
> wait_conversion_complete_irq drivers/iio/light/gp2ap020a00f.c /^static int wait_conversion_complete_irq(struct gp2ap020a00f_data *data)$/;" f signature:(struct gp2ap020a00f_data *data)
> wait_conversion_complete_polled drivers/iio/magnetometer/ak8975.c /^static int wait_conversion_complete_polled(struct ak8975_data *data)$/;" f signature:(struct ak8975_data *data)
> wait_current_trans fs/btrfs/transaction.c /^static void wait_current_trans(struct btrfs_fs_info *fs_info)$/;" f signature:(struct btrfs_fs_info *fs_info)
> wait_current_trans_commit_start fs/btrfs/transaction.c /^static void wait_current_trans_commit_start(struct btrfs_fs_info *fs_info,$/;" f signature:(struct btrfs_fs_info *fs_info, struct btrfs_transaction *trans)
> wait_current_trans_commit_start_and_unblock fs/btrfs/transaction.c /^static void wait_current_trans_commit_start_and_unblock($/;" f signature:( struct btrfs_fs_info *fs_info, struct btrfs_transaction *trans)
> wait_data_buf_ready drivers/staging/rts5208/sd.c /^static int wait_data_buf_ready(struct rtsx_chip *chip)$/;" f signature:(struct rtsx_chip *chip)
> wait_dev_flush fs/btrfs/disk-io.c /^static blk_status_t wait_dev_flush(struct btrfs_device *device)$/;" f signature:(struct btrfs_device *device)
> wait_dev_supers fs/btrfs/disk-io.c /^static int wait_dev_supers(struct btrfs_device *device, int max_mirrors)$/;" f signature:(struct btrfs_device *device, int max_mirrors)
> wait_dis drivers/media/dvb-frontends/stv0910.c /^static int wait_dis(struct stv *state, u8 flag, u8 val)$/;" f signature:(struct stv *state, u8 flag, u8 val)
> wait_drive_not_busy drivers/ide/ide-taskfile.c /^static u8 wait_drive_not_busy(ide_drive_t *drive)$/;" f signature:(ide_drive_t *drive)
> wait_dsp_ack sound/pci/asihpi/hpi6205.c /^static int wait_dsp_ack(struct hpi_hw_obj *phw, int state, int timeout_us)$/;" f signature:(struct hpi_hw_obj *phw, int state, int timeout_us)
> wait_eeprom_cmd_done drivers/staging/rtl8712/rtl871x_eeprom.c /^static u16 wait_eeprom_cmd_done(struct _adapter *padapter)$/;" f signature:(struct _adapter *padapter)
> wait_eeprom_cmd_done drivers/staging/rtl8723bs/core/rtw_eeprom.c /^u16 wait_eeprom_cmd_done(_adapter *padapter)$/;" f signature:(_adapter *padapter)
> wait_eeprom_ready drivers/net/ethernet/cirrus/cs89x0.c /^wait_eeprom_ready(struct net_device *dev)$/;" f signature:(struct net_device *dev)
> wait_end_of_write drivers/video/fbdev/omap/sossi.c /^static void wait_end_of_write(void)$/;" f signature:(void)
> wait_entry_unlocked fs/dax.c /^static void wait_entry_unlocked(struct xa_state *xas, void *entry)$/;" f signature:(struct xa_state *xas, void *entry)
> wait_err drivers/mtd/nand/onenand/omap2.c /^static void wait_err(char *msg, int state, unsigned int ctrl, unsigned int intr)$/;" f signature:(char *msg, int state, unsigned int ctrl, unsigned int intr)
> wait_events drivers/char/pcmcia/synclink_cs.c /^static int wait_events(MGSLPC_INFO * info, int __user *mask_ptr)$/;" f signature:(MGSLPC_INFO * info, int __user *mask_ptr)
> wait_extent_bit fs/btrfs/extent_io.c /^static void wait_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,$/;" f signature:(struct extent_io_tree *tree, u64 start, u64 end, unsigned long bits)
> wait_firmware_ready drivers/scsi/a100u2w.c /^static u8 wait_firmware_ready(struct orc_host * host)$/;" f signature:(struct orc_host * host)
> wait_fm_ready drivers/infiniband/hw/hfi1/firmware.c /^int wait_fm_ready(struct hfi1_devdata *dd, u32 mstimeout)$/;" f signature:(struct hfi1_devdata *dd, u32 mstimeout)
> wait_for_53c80_access drivers/scsi/g_NCR5380.c /^static void wait_for_53c80_access(struct NCR5380_hostdata *hostdata)$/;" f signature:(struct NCR5380_hostdata *hostdata)
> wait_for_HP drivers/usb/host/uhci-hub.c /^static void wait_for_HP(struct uhci_hcd *uhci, unsigned long port_addr)$/;" f signature:(struct uhci_hcd *uhci, unsigned long port_addr)
> wait_for_ack drivers/macintosh/via-pmu.c /^wait_for_ack(void)$/;" f signature:(void)
> wait_for_all_fifos_empty drivers/gpu/drm/gma500/mdfld_dsi_pkg_sender.c /^static int wait_for_all_fifos_empty(struct mdfld_dsi_pkg_sender *sender)$/;" f signature:(struct mdfld_dsi_pkg_sender *sender)
> wait_for_and_update_peer_seq drivers/block/drbd/drbd_receiver.c /^static int wait_for_and_update_peer_seq(struct drbd_peer_device *peer_device, const u32 peer_seq)$/;" f signature:(struct drbd_peer_device *peer_device, const u32 peer_seq)
> wait_for_ap_thread kernel/cpu.c /^static inline void wait_for_ap_thread(struct cpuhp_cpu_state *st, bool bringup)$/;" f signature:(struct cpuhp_cpu_state *st, bool bringup)
> wait_for_api_cmd_completion drivers/net/ethernet/huawei/hinic/hinic_hw_api_cmd.c /^static int wait_for_api_cmd_completion(struct hinic_api_cmd_chain *chain)$/;" f signature:(struct hinic_api_cmd_chain *chain)
> wait_for_async_commands drivers/infiniband/hw/mlx5/mr.c /^static void wait_for_async_commands(struct mlx5_ib_dev *dev)$/;" f signature:(struct mlx5_ib_dev *dev)
> wait_for_avail sound/core/pcm_lib.c /^static int wait_for_avail(struct snd_pcm_substream *substream,$/;" f signature:(struct snd_pcm_substream *substream, snd_pcm_uframes_t *availp)
> wait_for_bb drivers/i2c/algos/i2c-algo-pcf.c /^static int wait_for_bb(struct i2c_algo_pcf_data *adap)$/;" f signature:(struct i2c_algo_pcf_data *adap)
> wait_for_bit_change drivers/gpu/drm/omapdrm/dss/dsi.c /^static inline bool wait_for_bit_change(struct dsi_data *dsi,$/;" f signature:(struct dsi_data *dsi, const struct dsi_reg idx, int bitnum, int value)
> wait_for_bit_change drivers/gpu/drm/omapdrm/dss/pll.c /^static int wait_for_bit_change(void __iomem *reg, int bitnum, int value)$/;" f signature:(void __iomem *reg, int bitnum, int value)
> wait_for_bit_change drivers/video/fbdev/omap2/omapfb/dss/dsi.c /^static inline int wait_for_bit_change(struct platform_device *dsidev,$/;" f signature:(struct platform_device *dsidev, const struct dsi_reg idx, int bitnum, int value)
> wait_for_bit_change drivers/video/fbdev/omap2/omapfb/dss/pll.c /^static int wait_for_bit_change(void __iomem *reg, int bitnum, int value)$/;" f signature:(void __iomem *reg, int bitnum, int value)
> wait_for_bulk_in_ready drivers/char/pcmcia/cm4040_cs.c /^static int wait_for_bulk_in_ready(struct reader_dev *dev)$/;" f signature:(struct reader_dev *dev)
> wait_for_bulk_out_ready drivers/char/pcmcia/cm4040_cs.c /^static int wait_for_bulk_out_ready(struct reader_dev *dev)$/;" f signature:(struct reader_dev *dev)
> wait_for_call_done drivers/media/dvb-frontends/stv6111.c /^static int wait_for_call_done(struct stv *state, u8 mask)$/;" f signature:(struct stv *state, u8 mask)
> wait_for_card_driver samples/mic/mpssd/mpssd.c /^wait_for_card_driver(struct mic_info *mic, int fd, int type)$/;" f signature:(struct mic_info *mic, int fd, int type)
> wait_for_clients drivers/infiniband/hw/hfi1/init.c /^static void wait_for_clients(struct hfi1_devdata *dd)$/;" f signature:(struct hfi1_devdata *dd)
> wait_for_cmd_complete drivers/net/ethernet/neterion/s2io.c /^static int wait_for_cmd_complete(void __iomem *addr, u64 busy_bit,$/;" f signature:(void __iomem *addr, u64 busy_bit, int bit_state)
> wait_for_cmds_dispatched_to_panel drivers/gpu/drm/i915/icl_dsi.c /^static void wait_for_cmds_dispatched_to_panel(struct intel_encoder *encoder)$/;" f signature:(struct intel_encoder *encoder)
> wait_for_codec sound/pci/fm801.c /^static int wait_for_codec(struct fm801 *chip, unsigned int codec_id,$/;" f signature:(struct fm801 *chip, unsigned int codec_id, unsigned short reg, unsigned long waits)
> wait_for_commit fs/btrfs/transaction.c /^static noinline void wait_for_commit(struct btrfs_transaction *commit)$/;" f signature:(struct btrfs_transaction *commit)
> wait_for_commit fs/ubifs/commit.c /^static int wait_for_commit(struct ubifs_info *c)$/;" f signature:(struct ubifs_info *c)
> wait_for_common kernel/sched/completion.c /^wait_for_common(struct completion *x, long timeout, int state)$/;" f signature:(struct completion *x, long timeout, int state)
> wait_for_common_io kernel/sched/completion.c /^wait_for_common_io(struct completion *x, long timeout, int state)$/;" f signature:(struct completion *x, long timeout, int state)
> wait_for_complete drivers/staging/greybus/tools/loopback_test.c /^static int wait_for_complete(struct loopback_test *t)$/;" f signature:(struct loopback_test *t)
> wait_for_completion kernel/sched/completion.c /^void __sched wait_for_completion(struct completion *x)$/;" f signature:(struct completion *x)
> wait_for_completion_interruptible kernel/sched/completion.c /^int __sched wait_for_completion_interruptible(struct completion *x)$/;" f signature:(struct completion *x)
> wait_for_completion_interruptible_timeout kernel/sched/completion.c /^wait_for_completion_interruptible_timeout(struct completion *x,$/;" f signature:(struct completion *x, unsigned long timeout)
> wait_for_completion_io kernel/sched/completion.c /^void __sched wait_for_completion_io(struct completion *x)$/;" f signature:(struct completion *x)
> wait_for_completion_io_timeout kernel/sched/completion.c /^wait_for_completion_io_timeout(struct completion *x, unsigned long timeout)$/;" f signature:(struct completion *x, unsigned long timeout)
> wait_for_completion_killable kernel/sched/completion.c /^int __sched wait_for_completion_killable(struct completion *x)$/;" f signature:(struct completion *x)
> wait_for_completion_killable_timeout kernel/sched/completion.c /^wait_for_completion_killable_timeout(struct completion *x,$/;" f signature:(struct completion *x, unsigned long timeout)
> wait_for_completion_timeout kernel/sched/completion.c /^wait_for_completion_timeout(struct completion *x, unsigned long timeout)$/;" f signature:(struct completion *x, unsigned long timeout)
> wait_for_concurrent_writes fs/nfsd/vfs.c /^static int wait_for_concurrent_writes(struct file *file)$/;" f signature:(struct file *file)
> wait_for_connected drivers/usb/core/hub.c /^static int wait_for_connected(struct usb_device *udev,$/;" f signature:(struct usb_device *udev, struct usb_hub *hub, int *port1, u16 *portchange, u16 *portstatus)
> wait_for_csb drivers/crypto/nx/nx-842-powernv.c /^static int wait_for_csb(struct nx842_workmem *wmem,$/;" f signature:(struct nx842_workmem *wmem, struct coprocessor_status_block *csb)
> wait_for_ct_request_update drivers/gpu/drm/i915/intel_guc_ct.c /^static int wait_for_ct_request_update(struct ct_request *req, u32 *status)$/;" f signature:(struct ct_request *req, u32 *status)
> wait_for_ctb_desc_update drivers/gpu/drm/i915/intel_guc_ct.c /^static int wait_for_ctb_desc_update(struct guc_ct_buffer_desc *desc,$/;" f signature:(struct guc_ct_buffer_desc *desc, u32 fence, u32 *status)
> wait_for_ctrl_irq drivers/pci/hotplug/cpqphp.h /^static inline int wait_for_ctrl_irq(struct controller *ctrl)$/;" f signature:(struct controller *ctrl)
> wait_for_db_state drivers/net/ethernet/huawei/hinic/hinic_hw_dev.c /^static int wait_for_db_state(struct hinic_hwdev *hwdev)$/;" f signature:(struct hinic_hwdev *hwdev)
> wait_for_dc_servo sound/soc/codecs/wm8996.c /^static void wait_for_dc_servo(struct snd_soc_component *component, u16 mask)$/;" f signature:(struct snd_soc_component *component, u16 mask)
> wait_for_dc_servo sound/soc/codecs/wm9090.c /^static void wait_for_dc_servo(struct snd_soc_component *component)$/;" f signature:(struct snd_soc_component *component)
> wait_for_dc_servo sound/soc/codecs/wm_hubs.c /^static void wait_for_dc_servo(struct snd_soc_component *component, unsigned int op)$/;" f signature:(struct snd_soc_component *component, unsigned int op)
> wait_for_dest_dir_move fs/btrfs/send.c /^static int wait_for_dest_dir_move(struct send_ctx *sctx,$/;" f signature:(struct send_ctx *sctx, struct recorded_ref *parent_ref, const bool is_orphan)
> wait_for_device_probe drivers/base/dd.c /^void wait_for_device_probe(void)$/;" f signature:(void)
> wait_for_device_start drivers/scsi/isci/host.h /^static inline void wait_for_device_start(struct isci_host *ihost, struct isci_remote_device *idev)$/;" f signature:(struct isci_host *ihost, struct isci_remote_device *idev)
> wait_for_device_stop drivers/scsi/isci/host.h /^static inline void wait_for_device_stop(struct isci_host *ihost, struct isci_remote_device *idev)$/;" f signature:(struct isci_host *ihost, struct isci_remote_device *idev)
> wait_for_device_to_become_ready drivers/scsi/hpsa.c /^static int wait_for_device_to_become_ready(struct ctlr_info *h,$/;" f signature:(struct ctlr_info *h, unsigned char lunaddr[], int reply_queue)
> wait_for_devices drivers/xen/xenbus/xenbus_probe_frontend.c /^static void wait_for_devices(struct xenbus_driver *xendrv)$/;" f signature:(struct xenbus_driver *xendrv)
> wait_for_devices net/ipv4/ipconfig.c /^static int __init wait_for_devices(void)$/;" f signature:(void)
> wait_for_direct_io fs/orangefs/file.c /^static ssize_t wait_for_direct_io(enum ORANGEFS_io_type type, struct inode *inode,$/;" f signature:(enum ORANGEFS_io_type type, struct inode *inode, loff_t *offset, struct iov_iter *iter, size_t total_size, loff_t readahead_size)
> wait_for_doorbell drivers/isdn/hardware/avm/c4.c /^static inline int wait_for_doorbell(avmcard *card, unsigned long t)$/;" f signature:(avmcard *card, unsigned long t)
> wait_for_dump_helpers fs/coredump.c /^static void wait_for_dump_helpers(struct file *file)$/;" f signature:(struct file *file)
> wait_for_engine_idle drivers/video/fbdev/i810/i810_accel.c /^static inline int wait_for_engine_idle(struct fb_info *info)$/;" f signature:(struct fb_info *info)
> wait_for_engines drivers/gpu/drm/i915/i915_gem.c /^static int wait_for_engines(struct drm_i915_private *i915)$/;" f signature:(struct drm_i915_private *i915)
> wait_for_fbc_state_changed drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c /^static void wait_for_fbc_state_changed($/;" f signature:( struct dce110_compressor *cp110, bool enabled)
> wait_for_fbc_state_changed drivers/gpu/drm/amd/display/dc/dce112/dce112_compressor.c /^static void wait_for_fbc_state_changed($/;" f signature:( struct dce112_compressor *cp110, bool enabled)
> wait_for_fifo drivers/video/fbdev/aty/aty128fb.c /^static void wait_for_fifo(u16 entries, struct aty128fb_par *par)$/;" f signature:(u16 entries, struct aty128fb_par *par)
> wait_for_fifo drivers/video/fbdev/aty/atyfb.h /^static inline void wait_for_fifo(u16 entries, struct atyfb_par *par)$/;" f signature:(u16 entries, struct atyfb_par *par)
> wait_for_free fs/orangefs/orangefs-bufmap.c /^static int wait_for_free(struct slot_map *m)$/;" f signature:(struct slot_map *m)
> wait_for_free_credits fs/cifs/transport.c /^wait_for_free_credits(struct TCP_Server_Info *server, const int timeout,$/;" f signature:(struct TCP_Server_Info *server, const int timeout, int *credits)
> wait_for_free_request fs/cifs/transport.c /^wait_for_free_request(struct TCP_Server_Info *server, const int timeout,$/;" f signature:(struct TCP_Server_Info *server, const int timeout, const int optype)
> wait_for_freeze_status drivers/infiniband/hw/hfi1/chip.c /^static void wait_for_freeze_status(struct hfi1_devdata *dd, int freeze)$/;" f signature:(struct hfi1_devdata *dd, int freeze)
> wait_for_gen_fifo_empty drivers/gpu/drm/gma500/mdfld_dsi_pkg_sender.c /^static inline int wait_for_gen_fifo_empty(struct mdfld_dsi_pkg_sender *sender,$/;" f signature:(struct mdfld_dsi_pkg_sender *sender, u32 mask)
> wait_for_guc_preempt_report drivers/gpu/drm/i915/intel_guc_submission.c /^static void wait_for_guc_preempt_report(struct intel_engine_cs *engine)$/;" f signature:(struct intel_engine_cs *engine)
> wait_for_header_credits drivers/gpu/drm/i915/icl_dsi.c /^static void wait_for_header_credits(struct drm_i915_private *dev_priv,$/;" f signature:(struct drm_i915_private *dev_priv, enum transcoder dsi_trans)
> wait_for_host_ready drivers/ata/pata_samsung_cf.c /^static int wait_for_host_ready(struct s3c_ide_info *info)$/;" f signature:(struct s3c_ide_info *info)
> wait_for_host_signal drivers/platform/goldfish/goldfish_pipe.c /^static int wait_for_host_signal(struct goldfish_pipe *pipe, int is_write)$/;" f signature:(struct goldfish_pipe *pipe, int is_write)
> wait_for_hs_fifos_empty drivers/gpu/drm/gma500/mdfld_dsi_pkg_sender.c /^static int wait_for_hs_fifos_empty(struct mdfld_dsi_pkg_sender *sender)$/;" f signature:(struct mdfld_dsi_pkg_sender *sender)
> wait_for_idle drivers/gpu/drm/i915/selftests/intel_hangcheck.c /^static bool wait_for_idle(struct intel_engine_cs *engine)$/;" f signature:(struct intel_engine_cs *engine)
> wait_for_idle drivers/net/ethernet/ti/davinci_mdio.c /^static inline int wait_for_idle(struct davinci_mdio_data *data)$/;" f signature:(struct davinci_mdio_data *data)
> wait_for_idle drivers/spi/spi-rockchip.c /^static inline void wait_for_idle(struct rockchip_spi *rs)$/;" f signature:(struct rockchip_spi *rs)
> wait_for_idle drivers/video/fbdev/aty/aty128fb.c /^static void wait_for_idle(struct aty128fb_par *par)$/;" f signature:(struct aty128fb_par *par)
> wait_for_idle drivers/video/fbdev/aty/atyfb.h /^static inline void wait_for_idle(struct atyfb_par *par)$/;" f signature:(struct atyfb_par *par)
> wait_for_idle drivers/video/fbdev/riva/fbdev.c /^static inline void wait_for_idle(struct riva_par *par)$/;" f signature:(struct riva_par *par)
> wait_for_io_cmd drivers/gpu/drm/qxl/qxl_cmd.c /^static void wait_for_io_cmd(struct qxl_device *qdev, uint8_t val, long port)$/;" f signature:(struct qxl_device *qdev, uint8_t val, long port)
> wait_for_io_cmd_user drivers/gpu/drm/qxl/qxl_cmd.c /^static int wait_for_io_cmd_user(struct qxl_device *qdev, uint8_t val, long port, bool intr)$/;" f signature:(struct qxl_device *qdev, uint8_t val, long port, bool intr)
> wait_for_io_stopped drivers/net/ethernet/huawei/hinic/hinic_hw_dev.c /^static int wait_for_io_stopped(struct hinic_hwdev *hwdev)$/;" f signature:(struct hinic_hwdev *hwdev)
> wait_for_key_construction security/keys/request_key.c /^int wait_for_key_construction(struct key *key, bool intr)$/;" f signature:(struct key *key, bool intr)
> wait_for_kprobe_optimizer include/linux/kprobes.h /^static inline void wait_for_kprobe_optimizer(void) { }$/;" f signature:(void)
> wait_for_kprobe_optimizer kernel/kprobes.c /^void wait_for_kprobe_optimizer(void)$/;" f signature:(void)
> wait_for_kthread_stop drivers/md/bcache/bcache.h /^static inline void wait_for_kthread_stop(void)$/;" f signature:(void)
> wait_for_latest_osdmap drivers/block/rbd.c /^static int wait_for_latest_osdmap(struct ceph_client *client)$/;" f signature:(struct ceph_client *client)
> wait_for_link drivers/net/ethernet/dec/tulip/de4x5.c /^wait_for_link(struct net_device *dev)$/;" f signature:(struct net_device *dev)
> wait_for_lp_fifos_empty drivers/gpu/drm/gma500/mdfld_dsi_pkg_sender.c /^static int wait_for_lp_fifos_empty(struct mdfld_dsi_pkg_sender *sender)$/;" f signature:(struct mdfld_dsi_pkg_sender *sender)
> wait_for_lps drivers/video/fbdev/sh7760fb.c /^static int wait_for_lps(struct sh7760fb_par *par, int val)$/;" f signature:(struct sh7760fb_par *par, int val)
> wait_for_master_cpu arch/x86/kernel/cpu/common.c /^static void wait_for_master_cpu(int cpu)$/;" f signature:(int cpu)
> wait_for_matching_downcall fs/orangefs/waitqueue.c /^static int wait_for_matching_downcall(struct orangefs_kernel_op_s *op,$/;" f signature:(struct orangefs_kernel_op_s *op, long timeout, bool interruptible)
> wait_for_mci_complete drivers/media/usb/cx231xx/cx231xx-417.c /^static int wait_for_mci_complete(struct cx231xx *dev)$/;" f signature:(struct cx231xx *dev)
> wait_for_mdio drivers/net/ethernet/aeroflex/greth.c /^static inline int wait_for_mdio(struct greth_private *greth)$/;" f signature:(struct greth_private *greth)
> wait_for_msg_done drivers/char/ipmi/ipmi_si_intf.c /^static int wait_for_msg_done(struct smi_info *smi_info)$/;" f signature:(struct smi_info *smi_info)
> wait_for_msix_trans drivers/net/ethernet/neterion/s2io.c /^static int wait_for_msix_trans(struct s2io_nic *nic, int i)$/;" f signature:(struct s2io_nic *nic, int i)
> wait_for_others drivers/gpu/drm/i915/selftests/intel_hangcheck.c /^static int wait_for_others(struct drm_i915_private *i915,$/;" f signature:(struct drm_i915_private *i915, struct intel_engine_cs *exclude)
> wait_for_outbound_state drivers/net/ethernet/huawei/hinic/hinic_hw_dev.c /^static int wait_for_outbound_state(struct hinic_hwdev *hwdev)$/;" f signature:(struct hinic_hwdev *hwdev)
> wait_for_panic arch/x86/kernel/cpu/mce/core.c /^static void wait_for_panic(void)$/;" f signature:(void)
> wait_for_parent_move fs/btrfs/send.c /^static int wait_for_parent_move(struct send_ctx *sctx,$/;" f signature:(struct send_ctx *sctx, struct recorded_ref *parent_ref, const bool is_orphan)
> wait_for_partner fs/pipe.c /^static int wait_for_partner(struct pipe_inode_info *pipe, unsigned int *cnt)$/;" f signature:(struct pipe_inode_info *pipe, unsigned int *cnt)
> wait_for_payload_credits drivers/gpu/drm/i915/icl_dsi.c /^static void wait_for_payload_credits(struct drm_i915_private *dev_priv,$/;" f signature:(struct drm_i915_private *dev_priv, enum transcoder dsi_trans)
> wait_for_pending_requests drivers/net/ethernet/cavium/liquidio/octeon_network.h /^static inline int wait_for_pending_requests(struct octeon_device *oct)$/;" f signature:(struct octeon_device *oct)
> wait_for_pin drivers/i2c/algos/i2c-algo-pcf.c /^static int wait_for_pin(struct i2c_algo_pcf_data *adap, int *status)$/;" f signature:(struct i2c_algo_pcf_data *adap, int *status)
> wait_for_pin drivers/sbus/char/bbc_i2c.c /^static int wait_for_pin(struct bbc_i2c_bus *bp, u8 *status)$/;" f signature:(struct bbc_i2c_bus *bp, u8 *status)
> wait_for_pipe_scanline_moving drivers/gpu/drm/i915/intel_display.c /^static void wait_for_pipe_scanline_moving(struct intel_crtc *crtc, bool state)$/;" f signature:(struct intel_crtc *crtc, bool state)
> wait_for_pll drivers/clk/qcom/clk-alpha-pll.c /^static int wait_for_pll(struct clk_alpha_pll *pll, u32 mask, bool inverse,$/;" f signature:(struct clk_alpha_pll *pll, u32 mask, bool inverse, const char *action)
> wait_for_pll drivers/clk/qcom/clk-pll.c /^static int wait_for_pll(struct clk_pll *pll)$/;" f signature:(struct clk_pll *pll)
> wait_for_qsfp_init drivers/infiniband/hw/hfi1/chip.c /^static void wait_for_qsfp_init(struct hfi1_pportdata *ppd)$/;" f signature:(struct hfi1_pportdata *ppd)
> wait_for_random_bytes drivers/char/random.c /^int wait_for_random_bytes(void)$/;" f signature:(void)
> wait_for_ready drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c /^static bool wait_for_ready(struct igt_wakeup *w)$/;" f signature:(struct igt_wakeup *w)
> wait_for_ready drivers/mtd/lpddr/lpddr_cmds.c /^static int wait_for_ready(struct map_info *map, struct flchip *chip,$/;" f signature:(struct map_info *map, struct flchip *chip, unsigned int chip_op_time)
> wait_for_reconnect drivers/block/nbd.c /^static int wait_for_reconnect(struct nbd_device *nbd)$/;" f signature:(struct nbd_device *nbd)
> wait_for_reg drivers/phy/marvell/phy-pxa-28nm-hsic.c /^static bool wait_for_reg(void __iomem *reg, u32 mask, unsigned long timeout)$/;" f signature:(void __iomem *reg, u32 mask, unsigned long timeout)
> wait_for_reg drivers/phy/marvell/phy-pxa-28nm-usb2.c /^static bool wait_for_reg(void __iomem *reg, u32 mask, unsigned long timeout)$/;" f signature:(void __iomem *reg, u32 mask, unsigned long timeout)
> wait_for_reg_status drivers/phy/samsung/phy-exynos5250-sata.c /^static int wait_for_reg_status(void __iomem *base, u32 reg, u32 checkbit,$/;" f signature:(void __iomem *base, u32 reg, u32 checkbit, u32 status)
> wait_for_reset drivers/net/ethernet/ibm/ibmvnic.c /^static int wait_for_reset(struct ibmvnic_adapter *adapter)$/;" f signature:(struct ibmvnic_adapter *adapter)
> wait_for_reset_state drivers/net/ethernet/amazon/ena/ena_com.c /^static int wait_for_reset_state(struct ena_com_dev *ena_dev, u32 timeout,$/;" f signature:(struct ena_com_dev *ena_dev, u32 timeout, u16 exp_state)
> wait_for_reset_trigger_to_occur drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c /^static bool wait_for_reset_trigger_to_occur($/;" f signature:( struct dc_context *dc_ctx, struct timing_generator *tg)
> wait_for_reset_trigger_to_occur drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c /^static bool wait_for_reset_trigger_to_occur($/;" f signature:( struct dc_context *dc_ctx, struct timing_generator *tg)
> wait_for_response drivers/infiniband/core/mad.c /^static void wait_for_response(struct ib_mad_send_wr_private *mad_send_wr)$/;" f signature:(struct ib_mad_send_wr_private *mad_send_wr)
> wait_for_response drivers/pci/controller/pci-hyperv.c /^static int wait_for_response(struct hv_device *hdev,$/;" f signature:(struct hv_device *hdev, struct completion *comp)
> wait_for_response fs/cifs/transport.c /^wait_for_response(struct TCP_Server_Info *server, struct mid_q_entry *midQ)$/;" f signature:(struct TCP_Server_Info *server, struct mid_q_entry *midQ)
> wait_for_rx_byte drivers/i2c/busses/i2c-au1550.c /^static int wait_for_rx_byte(struct i2c_au1550_data *adap, unsigned char *out)$/;" f signature:(struct i2c_au1550_data *adap, unsigned char *out)
> wait_for_sc_completion_timeout drivers/net/ethernet/cavium/liquidio/octeon_main.h /^wait_for_sc_completion_timeout(struct octeon_device *oct_dev,$/;" f signature:(struct octeon_device *oct_dev, struct octeon_soft_command *sc, unsigned long timeout)
> wait_for_scl_high drivers/gpu/drm/amd/display/dc/i2caux/i2c_sw_engine.c /^static bool wait_for_scl_high($/;" f signature:( struct dc_context *ctx, struct ddc *ddc, uint16_t clock_delay_div_4)
> wait_for_scl_high_sw drivers/gpu/drm/amd/display/dc/dce/dce_i2c_sw.c /^static bool wait_for_scl_high_sw($/;" f signature:( struct dc_context *ctx, struct ddc *ddc, uint16_t clock_delay_div_4)
> wait_for_space drivers/gpu/drm/i915/intel_ringbuffer.c /^static noinline int wait_for_space(struct intel_ring *ring, unsigned int bytes)$/;" f signature:(struct intel_ring *ring, unsigned int bytes)
> wait_for_space drivers/video/fbdev/i810/i810_accel.c /^static inline int wait_for_space(struct fb_info *info, u32 space)$/;" f signature:(struct fb_info *info, u32 space)
> wait_for_space fs/splice.c /^static int wait_for_space(struct pipe_inode_info *pipe, unsigned flags)$/;" f signature:(struct pipe_inode_info *pipe, unsigned flags)
> wait_for_srst_clear sound/pci/lola/lola_pcm.c /^static void wait_for_srst_clear(struct lola *chip, struct lola_stream *str)$/;" f signature:(struct lola *chip, struct lola_stream *str)
> wait_for_stable_page mm/page-writeback.c /^void wait_for_stable_page(struct page *page)$/;" f signature:(struct page *page)
> wait_for_start drivers/scsi/isci/host.h /^static inline void wait_for_start(struct isci_host *ihost)$/;" f signature:(struct isci_host *ihost)
> wait_for_stat drivers/char/tpm/st33zp24/st33zp24.c /^static int wait_for_stat(struct tpm_chip *chip, u8 mask, unsigned long timeout,$/;" f signature:(struct tpm_chip *chip, u8 mask, unsigned long timeout, wait_queue_head_t *queue, bool check_cancel)
> wait_for_stat drivers/char/tpm/tpm_i2c_infineon.c /^static int wait_for_stat(struct tpm_chip *chip, u8 mask, unsigned long timeout,$/;" f signature:(struct tpm_chip *chip, u8 mask, unsigned long timeout, int *status)
> wait_for_stat drivers/char/tpm/tpm_nsc.c /^static int wait_for_stat(struct tpm_chip *chip, u8 mask, u8 val, u8 * data)$/;" f signature:(struct tpm_chip *chip, u8 mask, u8 val, u8 * data)
> wait_for_state drivers/tty/hvc/hvsi.c /^static int wait_for_state(struct hvsi_struct *hp, int state)$/;" f signature:(struct hvsi_struct *hp, int state)
> wait_for_states drivers/crypto/chelsio/chtls/chtls_cm.c /^static int wait_for_states(struct sock *sk, unsigned int states)$/;" f signature:(struct sock *sk, unsigned int states)
> wait_for_status_poll drivers/net/ethernet/huawei/hinic/hinic_hw_api_cmd.c /^static int wait_for_status_poll(struct hinic_api_cmd_chain *chain)$/;" f signature:(struct hinic_api_cmd_chain *chain)
> wait_for_stop drivers/scsi/isci/host.h /^static inline void wait_for_stop(struct isci_host *ihost)$/;" f signature:(struct isci_host *ihost)
> wait_for_tail drivers/crypto/n2_core.c /^static unsigned long wait_for_tail(struct spu_queue *qp)$/;" f signature:(struct spu_queue *qp)
> wait_for_timeline drivers/gpu/drm/i915/i915_gem.c /^static long wait_for_timeline(struct i915_timeline *tl,$/;" f signature:(struct i915_timeline *tl, unsigned int flags, long timeout)
> wait_for_tpm_stat drivers/char/tpm/tpm_tis_core.c /^static int wait_for_tpm_stat(struct tpm_chip *chip, u8 mask,$/;" f signature:(struct tpm_chip *chip, u8 mask, unsigned long timeout, wait_queue_head_t *queue, bool check_cancel)
> wait_for_tpm_stat drivers/char/tpm/xen-tpmfront.c /^static int wait_for_tpm_stat(struct tpm_chip *chip, u8 mask,$/;" f signature:(struct tpm_chip *chip, u8 mask, unsigned long timeout, wait_queue_head_t *queue, bool check_cancel)
> wait_for_tpm_stat_cond drivers/char/tpm/st33zp24/st33zp24.c /^static bool wait_for_tpm_stat_cond(struct tpm_chip *chip, u8 mask,$/;" f signature:(struct tpm_chip *chip, u8 mask, bool check_cancel, bool *canceled)
> wait_for_tpm_stat_cond drivers/char/tpm/tpm_tis_core.c /^static bool wait_for_tpm_stat_cond(struct tpm_chip *chip, u8 mask,$/;" f signature:(struct tpm_chip *chip, u8 mask, bool check_cancel, bool *canceled)
> wait_for_tpm_stat_cond drivers/char/tpm/xen-tpmfront.c /^static bool wait_for_tpm_stat_cond(struct tpm_chip *chip, u8 mask,$/;" f signature:(struct tpm_chip *chip, u8 mask, bool check_cancel, bool *canceled)
> wait_for_training_aux_rd_interval drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c /^static void wait_for_training_aux_rd_interval($/;" f signature:( struct dc_link *link, uint32_t default_wait_in_micro_secs)
> wait_for_unix_gc net/unix/garbage.c /^void wait_for_unix_gc(void)$/;" f signature:(void)
> wait_for_user_access drivers/net/ethernet/ti/davinci_mdio.c /^static inline int wait_for_user_access(struct davinci_mdio_data *data)$/;" f signature:(struct davinci_mdio_data *data)
> wait_for_vfork_done kernel/fork.c /^static int wait_for_vfork_done(struct task_struct *child,$/;" f signature:(struct task_struct *child, struct completion *vfork)
> wait_for_vl_status_clear drivers/infiniband/hw/hfi1/chip.c /^static void wait_for_vl_status_clear(struct hfi1_devdata *dd, u64 mask,$/;" f signature:(struct hfi1_devdata *dd, u64 mask, const char *which)
> wait_for_work drivers/block/drbd/drbd_worker.c /^static void wait_for_work(struct drbd_connection *connection, struct list_head *work_list)$/;" f signature:(struct drbd_connection *connection, struct list_head *work_list)
> wait_for_writer fs/btrfs/tree-log.c /^static void wait_for_writer(struct btrfs_root *root)$/;" f signature:(struct btrfs_root *root)
> wait_for_xmit_empty drivers/tty/serial/lpc32xx_hs.c /^static void wait_for_xmit_empty(struct uart_port *port)$/;" f signature:(struct uart_port *port)
> wait_for_xmit_ready drivers/tty/serial/lpc32xx_hs.c /^static void wait_for_xmit_ready(struct uart_port *port)$/;" f signature:(struct uart_port *port)
> wait_for_xmitr drivers/tty/serial/8250/8250_port.c /^static void wait_for_xmitr(struct uart_8250_port *up, int bits)$/;" f signature:(struct uart_8250_port *up, int bits)
> wait_for_xmitr drivers/tty/serial/bcm63xx_uart.c /^static void wait_for_xmitr(struct uart_port *port)$/;" f signature:(struct uart_port *port)
> wait_for_xmitr drivers/tty/serial/mvebu-uart.c /^static void wait_for_xmitr(struct uart_port *port)$/;" f signature:(struct uart_port *port)
> wait_for_xmitr drivers/tty/serial/omap-serial.c /^static void __maybe_unused wait_for_xmitr(struct uart_omap_port *up)$/;" f signature:(struct uart_omap_port *up)
> wait_for_xmitr drivers/tty/serial/pch_uart.c /^static void wait_for_xmitr(struct eg20t_port *up, int bits)$/;" f signature:(struct eg20t_port *up, int bits)
> wait_for_xmitr drivers/tty/serial/pxa.c /^static void wait_for_xmitr(struct uart_pxa_port *up)$/;" f signature:(struct uart_pxa_port *up)
> wait_for_xmitr drivers/tty/serial/serial_txx9.c /^static void wait_for_xmitr(struct uart_txx9_port *up)$/;" f signature:(struct uart_txx9_port *up)
> wait_for_xmitr drivers/tty/serial/sprd_serial.c /^static void wait_for_xmitr(struct uart_port *port)$/;" f signature:(struct uart_port *port)
> wait_for_xmitr drivers/tty/serial/sunsu.c /^static void wait_for_xmitr(struct uart_sunsu_port *up)$/;" f signature:(struct uart_sunsu_port *up)
> wait_for_xmitr drivers/tty/serial/vr41xx_siu.c /^static void wait_for_xmitr(struct uart_port *port)$/;" f signature:(struct uart_port *port)
> wait_for_xmitr drivers/tty/serial/vt8500_serial.c /^static void wait_for_xmitr(struct uart_port *port)$/;" f signature:(struct uart_port *port)
> wait_func drivers/net/ethernet/mellanox/mlx5/core/cmd.c /^static int wait_func(struct mlx5_core_dev *dev, struct mlx5_cmd_work_ent *ent)$/;" f signature:(struct mlx5_core_dev *dev, struct mlx5_cmd_work_ent *ent)
> wait_fw_init drivers/net/ethernet/mellanox/mlx5/core/main.c /^static int wait_fw_init(struct mlx5_core_dev *dev, u32 max_wait_mili)$/;" f signature:(struct mlx5_core_dev *dev, u32 max_wait_mili)
> wait_generic_request net/ceph/mon_client.c /^static int wait_generic_request(struct ceph_mon_generic_request *req)$/;" f signature:(struct ceph_mon_generic_request *req)
> wait_gpio drivers/tty/synclink_gt.c /^static int wait_gpio(struct slgt_info *info, struct gpio_desc __user *user_gpio)$/;" f signature:(struct slgt_info *info, struct gpio_desc __user *user_gpio)
> wait_grab_pending drivers/staging/media/zoran/zoran_device.c /^wait_grab_pending (struct zoran *zr)$/;" f signature:(struct zoran *zr)
> wait_halmac_event drivers/staging/rtlwifi/halmac/rtl_halmac.c /^static int wait_halmac_event(struct rtl_priv *rtlpriv,$/;" f signature:(struct rtl_priv *rtlpriv, enum halmac_feature_id id)
> wait_handshake sound/pci/echoaudio/echoaudio_dsp.c /^static int wait_handshake(struct echoaudio *chip)$/;" f signature:(struct echoaudio *chip)
> wait_hdi_set drivers/scsi/a100u2w.c /^static u8 wait_hdi_set(struct orc_host * host, u8 * data)$/;" f signature:(struct orc_host * host, u8 * data)
> wait_i2c_busy sound/pci/ice1712/ice1724.c /^static void wait_i2c_busy(struct snd_ice1712 *ice)$/;" f signature:(struct snd_ice1712 *ice)
> wait_i2c_reg drivers/media/pci/dt3155/dt3155.c /^static int wait_i2c_reg(void __iomem *addr)$/;" f signature:(void __iomem *addr)
> wait_i2c_result drivers/media/pci/pt3/pt3_i2c.c /^static int wait_i2c_result(struct pt3_board *pt3, u32 *result, int max_wait)$/;" f signature:(struct pt3_board *pt3, u32 *result, int max_wait)
> wait_iff_congested mm/backing-dev.c /^long wait_iff_congested(int sync, long timeout)$/;" f signature:(int sync, long timeout)
> wait_instruction_complete drivers/misc/sgi-gru/gruhandles.c /^static int wait_instruction_complete(void *h, enum mcs_op opc)$/;" f signature:(void *h, enum mcs_op opc)
> wait_io_done_v2_hw drivers/scsi/hisi_sas/hisi_sas_v2_hw.c /^static bool wait_io_done_v2_hw(struct hisi_hba *hisi_hba, int phy_no)$/;" f signature:(struct hisi_hba *hisi_hba, int phy_no)
> wait_irq drivers/gpu/drm/msm/disp/mdp_kms.c /^static void wait_irq(struct mdp_irq *irq, uint32_t irqstatus)$/;" f signature:(struct mdp_irq *irq, uint32_t irqstatus)
> wait_isoch_resource_delay_after_bus_reset sound/firewire/iso-resources.c /^static int wait_isoch_resource_delay_after_bus_reset(struct fw_card *card)$/;" f signature:(struct fw_card *card)
> wait_istat drivers/net/ethernet/i825xx/82596.c /^static inline int wait_istat(struct net_device *dev, struct i596_private *lp, int delcnt, char *str)$/;" f signature:(struct net_device *dev, struct i596_private *lp, int delcnt, char *str)
> wait_istat drivers/net/ethernet/i825xx/lib82596.c /^static inline int wait_istat(struct net_device *dev, struct i596_dma *dma, int delcnt, char *str)$/;" f signature:(struct net_device *dev, struct i596_dma *dma, int delcnt, char *str)
> wait_key_set fs/select.c /^static inline void wait_key_set(poll_table *wait, unsigned long in,$/;" f signature:(poll_table *wait, unsigned long in, unsigned long out, unsigned long bit, __poll_t ll_flag)
> wait_kmem drivers/infiniband/hw/hfi1/verbs.c /^static int wait_kmem(struct hfi1_ibdev *dev,$/;" f signature:(struct hfi1_ibdev *dev, struct rvt_qp *qp, struct hfi1_pkt_state *ps)
> wait_kmem drivers/infiniband/hw/qib/qib_verbs.c /^static int wait_kmem(struct qib_ibdev *dev, struct rvt_qp *qp)$/;" f signature:(struct qib_ibdev *dev, struct rvt_qp *qp)
> wait_lapic_expire arch/x86/kvm/lapic.c /^void wait_lapic_expire(struct kvm_vcpu *vcpu)$/;" f signature:(struct kvm_vcpu *vcpu)
> wait_link_transfer_active drivers/infiniband/hw/hfi1/chip.c /^static int wait_link_transfer_active(struct hfi1_devdata *dd, int wait_ms)$/;" f signature:(struct hfi1_devdata *dd, int wait_ms)
> wait_log_commit fs/btrfs/tree-log.c /^static void wait_log_commit(struct btrfs_root *root, int transid)$/;" f signature:(struct btrfs_root *root, int transid)
> wait_logical_linkstate drivers/infiniband/hw/hfi1/chip.c /^static int wait_logical_linkstate(struct hfi1_pportdata *ppd, u32 state,$/;" f signature:(struct hfi1_pportdata *ppd, u32 state, int msecs)
> wait_loop drivers/xen/xenbus/xenbus_probe_frontend.c /^static bool wait_loop(unsigned long start, unsigned int max_delay,$/;" f signature:(unsigned long start, unsigned int max_delay, unsigned int *seconds_waited)
> wait_lpc_idle drivers/bus/hisi_lpc.c /^static int wait_lpc_idle(unsigned char *mbase, unsigned int waitcnt)$/;" f signature:(unsigned char *mbase, unsigned int waitcnt)
> wait_mask drivers/scsi/aha1542.c /^static inline bool wait_mask(u16 port, u8 mask, u8 allof, u8 noneof, int timeout)$/;" f signature:(u16 port, u8 mask, u8 allof, u8 noneof, int timeout)
> wait_master_done drivers/i2c/busses/i2c-au1550.c /^static int wait_master_done(struct i2c_au1550_data *adap)$/;" f signature:(struct i2c_au1550_data *adap)
> wait_mgsl_event drivers/tty/synclink_gt.c /^static int wait_mgsl_event(struct slgt_info *info, int __user *mask_ptr)$/;" f signature:(struct slgt_info *info, int __user *mask_ptr)
> wait_mgsl_event drivers/tty/synclinkmp.c /^static int wait_mgsl_event(SLMP_INFO * info, int __user *mask_ptr)$/;" f signature:(SLMP_INFO * info, int __user *mask_ptr)
> wait_msr_change drivers/staging/fwserial/fwserial.c /^static int wait_msr_change(struct fwtty_port *port, unsigned long mask)$/;" f signature:(struct fwtty_port *port, unsigned long mask)
> wait_nack drivers/gpu/drm/ast/ast_dp501.c /^static bool wait_nack(struct ast_private *ast)$/;" f signature:(struct ast_private *ast)
> wait_nvdimm_bus_probe_idle drivers/nvdimm/bus.c /^void wait_nvdimm_bus_probe_idle(struct device *dev)$/;" f signature:(struct device *dev)
> wait_obj_created fs/exofs/exofs.h /^static inline int wait_obj_created(struct exofs_i_info *oi)$/;" f signature:(struct exofs_i_info *oi)
> wait_on_bit include/linux/wait_bit.h /^wait_on_bit(unsigned long *word, int bit, unsigned mode)$/;" f signature:(unsigned long *word, int bit, unsigned mode)
> wait_on_bit_action include/linux/wait_bit.h /^wait_on_bit_action(unsigned long *word, int bit, wait_bit_action_f *action,$/;" f signature:(unsigned long *word, int bit, wait_bit_action_f *action, unsigned mode)
> wait_on_bit_io include/linux/wait_bit.h /^wait_on_bit_io(unsigned long *word, int bit, unsigned mode)$/;" f signature:(unsigned long *word, int bit, unsigned mode)
> wait_on_bit_lock include/linux/wait_bit.h /^wait_on_bit_lock(unsigned long *word, int bit, unsigned mode)$/;" f signature:(unsigned long *word, int bit, unsigned mode)
> wait_on_bit_lock_action include/linux/wait_bit.h /^wait_on_bit_lock_action(unsigned long *word, int bit, wait_bit_action_f *action,$/;" f signature:(unsigned long *word, int bit, wait_bit_action_f *action, unsigned mode)
> wait_on_bit_lock_io include/linux/wait_bit.h /^wait_on_bit_lock_io(unsigned long *word, int bit, unsigned mode)$/;" f signature:(unsigned long *word, int bit, unsigned mode)
> wait_on_bit_timeout include/linux/wait_bit.h /^wait_on_bit_timeout(unsigned long *word, int bit, unsigned mode,$/;" f signature:(unsigned long *word, int bit, unsigned mode, unsigned long timeout)
> wait_on_buffer include/linux/buffer_head.h /^static inline void wait_on_buffer(struct buffer_head *bh)$/;" f signature:(struct buffer_head *bh)
> wait_on_commit fs/nfs/write.c /^static int wait_on_commit(struct nfs_mds_commit_info *cinfo)$/;" f signature:(struct nfs_mds_commit_info *cinfo)
> wait_on_ctr_state drivers/isdn/capi/kcapi.c /^static int wait_on_ctr_state(struct capi_ctr *ctr, unsigned int state)$/;" f signature:(struct capi_ctr *ctr, unsigned int state)
> wait_on_dquot fs/quota/dquot.c /^static void wait_on_dquot(struct dquot *dquot)$/;" f signature:(struct dquot *dquot)
> wait_on_extent_buffer_writeback fs/btrfs/extent_io.c /^void wait_on_extent_buffer_writeback(struct extent_buffer *eb)$/;" f signature:(struct extent_buffer *eb)
> wait_on_inode include/linux/writeback.h /^static inline void wait_on_inode(struct inode *inode)$/;" f signature:(struct inode *inode)
> wait_on_journal fs/gfs2/ops_fstype.c /^static int wait_on_journal(struct gfs2_sbd *sdp)$/;" f signature:(struct gfs2_sbd *sdp)
> wait_on_page_bit mm/filemap.c /^void wait_on_page_bit(struct page *page, int bit_nr)$/;" f signature:(struct page *page, int bit_nr)
> wait_on_page_bit_common mm/filemap.c /^static inline int wait_on_page_bit_common(wait_queue_head_t *q,$/;" f signature:(wait_queue_head_t *q, struct page *page, int bit_nr, int state, enum behavior behavior)
> wait_on_page_bit_killable mm/filemap.c /^int wait_on_page_bit_killable(struct page *page, int bit_nr)$/;" f signature:(struct page *page, int bit_nr)
> wait_on_page_locked include/linux/pagemap.h /^static inline void wait_on_page_locked(struct page *page)$/;" f signature:(struct page *page)
> wait_on_page_locked_killable include/linux/pagemap.h /^static inline int wait_on_page_locked_killable(struct page *page)$/;" f signature:(struct page *page)
> wait_on_page_read mm/filemap.c /^static struct page *wait_on_page_read(struct page *page)$/;" f signature:(struct page *page)
> wait_on_page_writeback include/linux/pagemap.h /^static inline void wait_on_page_writeback(struct page *page)$/;" f signature:(struct page *page)
> wait_on_pending_writer net/tls/tls_main.c /^int wait_on_pending_writer(struct sock *sk, long *timeo)$/;" f signature:(struct sock *sk, long *timeo)
> wait_on_pipe kernel/trace/trace.c /^static int wait_on_pipe(struct trace_iterator *iter, int full)$/;" f signature:(struct trace_iterator *iter, int full)
> wait_on_sem drivers/iommu/amd_iommu.c /^static int wait_on_sem(volatile u64 *sem)$/;" f signature:(volatile u64 *sem)
> wait_on_state fs/btrfs/extent_io.c /^static void wait_on_state(struct extent_io_tree *tree,$/;" f signature:(struct extent_io_tree *tree, struct extent_state *state)
> wait_op_done drivers/mtd/nand/raw/mxc_nand.c /^static int wait_op_done(struct mxc_nand_host *host, int useirq)$/;" f signature:(struct mxc_nand_host *host, int useirq)
> wait_panel_off drivers/gpu/drm/i915/intel_dp.c /^static void wait_panel_off(struct intel_dp *intel_dp)$/;" f signature:(struct intel_dp *intel_dp)
> wait_panel_on drivers/gpu/drm/i915/intel_dp.c /^static void wait_panel_on(struct intel_dp *intel_dp)$/;" f signature:(struct intel_dp *intel_dp)
> wait_panel_power_cycle drivers/gpu/drm/i915/intel_dp.c /^static void wait_panel_power_cycle(struct intel_dp *intel_dp)$/;" f signature:(struct intel_dp *intel_dp)
> wait_panel_status drivers/gpu/drm/i915/intel_dp.c /^static void wait_panel_status(struct intel_dp *intel_dp,$/;" f signature:(struct intel_dp *intel_dp, u32 mask, u32 value)
> wait_pending_extra_info_updates drivers/video/fbdev/omap2/omapfb/dss/apply.c /^static void wait_pending_extra_info_updates(void)$/;" f signature:(void)
> wait_pending_remove fs/dlm/lock.c /^static void wait_pending_remove(struct dlm_rsb *r)$/;" f signature:(struct dlm_rsb *r)
> wait_phy_eeprom_ready drivers/net/usb/sr9700.c /^static int wait_phy_eeprom_ready(struct usbnet *dev, int phy)$/;" f signature:(struct usbnet *dev, int phy)
> wait_phy_ready drivers/net/ethernet/microchip/enc28j60.c /^static int wait_phy_ready(struct enc28j60_net *priv)$/;" f signature:(struct enc28j60_net *priv)
> wait_phys_link_offline_substates drivers/infiniband/hw/hfi1/chip.c /^static int wait_phys_link_offline_substates(struct hfi1_pportdata *ppd,$/;" f signature:(struct hfi1_pportdata *ppd, int msecs)
> wait_phys_link_out_of_offline drivers/infiniband/hw/hfi1/chip.c /^static int wait_phys_link_out_of_offline(struct hfi1_pportdata *ppd,$/;" f signature:(struct hfi1_pportdata *ppd, int msecs)
> wait_physical_linkstate drivers/infiniband/hw/hfi1/chip.c /^static int wait_physical_linkstate(struct hfi1_pportdata *ppd, u32 state,$/;" f signature:(struct hfi1_pportdata *ppd, u32 state, int msecs)
> wait_port_offline drivers/scsi/cxlflash/main.c /^static bool wait_port_offline(__be64 __iomem *fc_regs, u32 delay_us, u32 nretry)$/;" f signature:(__be64 __iomem *fc_regs, u32 delay_us, u32 nretry)
> wait_port_online drivers/scsi/cxlflash/main.c /^static bool wait_port_online(__be64 __iomem *fc_regs, u32 delay_us, u32 nretry)$/;" f signature:(__be64 __iomem *fc_regs, u32 delay_us, u32 nretry)
> wait_port_reset drivers/scsi/isci/port.c /^static void wait_port_reset(struct isci_host *ihost, struct isci_port *iport)$/;" f signature:(struct isci_host *ihost, struct isci_port *iport)
> wait_port_writable drivers/char/virtio_console.c /^static int wait_port_writable(struct port *port, bool nonblock)$/;" f signature:(struct port *port, bool nonblock)
> wait_probe_show drivers/nvdimm/core.c /^static ssize_t wait_probe_show(struct device *dev,$/;" f signature:(struct device *dev, struct device_attribute *attr, char *buf)
> wait_rcu_exp_gp kernel/rcu/tree_exp.h /^static void wait_rcu_exp_gp(struct work_struct *wp)$/;" f signature:(struct work_struct *wp)
> wait_read drivers/hwmon/applesmc.c /^static int wait_read(void)$/;" f signature:(void)
> wait_read_barrier drivers/md/raid1.c /^static void wait_read_barrier(struct r1conf *conf, sector_t sector_nr)$/;" f signature:(struct r1conf *conf, sector_t sector_nr)
> wait_ready_gpio0_bit1 drivers/media/pci/cx88/cx88-blackbird.c /^static int wait_ready_gpio0_bit1(struct cx88_core *core, u32 state)$/;" f signature:(struct cx88_core *core, u32 state)
> wait_recfifo_ready drivers/mtd/nand/raw/sh_flctl.c /^static enum flctl_ecc_res_t wait_recfifo_ready$/;" f signature:(struct sh_flctl *flctl, int sector_number)
> wait_reg_mask drivers/media/dvb-frontends/lgs8gxx.c /^static int wait_reg_mask(struct lgs8gxx_state *priv, u8 reg, u8 mask,$/;" f signature:(struct lgs8gxx_state *priv, u8 reg, u8 mask, u8 val, u8 delay, u8 tries)
> wait_remaining_ms_from_jiffies drivers/gpu/drm/i915/i915_drv.h /^wait_remaining_ms_from_jiffies(unsigned long timestamp_jiffies, int to_wait_ms)$/;" f signature:(unsigned long timestamp_jiffies, int to_wait_ms)
> wait_request_timeout net/ceph/osd_client.c /^static int wait_request_timeout(struct ceph_osd_request *req,$/;" f signature:(struct ceph_osd_request *req, unsigned long timeout)
> wait_requests fs/ceph/mds_client.c /^static void wait_requests(struct ceph_mds_client *mdsc)$/;" f signature:(struct ceph_mds_client *mdsc)
> wait_reserve_ticket fs/btrfs/extent-tree.c /^static int wait_reserve_ticket(struct btrfs_fs_info *fs_info,$/;" f signature:(struct btrfs_fs_info *fs_info, struct btrfs_space_info *space_info, struct reserve_ticket *ticket, u64 orig_bytes)
> wait_reset drivers/i2c/busses/i2c-pnx.c /^static inline int wait_reset(struct i2c_pnx_algo_data *data)$/;" f signature:(struct i2c_pnx_algo_data *data)
> wait_resp drivers/scsi/cxlflash/main.c /^static int wait_resp(struct afu *afu, struct afu_cmd *cmd)$/;" f signature:(struct afu *afu, struct afu_cmd *cmd)
> wait_rfifo_ready drivers/mtd/nand/raw/sh_flctl.c /^static void wait_rfifo_ready(struct sh_flctl *flctl)$/;" f signature:(struct sh_flctl *flctl)
> wait_ring drivers/video/fbdev/intelfb/intelfbhw.c /^static int wait_ring(struct intelfb_info *dinfo, int n)$/;" f signature:(struct intelfb_info *dinfo, int n)
> wait_sample drivers/gpu/drm/msm/msm_perf.c /^static int wait_sample(struct msm_perf_state *perf)$/;" f signature:(struct msm_perf_state *perf)
> wait_sb_inodes fs/fs-writeback.c /^static void wait_sb_inodes(struct super_block *sb)$/;" f signature:(struct super_block *sb)
> wait_scsi_reset_done drivers/scsi/a100u2w.c /^static u8 wait_scsi_reset_done(struct orc_host * host)$/;" f signature:(struct orc_host * host)
> wait_serial_change drivers/staging/greybus/uart.c /^static int wait_serial_change(struct gb_tty *gb_tty, unsigned long arg)$/;" f signature:(struct gb_tty *gb_tty, unsigned long arg)
> wait_serial_change drivers/usb/class/cdc-acm.c /^static int wait_serial_change(struct acm *acm, unsigned long arg)$/;" f signature:(struct acm *acm, unsigned long arg)
> wait_session_msg drivers/media/platform/qcom/venus/hfi.c /^static int wait_session_msg(struct venus_inst *inst)$/;" f signature:(struct venus_inst *inst)
> wait_skb_queue_empty drivers/net/usb/usbnet.c /^static void wait_skb_queue_empty(struct sk_buff_head *q)$/;" f signature:(struct sk_buff_head *q)
> wait_startup drivers/char/tpm/tpm_tis_core.c /^static int wait_startup(struct tpm_chip *chip, int l)$/;" f signature:(struct tpm_chip *chip, int l)
> wait_status drivers/gpu/drm/omapdrm/omap_dmm_tiler.c /^static int wait_status(struct refill_engine *engine, u32 wait_mask)$/;" f signature:(struct refill_engine *engine, u32 wait_mask)
> wait_status fs/dlm/recover.c /^static int wait_status(struct dlm_ls *ls, uint32_t status)$/;" f signature:(struct dlm_ls *ls, uint32_t status)
> wait_status_0 drivers/media/usb/gspca/spca1528.c /^static void wait_status_0(struct gspca_dev *gspca_dev)$/;" f signature:(struct gspca_dev *gspca_dev)
> wait_status_1 drivers/media/usb/gspca/spca1528.c /^static void wait_status_1(struct gspca_dev *gspca_dev)$/;" f signature:(struct gspca_dev *gspca_dev)
> wait_status_all fs/dlm/recover.c /^static int wait_status_all(struct dlm_ls *ls, uint32_t wait_status,$/;" f signature:(struct dlm_ls *ls, uint32_t wait_status, int save_slots)
> wait_status_low fs/dlm/recover.c /^static int wait_status_low(struct dlm_ls *ls, uint32_t wait_status,$/;" f signature:(struct dlm_ls *ls, uint32_t wait_status, uint32_t status_flags)
> wait_task_continued kernel/exit.c /^static int wait_task_continued(struct wait_opts *wo, struct task_struct *p)$/;" f signature:(struct wait_opts *wo, struct task_struct *p)
> wait_task_inactive include/linux/sched.h /^static inline unsigned long wait_task_inactive(struct task_struct *p, long match_state)$/;" f signature:(struct task_struct *p, long match_state)
> wait_task_inactive kernel/sched/core.c /^unsigned long wait_task_inactive(struct task_struct *p, long match_state)$/;" f signature:(struct task_struct *p, long match_state)
> wait_task_stopped kernel/exit.c /^static int wait_task_stopped(struct wait_opts *wo,$/;" f signature:(struct wait_opts *wo, int ptrace, struct task_struct *p)
> wait_task_zombie kernel/exit.c /^static int wait_task_zombie(struct wait_opts *wo, struct task_struct *p)$/;" f signature:(struct wait_opts *wo, struct task_struct *p)
> wait_tb_buffers_until_unlocked fs/reiserfs/fix_node.c /^static int wait_tb_buffers_until_unlocked(struct tree_balance *tb)$/;" f signature:(struct tree_balance *tb)
> wait_til_done drivers/block/floppy.c /^static int wait_til_done(void (*handler)(void), bool interruptible)$/;" f signature:(void (*handler)(void), bool interruptible)
> wait_til_ready drivers/block/floppy.c /^static int wait_til_ready(void)$/;" f signature:(void)
> wait_till_cmd_acked sound/pci/cs5535audio/cs5535audio.c /^static void wait_till_cmd_acked(struct cs5535audio *cs5535au, unsigned long timeout)$/;" f signature:(struct cs5535audio *cs5535au, unsigned long timeout)
> wait_till_fw_empty drivers/scsi/megaraid/megaraid_mbox.c /^wait_till_fw_empty(adapter_t *adapter)$/;" f signature:(adapter_t *adapter)
> wait_timeout drivers/gpu/drm/i915/intel_breadcrumbs.c /^static unsigned long wait_timeout(void)$/;" f signature:(void)
> wait_timeout drivers/i2c/busses/i2c-pnx.c /^static inline int wait_timeout(struct i2c_pnx_algo_data *data)$/;" f signature:(struct i2c_pnx_algo_data *data)
> wait_timeout drivers/net/appletalk/ltpc.c /^static int wait_timeout(struct net_device *dev, int c)$/;" f signature:(struct net_device *dev, int c)
> wait_to_die kernel/trace/ring_buffer_benchmark.c /^static void wait_to_die(void)$/;" f signature:(void)
> wait_transaction_complete drivers/acpi/sbshc.c /^static int wait_transaction_complete(struct acpi_smb_hc *hc, int timeout)$/;" f signature:(struct acpi_smb_hc *hc, int timeout)
> wait_transaction_locked fs/jbd2/transaction.c /^static void wait_transaction_locked(journal_t *journal)$/;" f signature:(journal_t *journal)
> wait_transaction_switching fs/jbd2/transaction.c /^static void wait_transaction_switching(journal_t *journal)$/;" f signature:(journal_t *journal)
> wait_tulip drivers/scsi/initio.c /^static int wait_tulip(struct initio_host * host)$/;" f signature:(struct initio_host * host)
> wait_unsafe_requests fs/ceph/mds_client.c /^static void wait_unsafe_requests(struct ceph_mds_client *mdsc, u64 want_tid)$/;" f signature:(struct ceph_mds_client *mdsc, u64 want_tid)
> wait_until_divider_stable drivers/clk/samsung/clk-cpu.c /^static void wait_until_divider_stable(void __iomem *div_reg, unsigned long mask)$/;" f signature:(void __iomem *div_reg, unsigned long mask)
> wait_until_done_or_force_detached drivers/block/drbd/drbd_actlog.c /^void wait_until_done_or_force_detached(struct drbd_device *device, struct drbd_backing_dev *bdev,$/;" f signature:(struct drbd_device *device, struct drbd_backing_dev *bdev, unsigned int *done)
> wait_until_mux_stable drivers/clk/samsung/clk-cpu.c /^static void wait_until_mux_stable(void __iomem *mux_reg, u32 mux_pos,$/;" f signature:(void __iomem *mux_reg, u32 mux_pos, unsigned long mux_value)
> wait_until_not_busy drivers/fpga/machxo2-spi.c /^static int wait_until_not_busy(struct spi_device *spi)$/;" f signature:(struct spi_device *spi)
> wait_until_running drivers/gpu/drm/i915/selftests/intel_hangcheck.c /^static bool wait_until_running(struct hang *h, struct i915_request *rq)$/;" f signature:(struct hang *h, struct i915_request *rq)
> wait_until_sent drivers/tty/synclink_gt.c /^static void wait_until_sent(struct tty_struct *tty, int timeout)$/;" f signature:(struct tty_struct *tty, int timeout)
> wait_until_sent drivers/tty/synclinkmp.c /^static void wait_until_sent(struct tty_struct *tty, int timeout)$/;" f signature:(struct tty_struct *tty, int timeout)
> wait_uwire_csr_flag drivers/spi/spi-omap-uwire.c /^static int wait_uwire_csr_flag(u16 mask, u16 val, int might_not_catch)$/;" f signature:(u16 mask, u16 val, int might_not_catch)
> wait_vdqcr_start drivers/soc/fsl/qbman/qman.c /^static int wait_vdqcr_start(struct qman_portal **p, struct qman_fq *fq,$/;" f signature:(struct qman_portal **p, struct qman_fq *fq, u32 vdqcr, u32 flags)
> wait_vital drivers/net/ethernet/mellanox/mlx5/core/main.c /^static int wait_vital(struct pci_dev *pdev)$/;" f signature:(struct pci_dev *pdev)
> wait_warn drivers/mtd/nand/onenand/omap2.c /^static void wait_warn(char *msg, int state, unsigned int ctrl,$/;" f signature:(char *msg, int state, unsigned int ctrl, unsigned int intr)
> wait_wecfifo_ready drivers/mtd/nand/raw/sh_flctl.c /^static void wait_wecfifo_ready(struct sh_flctl *flctl)$/;" f signature:(struct sh_flctl *flctl)
> wait_wfifo_ready drivers/mtd/nand/raw/sh_flctl.c /^static void wait_wfifo_ready(struct sh_flctl *flctl)$/;" f signature:(struct sh_flctl *flctl)
> wait_while_offlining mm/ksm.c /^static void wait_while_offlining(void)$/;" f signature:(void)
> wait_woken kernel/sched/wait.c /^long wait_woken(struct wait_queue_entry *wq_entry, unsigned mode, long timeout)$/;" f signature:(struct wait_queue_entry *wq_entry, unsigned mode, long timeout)
> wait_xfer_done drivers/i2c/busses/i2c-au1550.c /^static int wait_xfer_done(struct i2c_au1550_data *adap)$/;" f signature:(struct i2c_au1550_data *adap)
> waitbusy drivers/net/wireless/cisco/airo.c /^static int waitbusy (struct airo_info *ai) {$/;" f signature:(struct airo_info *ai)
> waitdebi drivers/media/pci/ttpci/av7110_hw.c /^static int waitdebi(struct av7110 *av7110, int adr, int state)$/;" f signature:(struct av7110 *av7110, int adr, int state)
> waiter_needs_recovery fs/dlm/lock.c /^static int waiter_needs_recovery(struct dlm_ls *ls, struct dlm_lkb *lkb,$/;" f signature:(struct dlm_ls *ls, struct dlm_lkb *lkb, int dir_nodeid)
> waiter_release drivers/gpu/host1x/intr.c /^static void waiter_release(struct kref *kref)$/;" f signature:(struct kref *kref)
> waiters_read fs/dlm/debug_fs.c /^static ssize_t waiters_read(struct file *file, char __user *userbuf,$/;" f signature:(struct file *file, char __user *userbuf, size_t count, loff_t *ppos)
> waitforCEC drivers/isdn/hardware/mISDN/mISDNipac.c /^waitforCEC(struct hscx_hw *hx)$/;" f signature:(struct hscx_hw *hx)
> waitforCEC drivers/isdn/hisax/hscx_irq.c /^waitforCEC(struct IsdnCardState *cs, int hscx)$/;" f signature:(struct IsdnCardState *cs, int hscx)
> waitforCEC drivers/isdn/hisax/jade_irq.c /^waitforCEC(struct IsdnCardState *cs, int jade, int reg)$/;" f signature:(struct IsdnCardState *cs, int jade, int reg)
> waitforHIA drivers/isdn/hardware/mISDN/mISDNisar.c /^waitforHIA(struct isar_hw *isar, int timeout)$/;" f signature:(struct isar_hw *isar, int timeout)
> waitforHIA drivers/isdn/hisax/isar.c /^waitforHIA(struct IsdnCardState *cs, int timeout)$/;" f signature:(struct IsdnCardState *cs, int timeout)
> waitforXFW drivers/isdn/hardware/mISDN/mISDNipac.c /^waitforXFW(struct hscx_hw *hx)$/;" f signature:(struct hscx_hw *hx)
> waitforXFW drivers/isdn/hisax/hscx_irq.c /^waitforXFW(struct IsdnCardState *cs, int hscx)$/;" f signature:(struct IsdnCardState *cs, int hscx)
> waitforXFW drivers/isdn/hisax/jade_irq.c /^waitforXFW(struct IsdnCardState *cs, int jade)$/;" f signature:(struct IsdnCardState *cs, int jade)
> waitfor_idle drivers/atm/idt77252.c /^waitfor_idle(struct idt77252_dev *card)$/;" f signature:(struct idt77252_dev *card)
> waiting_process_next drivers/scsi/dc395x.c /^static void waiting_process_next(struct AdapterCtlBlk *acb)$/;" f signature:(struct AdapterCtlBlk *acb)
> waiting_set_timer drivers/scsi/dc395x.c /^static void waiting_set_timer(struct AdapterCtlBlk *acb, unsigned long to)$/;" f signature:(struct AdapterCtlBlk *acb, unsigned long to)
> waiting_timeout drivers/scsi/dc395x.c /^static void waiting_timeout(struct timer_list *t)$/;" f signature:(struct timer_list *t)
> waitqueue_active include/linux/wait.h /^static inline int waitqueue_active(struct wait_queue_head *wq_head)$/;" f signature:(struct wait_queue_head *wq_head)
> waitrecmsg drivers/isdn/hisax/isar.c /^waitrecmsg(struct IsdnCardState *cs, u_char *len,$/;" f signature:(struct IsdnCardState *cs, u_char *len, u_char *msg, int maxdelay)
>
>
>
>
> > > Cc: Julia Lawall <[email protected]>
> > > Cc: Logan Gunthorpe <[email protected]>
> > > Cc: Sebastian Andrzej Siewior <[email protected]>
> > > Cc: Bjorn Helgaas <[email protected]>
> > > Signed-off-by: Kirill Smelkov <[email protected]>
> > > ---
> > > scripts/coccinelle/api/stream_open.cocci | 8 ++++----
> > > 1 file changed, 4 insertions(+), 4 deletions(-)
> > >
> > > diff --git a/scripts/coccinelle/api/stream_open.cocci b/scripts/coccinelle/api/stream_open.cocci
> > > index 350145da7669..12ce18fa6b74 100644
> > > --- a/scripts/coccinelle/api/stream_open.cocci
> > > +++ b/scripts/coccinelle/api/stream_open.cocci
> > > @@ -35,11 +35,11 @@ type loff_t;
> > > // a function that blocks
> > > @ blocks @
> > > identifier block_f;
> > > -identifier wait_event =~ "^wait_event_.*";
> > > +identifier wait =~ "^wait_.*";
> > > @@
> > > block_f(...) {
> > > ... when exists
> > > - wait_event(...)
> > > + wait(...)
> > > ... when exists
> > > }
> > >
> > > @@ -49,12 +49,12 @@ identifier wait_event =~ "^wait_event_.*";
> > > // XXX currently reader_blocks supports only direct and 1-level indirect cases.
> > > @ reader_blocks_direct @
> > > identifier stream_reader.readstream;
> > > -identifier wait_event =~ "^wait_event_.*";
> > > +identifier wait =~ "^wait_.*";
> > > @@
> > > readstream(...)
> > > {
> > > ... when exists
> > > - wait_event(...)
> > > + wait(...)
> > > ... when exists
> > > }
> > >
> > > --
> > > 2.20.1
> > >
>
On Sun, Jun 23, 2019 at 10:02:17AM +0200, Julia Lawall wrote:
> On Sun, 23 Jun 2019, Kirill Smelkov wrote:
> > On Sun, Jun 23, 2019 at 09:35:17AM +0200, Julia Lawall wrote:
> > > On Sun, 23 Jun 2019, Kirill Smelkov wrote:
> > >
> > > > Previously steam_open.cocci was treating only wait_event_.* - e.g.
> > > > wait_event_interruptible - as a blocking operation. However e.g.
> > > > wait_for_completion_interruptible is also blocking, and so from this
> > > > point of view it would be more logical to treat all wait_.* as a
> > > > blocking point.
> > > >
> > > > The logic of this change actually came up for real when
> > > > drivers/pci/switch/switchtec.c changed from using
> > > > wait_event_interruptible to wait_for_completion_interruptible:
> > > >
> > > > https://lore.kernel.org/linux-pci/[email protected]/
> > > > https://lore.kernel.org/linux-pci/[email protected]/
> > > > https://lore.kernel.org/linux-pci/[email protected]/
> > > >
> > > > For a driver that uses nonseekable_open with read/write having stream
> > > > semantic and read also calling e.g. wait_for_completion_interruptible,
> > > > running stream_open.cocci before this patch would produce:
> > > >
> > > > WARNING: <driver>_fops: .read() and .write() have stream semantic; safe to change nonseekable_open -> stream_open.
> > > >
> > > > while after this patch it will report:
> > > >
> > > > ERROR: <driver>_fops: .read() can deadlock .write(); change nonseekable_open -> stream_open to fix.
> > >
> > > Are you really sure that every word that starts with wait_ in the Linux
> > > kernel has the property you want? How many of them are there? Would it
> > > be reasonable to put the names in the semantic patch explicitly?
> >
> > We are talking about function calls or macros here only. I think that
> > by default every "wait.*()" has blocking semantic, and if there are
> > something that does not block, it should be instead white-listed with
> > the default still being treated as "all wait.*() blocks".
> >
> > Here are the list of wait functions & macros (if I read tags format
> > correctly). They were generated with `grep -w d tags |grep '^wait'` and
> > `grep -w f tags |grep '^wait'`. Offhand they all seem to be of blocking
> > kind to me.
>
> OK, thanks for the list.
>
> julia
On Sun, Jun 23, 2019 at 10:01:52AM +0200, Julia Lawall wrote:
> Acked-by: Julia Lawall <[email protected]>
Julia, you are welcome. Thanks for ACK.
Kirill
On Sun, Jun 23, 2019 at 4:29 PM Kirill Smelkov <[email protected]> wrote:
>
> Previously steam_open.cocci was treating only wait_event_.* - e.g.
> wait_event_interruptible - as a blocking operation. However e.g.
> wait_for_completion_interruptible is also blocking, and so from this
> point of view it would be more logical to treat all wait_.* as a
> blocking point.
>
> The logic of this change actually came up for real when
> drivers/pci/switch/switchtec.c changed from using
> wait_event_interruptible to wait_for_completion_interruptible:
>
> https://lore.kernel.org/linux-pci/[email protected]/
> https://lore.kernel.org/linux-pci/[email protected]/
> https://lore.kernel.org/linux-pci/[email protected]/
>
> For a driver that uses nonseekable_open with read/write having stream
> semantic and read also calling e.g. wait_for_completion_interruptible,
> running stream_open.cocci before this patch would produce:
>
> WARNING: <driver>_fops: .read() and .write() have stream semantic; safe to change nonseekable_open -> stream_open.
>
> while after this patch it will report:
>
> ERROR: <driver>_fops: .read() can deadlock .write(); change nonseekable_open -> stream_open to fix.
>
> Cc: Julia Lawall <[email protected]>
> Cc: Logan Gunthorpe <[email protected]>
> Cc: Sebastian Andrzej Siewior <[email protected]>
> Cc: Bjorn Helgaas <[email protected]>
> Signed-off-by: Kirill Smelkov <[email protected]>
> ---
Applied to linux-kbuild. Thanks.
> scripts/coccinelle/api/stream_open.cocci | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/scripts/coccinelle/api/stream_open.cocci b/scripts/coccinelle/api/stream_open.cocci
> index 350145da7669..12ce18fa6b74 100644
> --- a/scripts/coccinelle/api/stream_open.cocci
> +++ b/scripts/coccinelle/api/stream_open.cocci
> @@ -35,11 +35,11 @@ type loff_t;
> // a function that blocks
> @ blocks @
> identifier block_f;
> -identifier wait_event =~ "^wait_event_.*";
> +identifier wait =~ "^wait_.*";
> @@
> block_f(...) {
> ... when exists
> - wait_event(...)
> + wait(...)
> ... when exists
> }
>
> @@ -49,12 +49,12 @@ identifier wait_event =~ "^wait_event_.*";
> // XXX currently reader_blocks supports only direct and 1-level indirect cases.
> @ reader_blocks_direct @
> identifier stream_reader.readstream;
> -identifier wait_event =~ "^wait_event_.*";
> +identifier wait =~ "^wait_.*";
> @@
> readstream(...)
> {
> ... when exists
> - wait_event(...)
> + wait(...)
> ... when exists
> }
>
> --
> 2.20.1
> _______________________________________________
> Cocci mailing list
> [email protected]
> https://systeme.lip6.fr/mailman/listinfo/cocci
--
Best Regards
Masahiro Yamada
On Sat, Jul 06, 2019 at 10:17:18PM +0900, Masahiro Yamada wrote:
> On Sun, Jun 23, 2019 at 4:29 PM Kirill Smelkov <[email protected]> wrote:
> >
> > Previously steam_open.cocci was treating only wait_event_.* - e.g.
> > wait_event_interruptible - as a blocking operation. However e.g.
> > wait_for_completion_interruptible is also blocking, and so from this
> > point of view it would be more logical to treat all wait_.* as a
> > blocking point.
> >
> > The logic of this change actually came up for real when
> > drivers/pci/switch/switchtec.c changed from using
> > wait_event_interruptible to wait_for_completion_interruptible:
> >
> > https://lore.kernel.org/linux-pci/[email protected]/
> > https://lore.kernel.org/linux-pci/[email protected]/
> > https://lore.kernel.org/linux-pci/[email protected]/
> >
> > For a driver that uses nonseekable_open with read/write having stream
> > semantic and read also calling e.g. wait_for_completion_interruptible,
> > running stream_open.cocci before this patch would produce:
> >
> > WARNING: <driver>_fops: .read() and .write() have stream semantic; safe to change nonseekable_open -> stream_open.
> >
> > while after this patch it will report:
> >
> > ERROR: <driver>_fops: .read() can deadlock .write(); change nonseekable_open -> stream_open to fix.
> >
> > Cc: Julia Lawall <[email protected]>
> > Cc: Logan Gunthorpe <[email protected]>
> > Cc: Sebastian Andrzej Siewior <[email protected]>
> > Cc: Bjorn Helgaas <[email protected]>
> > Signed-off-by: Kirill Smelkov <[email protected]>
> > ---
>
> Applied to linux-kbuild. Thanks.
Thanks.
> > scripts/coccinelle/api/stream_open.cocci | 8 ++++----
> > 1 file changed, 4 insertions(+), 4 deletions(-)
> >
> > diff --git a/scripts/coccinelle/api/stream_open.cocci b/scripts/coccinelle/api/stream_open.cocci
> > index 350145da7669..12ce18fa6b74 100644
> > --- a/scripts/coccinelle/api/stream_open.cocci
> > +++ b/scripts/coccinelle/api/stream_open.cocci
> > @@ -35,11 +35,11 @@ type loff_t;
> > // a function that blocks
> > @ blocks @
> > identifier block_f;
> > -identifier wait_event =~ "^wait_event_.*";
> > +identifier wait =~ "^wait_.*";
> > @@
> > block_f(...) {
> > ... when exists
> > - wait_event(...)
> > + wait(...)
> > ... when exists
> > }
> >
> > @@ -49,12 +49,12 @@ identifier wait_event =~ "^wait_event_.*";
> > // XXX currently reader_blocks supports only direct and 1-level indirect cases.
> > @ reader_blocks_direct @
> > identifier stream_reader.readstream;
> > -identifier wait_event =~ "^wait_event_.*";
> > +identifier wait =~ "^wait_.*";
> > @@
> > readstream(...)
> > {
> > ... when exists
> > - wait_event(...)
> > + wait(...)
> > ... when exists
> > }
> >
> > --
> > 2.20.1
> > _______________________________________________
> > Cocci mailing list
> > [email protected]
> > https://systeme.lip6.fr/mailman/listinfo/cocci
>
>
>
> --
> Best Regards
> Masahiro Yamada