#!/usr/bin/perl -w # # Clean a patch file -- or directory of patch files -- of stealth whitespace. # WARNING: this can be a highly destructive operation. Use with caution. # use bytes; use File::Basename; # Default options $max_width = 79; # Clean up space-tab sequences, either by removing spaces or # replacing them with tabs. sub clean_space_tabs($) { no bytes; # Tab alignment depends on characters my($li) = @_; my($lo) = ''; my $pos = 0; my $nsp = 0; my($i, $c); for ($i = 0; $i < length($li); $i++) { $c = substr($li, $i, 1); if ($c eq "\t") { my $npos = ($pos+$nsp+8) & ~7; my $ntab = ($npos >> 3) - ($pos >> 3); $lo .= "\t" x $ntab; $pos = $npos; $nsp = 0; } elsif ($c eq "\n" || $c eq "\r") { $lo .= " " x $nsp; $pos += $nsp; $nsp = 0; $lo .= $c; $pos = 0; } elsif ($c eq " ") { $nsp++; } else { $lo .= " " x $nsp; $pos += $nsp; $nsp = 0; $lo .= $c; $pos++; } } $lo .= " " x $nsp; return $lo; } # Compute the visual width of a string sub strwidth($) { no bytes; # Tab alignment depends on characters my($li) = @_; my($c, $i); my $pos = 0; my $mlen = 0; for ($i = 0; $i < length($li); $i++) { $c = substr($li,$i,1); if ($c eq "\t") { $pos = ($pos+8) & ~7; } elsif ($c eq "\n") { $mlen = $pos if ($pos > $mlen); $pos = 0; } else { $pos++; } } $mlen = $pos if ($pos > $mlen); return $mlen; } $name = basename($0); @files = (); while (defined($a = shift(@ARGV))) { if ($a =~ /^-/) { if ($a eq '-width' || $a eq '-w') { $max_width = shift(@ARGV)+0; } else { print STDERR "Usage: $name [-width #] files...\n"; exit 1; } } else { push(@files, $a); } } foreach $f ( @files ) { print STDERR "$name: $f\n"; if (! -f $f) { print STDERR "$f: not a file\n"; next; } if (!open(FILE, '+<', $f)) { print STDERR "$name: Cannot open file: $f: $!\n"; next; } binmode FILE; # First, verify that it is not a binary file; consider any file # with a zero byte to be a binary file. Is there any better, or # additional, heuristic that should be applied? $is_binary = 0; while (read(FILE, $data, 65536) > 0) { if ($data =~ /\0/) { $is_binary = 1; last; } } if ($is_binary) { print STDERR "$name: $f: binary file\n"; next; } seek(FILE, 0, 0); $in_bytes = 0; $out_bytes = 0; $lineno = 0; @lines = (); $in_hunk = 0; $err = 0; while ( defined($line = ) ) { $lineno++; $in_bytes += length($line); if (!$in_hunk) { if ($line =~ /^\@\@\s+\-([0-9]+),([0-9]+)\s+\+([0-9]+),([0-9]+)\s\@\@/) { $minus_lines = $2; $plus_lines = $4; if ($minus_lines || $plus_lines) { $in_hunk = 1; @hunk_lines = ($line); } } else { push(@lines, $line); $out_bytes += length($line); } } else { # We're in a hunk if ($line =~ /^\+/) { $plus_lines--; $text = substr($line, 1); $text =~ s/[ \t\r]*$//; # Remove trailing spaces $text = clean_space_tabs($text); $l_width = strwidth($text); if ($max_width && $l_width > $max_width) { print STDERR "$f:$lineno: adds line exceeds $max_width ", "characters ($l_width)\n"; } push(@hunk_lines, '+'.$text); } elsif ($line =~ /^\-/) { $minus_lines--; push(@hunk_lines, $line); } elsif ($line =~ /^ /) { $plus_lines--; $minus_lines--; push(@hunk_lines, $line); } else { print STDERR "$name: $f: malformed patch\n"; $err = 1; last; } if ($plus_lines < 0 || $minus_lines < 0) { print STDERR "$name: $f: malformed patch\n"; $err = 1; last; } elsif ($plus_lines == 0 && $minus_lines == 0) { # End of a hunk. Process this hunk. my $i; my $l; my @h = (); my $adj = 0; my $done = 0; for ($i = scalar(@hunk_lines)-1; $i > 0; $i--) { $l = $hunk_lines[$i]; if (!$done && $l eq "+\n") { $adj++; # Skip this line } elsif ($l =~ /^[ +]/) { $done = 1; unshift(@h, $l); } else { unshift(@h, $l); } } $l = $hunk_lines[0]; # Hunk header undef @hunk_lines; # Free memory if ($adj) { die unless ($l =~ /^\@\@\s+\-([0-9]+),([0-9]+)\s+\+([0-9]+),([0-9]+)\s\@\@(.*)$/); my $mstart = $1; my $mlin = $2; my $pstart = $3; my $plin = $4; my $tail = $5; # doesn't include the final newline $l = sprintf("@@ -%d,%d +%d,%d @@%s\n", $mstart, $mlin, $pstart, $plin-$adj, $tail); } unshift(@h, $l); # Transfer to the output array foreach $l (@h) { $out_bytes += length($l); push(@lines, $l); } $in_hunk = 0; } } } if ($in_hunk) { print STDERR "$name: $f: malformed patch\n"; $err = 1; } if (!$err) { if ($in_bytes != $out_bytes) { # Only write to the file if changed seek(FILE, 0, 0); print FILE @lines; if ( !defined($where = tell(FILE)) || !truncate(FILE, $where) ) { die "$name: Failed to truncate modified file: $f: $!\n"; } } } close(FILE); } 936190e86a16ee8c'>08d85f3ea99f1eeafc4e8507936190e86a16ee8c (patch) tree410bb1acd0cd7dcfaad37ae7b63ff243b7fa4bee /include/net/bluetooth/mgmt.h parent566cf877a1fcb6d6dc0126b076aad062054c2637 (diff)
irqdomain: Avoid activating interrupts more than once
Since commit f3b0946d629c ("genirq/msi: Make sure PCI MSIs are activated early"), we can end-up activating a PCI/MSI twice (once at allocation time, and once at startup time). This is normally of no consequences, except that there is some HW out there that may misbehave if activate is used more than once (the GICv3 ITS, for example, uses the activate callback to issue the MAPVI command, and the architecture spec says that "If there is an existing mapping for the EventID-DeviceID combination, behavior is UNPREDICTABLE"). While this could be worked around in each individual driver, it may make more sense to tackle the issue at the core level. In order to avoid getting in that situation, let's have a per-interrupt flag to remember if we have already activated that interrupt or not. Fixes: f3b0946d629c ("genirq/msi: Make sure PCI MSIs are activated early") Reported-and-tested-by: Andre Przywara <andre.przywara@arm.com> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> Cc: stable@vger.kernel.org Link: http://lkml.kernel.org/r/1484668848-24361-1-git-send-email-marc.zyngier@arm.com Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'include/net/bluetooth/mgmt.h')